【图像处理】卷积算法
本文索引:
文章目录
# 一、 什么是卷积? 在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作。 卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是与原图像做运算的参数。卷积核通常是一个四方形的网格结构(例如3*3的矩阵或像素区域),该区域上每个方格都有一个权重值。 使用卷积进行计算时,需要将卷积核的中心放置在要计算的像素上,一次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结构就是该位置的新像素值。 以下两个算子中演示了具体的卷积计算过程。
# 二、 相关算子 定义:![这里写图片描述](https://img-blog.csdn.net/20160603125126517) 即![这里写图片描述](https://img-blog.csdn.net/20160603125155767),其中h称为相关核(Kernel). 步骤:
- 1)滑动核,使其中心位于输入图像g的(i,j)像素上
- 2)利用上式求和,得到输出图像的(i,j)像素值
- 3)充分上面操纵,直到求出输出图像的所有像素值
【例】
原始像素矩阵为:
\begin{bmatrix}
17 & 24 & 1 & 8 & 15 \
23 & 5 & 7 & 14 & 16 \
4 & 6 & 13 & 20 & 22 \
10 & 12 & 19 & 21 & 3\
11 & 18 & 25 & 2 & 9
\end{bmatrix}
卷积模板h为:
\begin{bmatrix}
8 & 1 & 6 \
3 & 5 & 7 \
4 & 9 & 2
\end{bmatrix}
计算输出图像的(2,4)元素=18+81+156+73+145+167+134+209+22*2=585
如图所示:
# 三、 卷积算子
定义:
即
步骤:
- 1)将核围绕中心旋转180度
- 2)滑动核,使其中心位于输入图像g的(i,j)像素上
- 3)利用上式求和,得到输出图像的(i,j)像素值
- 4)充分上面操纵,直到求出输出图像的所有像素值
例:计算输出图像的(2,4)元素=12+89+154+77+145+163+136+201+22*8=575
如图所示:
# 四、 边缘效应 当对图像边缘的进行滤波时,核的一部分会位于图像边缘外面。 ![这里写图片描述](https://img-blog.csdn.net/20160603143253118) 常用的策略包括: - 1)使用常数填充:imfilter默认用0填充,这会造成处理后的图像边缘是黑色的。 - 2)复制边缘像素:I3 = imfilter(I,h,'replicate'); ![这里写图片描述](https://img-blog.csdn.net/20160603143353525)
# 五、 常用的卷积核及其用途
1)低通滤波器(常用于计算模糊后的效果)\begin{bmatrix}
1/9 & 1/9 & 1/9 \
1/9 & 1/9 & 1/9 \
1/9 & 1/9 & 1/9
\end{bmatrix}
\begin{bmatrix}
1/10 & 1/10 & 1/10 \
1/10 & 2/10 & 1/10 \
1/10 & 1/10 & 1/10
\end{bmatrix}
\begin{bmatrix}
1/16 & 2/16 & 1/16 \
2/16 & 4/16 & 2/16 \
1/16 & 2/16 & 1/16
\end{bmatrix}2)高斯滤波器(常用于计算高斯模糊后的效果)
高斯模糊的卷积核也是一个正方形的滤波核,其中每个元素通过以下公式计算得出:
G(x,y)=12πσ2⋅ex2+y22σ2G(x,y)=\frac{1}{2πσ^{2}}·e^{\frac{x^{2}+y^{2}}{2σ^{2}}}G(x,y)=2πσ21⋅e2σ2x2+y2
该公式中σ是标准方差(一般取值为1),x和y分别对应了当前位置到卷积核中心的整数距离。通过这个公式,就可以计算出高斯核中每个位置对应的值。为了保证滤波后的图像不会变暗,需要对高斯核中的权重进行归一化。3)边缘检测(常用于计算图像边缘或者说梯度值)
\begin{bmatrix}
-1 & 0 & -1 \
0 & 4 & 0 \
-1 & 0 & -1
\end{bmatrix}
# 六、 一个例子——使用卷积实现模糊效果 我们将对下面这张图进行模糊处理: ![这里写图片描述](https://img-blog.csdn.net/20160606172529227) 以下为compute shader中关于卷积处理的代码:
[numthreads(32,32,1)]
void Dim_Main (uint3 id : SV_DispatchThreadID)
{float sumR = 0;float sumG = 0;float sumB = 0;float sumA = 0;for (int i = -1; i <= 1; i++) {for (int j = -1; j <= 1; j++) {sumR += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].r * convolutionTempBuffer[(i+1)*3+(j+1)];sumG += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].g * convolutionTempBuffer[(i+1)*3+(j+1)];sumB += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].b * convolutionTempBuffer[(i+1)*3+(j+1)];sumA += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].a * convolutionTempBuffer[(i+1)*3+(j+1)];}}texBuffer[id.x*texWidth[0]+id.y].r = sumR;texBuffer[id.x*texWidth[0]+id.y].g = sumG;texBuffer[id.x*texWidth[0]+id.y].b = sumB;texBuffer[id.x*texWidth[0]+id.y].a = sumA;Result[id.xy] = float4(sumR, sumG, sumB, sumA);
}
效果如图所示:
图中可以明显的看到左右两边有明显的黑色线条,原图中是没有这样的黑色的,产生这种效果的原因是本文中之前提到过的边缘效应。下面我将修改一部分代码去除边缘效应带来的影响,这里使用的是相邻像素的值方法。
代码如下:
[numthreads(32,32,1)]
void Dim_Main (uint3 id : SV_DispatchThreadID)
{float sumR = 0;float sumG = 0;float sumB = 0;float sumA = 0;for (int i = -1; i <= 1; i++) {for (int j = -1; j <= 1; j++) {if((id.x+i)*texWidth[0]+(id.y+j)>texWidth[0]*texWidth[0]-1){sumR += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)-texWidth[0]].r * convolutionTempBuffer[(i+1)*3+(j+1)];sumG += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)-texWidth[0]].g * convolutionTempBuffer[(i+1)*3+(j+1)];sumB += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)-texWidth[0]].b * convolutionTempBuffer[(i+1)*3+(j+1)];sumA += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)-texWidth[0]].a * convolutionTempBuffer[(i+1)*3+(j+1)];}sumR += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].r * convolutionTempBuffer[(i+1)*3+(j+1)];sumG += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].g * convolutionTempBuffer[(i+1)*3+(j+1)];sumB += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].b * convolutionTempBuffer[(i+1)*3+(j+1)];sumA += texBuffer[(id.x+i)*texWidth[0]+(id.y+j)].a * convolutionTempBuffer[(i+1)*3+(j+1)];}}texBuffer[id.x*texWidth[0]+id.y].r = sumR;texBuffer[id.x*texWidth[0]+id.y].g = sumG;texBuffer[id.x*texWidth[0]+id.y].b = sumB;texBuffer[id.x*texWidth[0]+id.y].a = sumA;Result[id.xy] = float4(sumR, sumG, sumB, sumA);
}
效果如图所示:
可以看到,图中左边的黑色线条已经被滤除,右边也可以采用类似的方法来剔除。实际使用中,也可以根据情况使用纯色来做剔除,这样可以节省部分效率,如下图中我使用的是纯白色来剔除边缘效应。
【图像处理】卷积算法相关推荐
- 【数字图像处理】双三次插值及其卷积算法(Bicubic Interpolation)
双三次插值数学原理及其卷积算法原理(Bicubic Interpolation) 本文是维基百科上双三次插值的中文翻译,如有侵权会立即删除.本人刚学图像处理,第一次翻译英文文章,水平有限,如有错误还请 ...
- 【算法+图像处理】2D卷积与快速卷积算法C语言实现
卷积算法在图像处理中有着广泛的应用,通常使用的去噪算法.边缘增强算法等的实现都使用到了2D卷积算法.这里介绍一下2D卷积算法和快速卷积算法的C语言实现. 卷积定义 即 步骤: 1)滑动核,使其中心位于 ...
- 三种常见的图像处理双三次插值算法
三种常见的图像处理双三次插值算法 双立方插值计算涉及16像素,间(i', j')像中的包括 小数部分的像素坐标.dx表示X方向的小数坐标.dy表示Y方向的小数坐标. 详细 能够看下图: 依据上述图示与 ...
- 基于GEMM实现的CNN底层算法被改?Google提出全新间接卷积算法
作者 | Marat Dukhan from Google Research 译者 | 凯隐 责编 | Jane 出品 | AI科技大本营(ID: rgznai100) [导读]本文介绍的内容主要聚焦 ...
- DL之DilatedConvolutions:Dilated Convolutions(膨胀卷积/扩张卷积)算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
DL之DilatedConvolutions:Dilated Convolutions(膨胀卷积/扩张卷积)算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 Dilated Con ...
- 深度学习卷积算法指南
A guide to convolution arithmetic for deeplearning 本文是中文翻译版本. https://github.com/vdumoulin/conv_arit ...
- 视频教程-数字图像处理实战-算法基础
数字图像处理实战 河海大学计算机硕士毕业,现就职于南京华为研究所,从事嵌入式软件开发工作.热爱模式识别及机器学习算法. 金圣韬 ¥70.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+ ...
- 图像处理:分水岭算法(图像分割)
图像处理:分水岭算法(图像分割) 分水岭算法 分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点: ...
- 机器学习19:反卷积算法
机器学习19:反卷积算法(转载和整理) 在整理全卷积网络的过程中,被反卷积的概念困扰很久,于是将反卷积算法单独整理为一篇博客,本文主要转载和整理自知乎问题如何通俗易懂地解释反卷积?中的高票答案. 1. ...
- Python实现数字图像处理经典算法之256色转灰度图
算法介绍 256色转灰度图是数字图像处理经典算法中最简单的算法之一 1.彩色数字图像中的颜色有红.绿.蓝三种颜色混合而成,对应的像素颜色通道就是RGB(R,G,B),R.G.B数值共有256个数值,也 ...
最新文章
- 8-14-Exercise
- mysql windows集群_Mysql集群windows服务器版搭建过程
- 负责域名解析的DNS服务
- 一个简单的防爬虫脚本(转载欧彬)
- mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
- Visual C++中 #include stdafx.h 头文件的用法
- python命令行tab补全_python命令行下按tab建补全的方法
- VRTK HTC手柄发出射线,瞬移,选择物体 VRTK和steamVR对应版本
- 自定义ArcView-构造拓展性高的view
- 深入理解虚拟内存机制
- fbx 骨架_骨架修剪
- Linux下安装SVN服务(CentOS7下)单仓库版(老威改良版)
- 罗格斯大学电气与计算机工程专业怎么样,罗格斯大学电气与计算机工程硕士专业...
- React实现实时/局部刷新
- sqlserver2014数据导出与导入
- 巧妙复制网页中的文本——复制网页上不能复制的文字
- 黑窗口下安装MySQL数据库
- 开机时User服务器未能登录,Win10开机提示user profile service服务登录失败的原因及解决方法...
- ITU601与ITU656
- IRremoteESP8266库 红外控制空调方法