搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
运维做开发
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
隐语开源社区「2022年度开源报告」
2
Github Copilot 的使用方法和快捷键_github copilot使用
3
UniVue一个基于MVVM设计的Unity高效率UI框架_unity mvvm的ui
4
词云(附带操作实例)
5
上海计算机考研避雷,25考研慎报
6
2024年GitHub上最流行前25大Python开源项目,你收藏了吗?_github上python专门用于分割石头和沙粒的事物_python学习项目 github
7
android 是Application类先运行还是AndroidManifest.xml中action先运行?Application类先运行
8
【华为OD机试B卷】服务器广播、需要广播的服务器数量(C++/Java/Python)
9
【LeetCode刷题(简单程度)】面试题 02.02. 返回倒数第 k 个节点_leetcode刷到什么程度
10
【Rust】日志库log_rust log
当前位置:
article
> 正文
图像处理常用算法GPU实现四:基于中值滤波的二值图像平滑_图像二值化平滑
作者:运维做开发 | 2024-06-26 09:50:44
赞
踩
图像二值化平滑
[cpp]
view plain
copy
/********************************
* Author: rabbit729
* E-mail: wlq_729@163.com
* Date: 2012-10-08
* Description: 图像的平滑
********************************/
#include <d3dx9.h>
//-----------------------------------------------------------------------------
// Desc: 全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL;
//Direct3D对象
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
//Direct3D设备对象
LPDIRECT3DTEXTURE9 g_pTextureScreen = NULL;
//待处理图片
ID3DXEffect* g_pEffect = NULL;
//效果指针
//常量句柄
D3DXHANDLE hTechScreen = NULL;
//Effect句柄
D3DXHANDLE hTexScreen = NULL;
//纹理句柄
D3DXHANDLE hViewPortWidthInv = NULL;
//视口宽倒数句柄
D3DXHANDLE hViewPortHeightInv = NULL;
//视口高倒数句柄
LPDIRECT3DVERTEXBUFFER9 g_pScreenSpaceQuad = NULL;
//背板VB
const
int
WIDTH = 465;
const
int
HEIGHT = 669;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
struct
Vertex
{
Vertex(){}
Vertex(
float
x,
float
y,
float
z,
float
w)
{
_x = x; _y = y; _z = z; _w = w;
}
float
_x, _y, _z, _w;
static
const
DWORD
FVF;
};
const
DWORD
Vertex::FVF = D3DFVF_XYZW;
//-----------------------------------------------------------------------------
// Desc: 设置世界矩阵
//-----------------------------------------------------------------------------
VOID
SetWorldMatrix()
{
//创建并设置世界矩阵
D3DXMATRIXA16 matWorld, matRotateX, matRotateY;
D3DXMATRIXA16 matScale;
D3DXMatrixIdentity(&matScale);
matScale._11 = matScale._22 = matScale._33 = 0.5f;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixIdentity(&matRotateX);
D3DXMatrixIdentity(&matRotateY);
D3DXMatrixRotationX( &matRotateX, D3DX_PI / 3.0 );
D3DXMatrixRotationY( &matRotateY, -D3DX_PI / 8.0 );
D3DXMatrixMultiply(&matWorld, &matRotateX, &matRotateY);
D3DXMatrixMultiply(&matWorld, &matScale, &matWorld);
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
}
//-----------------------------------------------------------------------------
// Desc: 设置观察矩阵和投影矩阵
//-----------------------------------------------------------------------------
VOID
SetViewAndProjMatrix()
{
//创建并设置观察矩阵
D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-250.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
//创建并设置投影矩阵
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}
//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT
InitD3D(
HWND
hWnd )
{
//创建Direct3D对象, 该对象用于创建Direct3D设备对象
if
( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return
E_FAIL;
//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp,
sizeof
(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
//创建Direct3D设备对象
if
( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return
E_FAIL;
}
//创建Effect
ID3DXBuffer* errBuffer = NULL;
if
(FAILED(D3DXCreateEffectFromFile(g_pd3dDevice, L
"zhognzhilvbo.fx"
, NULL, NULL, D3DXSHADER_DEBUG | D3DXSHADER_SKIPOPTIMIZATION, NULL, &g_pEffect, &errBuffer)))
{
if
(errBuffer)
{
char
* pErr = (
char
*)errBuffer->GetBufferPointer();
errBuffer->Release();
}
return
E_FAIL;
}
//获取常量句柄
hTechScreen = g_pEffect->GetTechniqueByName(
"Screen"
);
hTexScreen = g_pEffect->GetParameterByName(0,
"TexScreen"
);
hViewPortWidthInv = g_pEffect->GetParameterByName(0,
"viewport_inv_width"
);
hViewPortHeightInv = g_pEffect->GetParameterByName(0,
"viewport_inv_height"
);
//设置环境光
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
//设置观察矩阵和投影矩阵
SetViewAndProjMatrix();
return
S_OK;
}
//-----------------------------------------------------------------------------
// Desc: 创建场景图形
//-----------------------------------------------------------------------------
HRESULT
InitGeometry()
{
// 创建屏幕板
g_pd3dDevice->CreateVertexBuffer(
6 *
sizeof
(Vertex),
D3DUSAGE_WRITEONLY,
Vertex::FVF,
D3DPOOL_MANAGED,
&g_pScreenSpaceQuad,
0);
Vertex* vertices;
g_pScreenSpaceQuad->Lock(0, 0, (
void
**)&vertices, 0);
vertices[0] = Vertex(-1.0f, 1.0f, 0.5f, 1.0f);
vertices[1] = Vertex(1.0f, 1.0f, 0.5f, 1.0f);
vertices[2] = Vertex( 1.0f, -1.0f, 0.5f, 1.0f);
vertices[3] = Vertex(-1.0f, 1.0f, 0.5f, 1.0f);
vertices[4] = Vertex( 1.0f, -1.0f, 0.5f, 1.0f);
vertices[5] = Vertex( -1.0f, -1.0f, 0.5f, 1.0f);
g_pScreenSpaceQuad->Unlock();
//加载纹理
HRESULT
hr = D3DXCreateTextureFromFile(g_pd3dDevice, L
"meinv.jpg"
, &g_pTextureScreen);
if
(FAILED(hr))
{
return
E_FAIL;
}
return
S_OK;
}
//-----------------------------------------------------------------------------
// Desc: 释放创建的对象
//-----------------------------------------------------------------------------
VOID
Cleanup()
{
if
(g_pScreenSpaceQuad != NULL)
{
g_pScreenSpaceQuad->Release();
}
if
(g_pTextureScreen != NULL)
{
g_pTextureScreen->Release();
}
if
(g_pEffect != NULL)
{
g_pEffect->Release();
}
//释放Direct3D设备对象
if
( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
//释放Direct3D对象
if
( g_pD3D != NULL )
g_pD3D->Release();
}
VOID
RenderScreen()
{
//将RenderTarget作为纹理
g_pEffect->SetTexture(hTexScreen, g_pTextureScreen);
float
fWidthInv = 1.0f / WIDTH;
float
fHeightInv = 1.0f / HEIGHT;
g_pEffect->SetFloat(hViewPortWidthInv, fWidthInv);
g_pEffect->SetFloat(hViewPortHeightInv, fHeightInv);
g_pd3dDevice->SetStreamSource(0, g_pScreenSpaceQuad, 0,
sizeof
(Vertex));
g_pd3dDevice->SetFVF(Vertex::FVF);
// 设置要使用的Technique
g_pEffect->SetTechnique(hTechScreen);
UINT
numPasses = 0;
g_pEffect->Begin(&numPasses, 0);
for
(
int
i = 0; i < numPasses; i++)
{
g_pEffect->BeginPass(i);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
g_pEffect->EndPass();
}
g_pEffect->End();
}
//-----------------------------------------------------------------------------
// Desc: 渲染场景
//-----------------------------------------------------------------------------
VOID
Render()
{
// 获取backbuffer
LPDIRECT3DSURFACE9 pBackbuffer;
g_pd3dDevice->GetRenderTarget(0, &pBackbuffer);
//开始渲染场景
if
( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
//设回backbuffer
g_pd3dDevice->SetRenderTarget(0, pBackbuffer);
RenderScreen();
//场景渲染结束
g_pd3dDevice->EndScene();
}
//在屏幕上显示场景
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------
// Desc: 窗口过程, 处理消息
//-----------------------------------------------------------------------------
LRESULT
WINAPI MsgProc(
HWND
hWnd,
UINT
msg,
WPARAM
wParam,
LPARAM
lParam )
{
switch
( msg )
{
case
WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return
0;
}
return
DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Desc: 入口函数
//-----------------------------------------------------------------------------
INT
WINAPI WinMain(
HINSTANCE
hInst,
HINSTANCE
,
LPSTR
,
INT
)
{
//注册窗口类
WNDCLASSEX wc = {
sizeof
(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L
"ClassName"
, NULL };
RegisterClassEx( &wc );
//创建窗口
HWND
hWnd = CreateWindow( L
"ClassName"
, L
"图像平滑"
,
WS_OVERLAPPEDWINDOW, 200, 100, WIDTH, HEIGHT,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
//初始化Direct3D
if
( SUCCEEDED( InitD3D( hWnd ) ) )
{
//创建场景图形
if
( SUCCEEDED( InitGeometry() ) )
{
//显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
//进入消息循环
MSG msg;
ZeroMemory( &msg,
sizeof
(msg) );
while
( msg.message!=WM_QUIT )
{
if
( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render();
//渲染场景
}
}
}
}
UnregisterClass( L
"ClassName"
, wc.hInstance );
return
0;
}
Effect代码:
[cpp]
view plain
copy
/********************************
* Author: rabbit729
* E-mail: wlq_729@163.com
* Date: 2011-10-08
********************************/
//------------------------------
// 顶点着色器
//------------------------------
float
viewport_inv_width;
float
viewport_inv_height;
struct
VS_OUTPUTSCREEN {
float4 Pos: POSITION;
float2 texCoord: TEXCOORD0;
};
VS_OUTPUTSCREEN vs_mainPassScreen(float4 Pos: POSITION){
VS_OUTPUTSCREEN Out;
Out.Pos = float4(Pos.xy, 0, 1);
Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);
Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);
return
Out;
}
//------------------------------
// 像素着色器
//------------------------------
Texture2D TexScreen;
sampler2D TexMapScreen {
Texture = <TexScreen>;
};
const
float4 samples[9] = {
-1.0, -1.0, 0.0, 1.0,
0.0, -1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
-1.0, 0.0, 0.0, 1.0,
0.0, 0.0, 0.0, 1.0,
1.0, 0.0, 0.0, 1.0,
-1.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0
};
float4 ps_mainPassScreen(float2 texCoord: TEXCOORD0) : COLOR
{
//return float4(Intensity.xxx,col.a);
float4 col = float4(0, 0, 0, 0);
float
fArr[9];
for
(
int
i = 0; i < 9; i++)
{
fArr[i] = tex2D(TexMapScreen, texCoord + float2(samples[i].x*viewport_inv_width, samples[i].y*viewport_inv_height));
}
//冒泡排序
for
(
int
j = 0; j < 8; j++)
{
for
(
int
k = 0; k < 9 - j - 1; k++)
{
if
(fArr[k] > fArr[k + 1])
{
float
fTemp;
fTemp = fArr[k];
fArr[k] = fArr[k + 1];
fArr[k + 1] = fTemp;
}
}
}
return
fArr[4];
}
//------------------------------
// 效果框架
//------------------------------
technique Screen
{
pass P0
{
VertexShader = compile vs_3_0 vs_mainPassScreen();
PixelShader = compile ps_3_0 ps_mainPassScreen();
}
}
结果:
原图:
平滑后结果:
顶
0
踩
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/运维做开发/article/detail/758987
推荐阅读
article
测试
理论(
面试
)...
今天逛
测试
之道论坛,发现这篇文章,虽然标题是写着为了
面试
,但其中的理论知识对在座的同仁也会有很大的帮助!01. 为什么要...
赞
踩
article
mysql
积累--
面试题
_第一
部分
mysql
面试题
总结
:
1.
mysql
面试题
(基础
部分
)
:
d...
网上查的
面试题
一. 基础
部分
drop
、
truncate
、 delete区别
truncate
和 delete只删除数据,...
赞
踩
article
注意力
模型
_
单
层
注意力
机制
和
多
层
的
区别...
好记性不如烂笔头,现在整理一下attention model
的
各种类型。什么是attention一句话来说,attent...
赞
踩
article
软件
测试
面试题 -
测试
理论_假设
一
个
软件
模块有5
个
独立的变量...
1. 为什么要在
一
个
团队中展开
测试
工作在团队中开展
软件
测试
工作,是因为没有经过
测试
的
软件
很难在发布之前知道该
软件
的质量,...
赞
踩
article
大
模型
提示词
Prompt
学习_
python
大
模型
prompt
...
关于chatGPT的
Prompt
Engineer,大家肯定耳朵都听起茧了。但是它的来由?,怎么能用好?很多人可能并不觉...
赞
踩
article
深入探索
多头
注意
力
机制
:深度
学习
的
关键创新_
多头
注意
机制
...
它首次在2017年
的
论文《Attention is All You Need》中被提出,此论文同时引入了Transfor...
赞
踩
article
报考
银行
究竟
是
怎么
一
回事
,
需要
作
哪些准备?...
然后开始说笔试吧:
银行
笔试其实难度都不大
,
就
是
题量多
,
所以打好基础、掌握技巧和提高阅读速度在
银行
校招笔试中显得格外重要
,
...
赞
踩
article
Java中的
XML
解析
_
java
xml
解析
...
这几天在手写Spring IOC的时候遇上了
xml
文件的
解析
,通过
解析
Spring.
xml
配制文件的方式来创建对象。因为...
赞
踩
article
uni
app
:
图片
/文件
预览
,截取
图片
路径,展示
图片
名称_
uni
图片
预览
...
文章讲述了在JavaScript中,特别是在使用
uni
框架的情况下,如何处理
图片
预览
(如.png、.jpeg等)以及非标...
赞
踩
article
geoserver
离线
地图
服务搭建和
图层
发布
...
geoserver
发布
多精度
图层
过程_
geoserver
geoserver
...
赞
踩
article
自动
输入
6位
密码
或
数字
无
光标
_
自动
输入
六位数
密码
...
自动
输入
6位
数字
试过好几种方法手机或ie8都有
光标
,下面这个没有
光标
,适用于pc与手机<!DOCTYPE html...
赞
踩
article
流形
拓扑学
:Z2
示性类
的基本
性质
...
流形
拓扑学
:Z2
示性类
的基本
性质
1.背景介绍1.1
流形
拓扑学
简介
流形
拓扑学
是研究
流形
性质
的数学分支,它利用
拓扑学
和微分...
赞
踩
article
#Uniapp:数据缓存
uni
.
setStorage
、
uni
.
setStorage
Sync、
uni
....
从HBuilderX2.6.6+起,App-Android平台对本地storage数据存储进行了性能优化,老用户升级注意...
赞
踩
article
主流跨端框架
Taro
、
uni
-
app
、
WePY
、
mpvue
、
chameleon
区别对比_taro u...
那说了那么多,到底用哪个呢?如果不介意尝鲜和学习 DSL 的话,完全可以尝试
WePY
2.0 和
chameleon
...
赞
踩
article
GeoServer
安装启动_启动
geoserver
...
导航到
GeoServer
下载页面。从“已存档”中,选择最新的 2.18.x 版本的
GeoServer
进行下载。单击...
赞
踩
article
8大
排序
之
-------
堆
排序
与
时间
复杂度
_
堆
排序
最好
时间
复杂度
...
堆
排序
-------
-------
-------
-------
-------
-------
-------
- 在介绍
堆
排序
...
赞
踩
article
2024年
软件测试
面试
题大全【含
答案
】_
软件测试
面试
常见问题
及
答案
最新...
2024年
软件测试
面试
题大全【含
答案
】_
软件测试
面试
常见问题
及
答案
最新
软件测试
面试
常见问题
及
答案
最新 ...
赞
踩
article
基于UI
交互
意图
理解的异常检测方法_
ui
交互
确认
识别
内容是否
准确
...
移动应用由“页面”组成,不同页面中的不同“模块”为用户提供着不同的功能。用户在浏览页面时,根据以往使用经验以及当前页面中...
赞
踩
article
每日一题
Leetcode
面试题
02.02
...
先创建两个指针(这里指左、右),先基于给定k,将右指针向右移动k-1次,使左指针与右指针相距为k-1,在同时移动左、右指...
赞
踩
article
文本标注工具
doccano
_
doccano
启动
...
用户名:admin, 密码:pass。4. 创建super user。该步骤需要开启另一个终端。
_
doccano
启动
do...
赞
踩
相关标签
面试
测试
数据库
mysql
sql
prompt
chatgpt
AIGC
agi
langchain
人工智能
gpt-3
深度学习
职场和发展
java
xml
spring
uni-app
javascript
开发语言
GIS
计算科学
神经计算
神经网络