搜索
查看
编辑修改
首页
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
华为OD机试 - 字符统计及重排(Java & JS & Python)
2
机器学习入门:数据驱动模型的magic
3
Linux之旅: 基础知识点的终极指南
4
在ubuntu中创建容器并挂载windows共享的文件(SMB挂载到本地后,本地的文件再挂载到容器中)
5
php 上传图片
6
青春饭!35岁以上的软件测试员都去哪里了?拼一把我能继续做测试_干软件测试年纪大了后做什么了
7
【Android 音视频开发打怪升级:音视频硬解码篇】三、音视频播放:音视频同步(1)
8
Tkinter窗口跳转_tkinter实现页面跳转实例
9
链表C语言实现--单向链表_c语言单向链表
10
主流ai框架_强化学习已成为AI的主流
当前位置:
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
【
LoRA
案例教程】单人
LoRA
模型
训练
,新手入门宝典_
lora
模型
简单
测试环境
...
若想省略这些,可直接在文末获取Lora
模型
训练
手册自行查看随着AIGC的发展,许多传统工作岗位正逐渐被AI取代。同时,A...
赞
踩
article
(2024,
KAN
,
MLP
,可训练
激活
函数
,样条
函数
,分层
函数
)
Kolmogorov
–
Arnold
...
MLP
具有固定的
激活
函数
和可学习的权重,而
KAN
没有线性权重,而是使用双层的、由样条
函数
组合的、可学习的
激活
函数
。相比于...
赞
踩
article
ACK
((
Acknowledge
character
)应答机制(
kafka
)
_
character
:
k...
ACK
有三个等级等级 解释 安全性 所用时间 0 不等leader的反馈,就是不等任何反馈 最不安...
赞
踩
article
WEB
安全之
DIV
CSS
基础(四):三种
定位
和
堆叠
顺序_
web
div
有几种
定位
方式...
WEB
安全之
DIV
CSS
基础(四):三种
定位
和
堆叠
顺序_
web
div
有几种
定位
方式
web
div
有几种
定位
方式 ...
赞
踩
article
写作
赚钱
秘籍:
腾讯
头条
告诉
你
如何成为爆款作者
_
头条
写作
赚钱
...
作为汇聚大量读者的
腾讯
头条
,其丰富多元的新闻资讯以及优秀的
写作
平台,给予撰文者发表个人观点及成功经验分享的难得机遇。若
你
...
赞
踩
article
忘记
手机
密码
怎么
用计算机解开,
手机
忘记
密码
怎么
办?教
你
三种方法帮
你
搞定!......
你
一定有过
手机
忘记
密码
的经历吧?小编在就经常会把
手机
密码
记错,这个时候十分的着急,试了一遍又一遍还是不对,那么,遇到
手机
...
赞
踩
article
Unity
内置渲染管线升级
URP
教程_
shader
pr
operties can't be adde...
URP
全称为Universal Render Pipeline(通用渲染管线),可以提供更加灵活的渲染方案,通过添加Re...
赞
踩
article
AttributeError
:
module
‘
numpy
‘ has no
attribute
‘f...
AttributeError
:
module
'
numpy
' has no
attribute
'
float
'._num...
赞
踩
article
4年
外
包
出来人废
了
,5次
面试
全挂...._南京
外
包
项目组
的
面试
官挑花
了
眼...
大概介绍一下个人情况,男,毕业于普通二本院校非计算机专业,18年跨专业入行测试,第一份工作在湖南某软件公司,做
了
接近4年...
赞
踩
article
2024年技术自媒体
经验
分享
—
—
开始尝试认真做
CSDN
的
一年后
的
复盘
_
csdn
变现可行吗
_
c...
其实我一开始没有想要做知识星球
的
打算,感觉开一个新
的
平台太痛苦了。直到某一天,有一位粉丝点醒了我,他告诉我,他见证了太多...
赞
踩
article
大
数据
毕业设计
Spark
+
Hive
地震
预测
系统
地震
数据
分析可视化
地震
爬虫 大
数据
毕业设计
Fli...
尽管当前科技水平下,我们还无法直接阻止
地震
的发生,但准确的
地震
预测
和预警可以为我们提供宝贵的逃生时间,从而有效降低
地震
灾...
赞
踩
article
小
程序
分页
新写法...
【代码】小
程序
分页
新写法。小
程序
分页
新写法 // pag...
赞
踩
article
python3.6
安装
numpy
-Python3.6
的
组件
numpy
的
安装
...
安装
numpy
,scipy,scikit-learn,matplotlib下载地址:https://www.lfd.uc...
赞
踩
article
uni
-
app
:获取
url
路径中的数组
参数
(
onshow
中获取)_
uni
app
onshow
读取u...
uni
-
app
:获取
url
路径中的数组
参数
(
onshow
中获取)_
uni
app
onshow
读取
url
参数
uni
app
...
赞
踩
article
Your
password
does
not
satisfy
the current
policy
...
Your
password
does
not
satisfy
the current
policy
requiremen...
赞
踩
article
计算机
行业
的
现状与
未来
之2024_
计算机
发展前景
及
未来
趋势
...
计算机
专业作为一个与时代紧密相关
的
领域,仍然具有广阔
的
发展前景
。然而,学生在选择这个专业时,应该根据自己
的
兴趣、能力和未...
赞
踩
article
【
SSH
】
Linux
服务器开启
ssh
服务,实现
ssh
远程
登陆
!_启动
ssh
登陆
...
最近在学linux,使用
ssh
远程
登陆
linux,记录下来!首先进入/etc目录下,/etc目录存放的是一些配置文件,比...
赞
踩
article
Obsidian
Git
多端同步_
obsidian
不同电脑
git
...
2023年6月,某云笔记限制了免费用户最多同时登录 2 台设备,想要增加设备数量需要付费开通会员。之后我一直想找一款合适...
赞
踩
article
炼丹
!
训练
stable
diffusion
来生成
LoRA
定制模型_
lora
炼丹
ubuntu
推荐...
感兴趣的小伙伴,赠送全套AIGC学习资料,包含AI绘画、AI人工智能等前沿科技教程和软件工具,具体看这里。AIGC技术...
赞
踩
article
Kafka 生产者
数据
安全(
ACK
机制,
ACK
时机,
ACK
应答机制,故障处理,
Exactly
Onc...
生产者
数据
安全一、
数据
分区图解分区原因1、方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器2、...
赞
踩
相关标签
人工智能
ai绘画
模型
stable diffusion
神经网络
kafka
分布式
big data
css
前端
html
读者
文章
头条
忘记手机密码怎么用计算机解开
unity
游戏引擎
图形渲染
numpy
python
开发语言
面试
职场和发展
软件测试
自动化测试