RenderMonkey在数字图像处理中的应用(续)

空间域图像处理

在空间域图像处理中, 通常都是基于模板的算法. 即通过当前像素周围像素的颜色值来决定当前像素的颜色值. 下面举例说明:

1. 模糊

一目了然, 就是把当前像素的颜色用上下左右4个像素的颜色值的和的平均值来代替, 这样就模糊了….

那么, 怎么用RenderMonkey来实现呢?

从前边我们知道, 可以用texCoord.x, texCoord.y来表示像素的坐标, 然后用tex2D()函数来查找图像中指定坐标的颜色值. 不过要注意, 坐标的单位不是像素, 而是纹理坐票, 每个像素对应这里的图像宽度或高度的倒数. 所以, 我们先引入这两个值:

加入完毕后, 左边显示两个float值

好了, 这样一来, Color=(S1+S2+S3+S4)/4中的S1的颜色值就可以这样取到:

float4 colorS1 = tex2D( Texture0, texCoord + float2(0,-fInverseViewportWidth) );

为了计算方便, 我们把模板定义成一个滤波器数组:

const float4 samples[4] = { -1.0, 0.0, 0, 0.25, 1.0, 0.0, 0, 0.25, 0.0, .0, 0, 0.25, 0.0 -1.0, 0, 0.25 };

这样颜色的计算就可以通过一个for循环来玩成:

for(int i = 0; i < 4; i++)    {        texColor += samples[i].w * tex2D(           Texture0, TexCoord +           float2(samples[i].x*fInverseViewportWidth, samples[i].y*fInverseViewportHeight)        );     }

效果:

以下是整个PixelShader的代码:

sampler Texture0;             //源图像 float fInverseViewportWidth;    //宽度的倒数 float fInverseViewportHeight;    //高度的倒数 const float4 samples[4] = {      //滤波器    -1, 0, 0, 0.25,     1, 0, 0, 0.25,     0, 1, 0, 0.25,     0,-1, 0, 0.25 };   float4 ps_main(float2 TexCoord : TEXCOORD0                ) : COLOR0 {      float4 texColor = (float4)0;    //初始化颜色值       for(int i = 0; i < 4; i++)    {        texColor += samples[i].w * tex2D(           Texture0, TexCoord +           float2(samples[i].x*fInverseViewportWidth, samples[i].y*fInverseViewportHeight)        );     }       return texColor; }

明白了上面的程序, 那么其它效果就很好做了.

2. 边缘检测和锐化

相似的, 边缘检测的滤波器可以这样写:   const float4 samples[6] = { -1.0, 1.0, 0, 1.0, 0.0, 1.0, 0, 2.0, 1.0, 1.0, 0, 1.0, -1.0, -1.0, 0, -1.0, 0.0, -1.0, 0, -2.0, 1.0, -1.0, 0, -1.0 };

效果:

锐化滤波器: const float4 samples[5] = { 0.0, 0.0, 0, 11.0/3.0, 0.0, 1.0, 0, -2.0/3.0, 0.0, -1.0, 0, -2.0/3.0, -1.0, 0.0, 0, -2.0/3.0, 1.0, 0.0, 0, -2.0/3.0 };

效果:

有了这些基础, 相信一般的图像处理算法都没什么问题了. 如果需要更多的数学函数的支持, 可以参照这里:

Intrinsic Functions (DirectX HLSL):

http://msdn2.microsoft.com/en-us/library/bb509611.aspx

这篇文章不错, 同时也推荐一下:

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果:

http://tech.it168.com/n/2007-03-29/200703291522292.shtml

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏书山有路勤为径

特征类型和图像分割

我们最想检测的就是角点,因为角点是可重复性最高的特征,也就是说因为角点是可重复性最高的特征,给出关于同一景象的两张或以上图像 我们就能很轻易地识别出这类特征。 ...

15030
来自专栏yl 成长笔记

.opencv3 编程入门学习笔记(一): 基本函数介绍

均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值)

22520
来自专栏贾志刚-OpenCV学堂

深度学习AI美颜系列----AI美发算法(美妆相机/天天P图染发特效)

给照片或者视频中的人物头发换颜色,这个技术已经在手机app诸如天天P图,美图秀秀等应用中使用,并获得了不少用户的青睐。如何给照片或者视频中的人物头发换发色?换发...

68450
来自专栏java达人

决策树是如何工作的

作者:Rahul Saxena 译者:java达人 来源:http://dataaspirant.com/2017/01/30/how-decision-tre...

261100
来自专栏人工智能LeadAI

卷积神经网络中PET/CT图像的纹理特征提取

Author: Zongwei Zhou 周纵苇 Weibo: @MrGiovanni Email: zongweiz@asu.edu Please cit...

46630
来自专栏深度学习那些事儿

一边Upsample一边Convolve:Efficient Sub-pixel-convolutional-layers详解

这篇文章介绍<Is the deconvolution layer the same as a convolutional layer?>论文中提出的一种结合上...

63290
来自专栏机器学习、深度学习

去水印--《On the Effectiveness of Visible Watermarks》

On the Effectiveness of Visible Watermarks CVPR2017 大牛 William T. Freeman 去了 G...

61070
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777   最近闲来蛋痛,看了一些显著性检...

77250
来自专栏书山有路勤为径

卷积滤波器与边缘检测

高低频率 高频图像是强度变化很大的图像。并且亮度级别从一个像素到下一个像素快速变化。低频图像可以是亮度相对均匀或变化非常慢的图像。这是一个例子中最容易看到的。

29520
来自专栏大数据挖掘DT机器学习

Logistic回归模型、应用建模案例

一、logistic回归模型概述 广义线性回归是探索“响应变量的期望”与“自变量”的关系,以实现对非线性关系的某种拟合。这里面涉及到一个“连接...

51840

扫码关注云+社区

领取腾讯云代金券