【图像处理】卷积算法

article/2025/9/12 6:55:46

本文索引:

文章目录





# 一、 什么是卷积?       在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作。       卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是与原图像做运算的参数。卷积核通常是一个四方形的网格结构(例如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 ) = 1 2 π σ 2 ⋅ e x 2 + y 2 2 σ 2 G(x,y)=\frac{1}{2πσ^{2}}·e^{\frac{x^{2}+y^{2}}{2σ^{2}}} G(x,y)=2πσ21e2σ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);
}

效果如图所示:
这里写图片描述

      可以看到,图中左边的黑色线条已经被滤除,右边也可以采用类似的方法来剔除。实际使用中,也可以根据情况使用纯色来做剔除,这样可以节省部分效率,如下图中我使用的是纯白色来剔除边缘效应。
这里写图片描述


http://chatgpt.dhexx.cn/article/QgoMrVxw.shtml

相关文章

matlab 矩阵卷积

卷积的表达式&#xff1a; y(n)x(n)*h(n)sigma{x(m)h(n-m)} y(n)x(n)*sigma{deta(n-m)} 对应信号系统的卷积冲激函数&#xff0c;系统的结果就是信号和其本身的线性移位 结果元素的个数&#xff0c;x(n)的长度是n,h(n)的长度是m,则结果的序列长度就是nm-1 和信号处理的过程是…

卷积的理解

之前&#xff0c;习惯把记录和总结的知识点放到云笔记上&#xff0c;但发现CSDN这个博客注册好久了&#xff0c;但却没有往上面放文章&#xff0c;所以决定把以前的笔记整理一下&#xff0c;放到这里来&#xff0c;以便交流学习。 关于信号的卷积 最初认识卷积来源于《信号与…

卷积的含义

本文章为学习笔记 学习内容&#xff1a;b站up主王木头学科学的视频从“卷积”、到“图像卷积操作”、再到“卷积神经网络”&#xff0c;“卷积”意义的3次改变 假设一个人在一天中持续不断地吃东西&#xff0c;同时也在消化吃下去的食物&#xff0c;就有这样两条曲线&#xf…

(n,k,N)卷积码的生成矩阵

文章目录 卷积码卷积码编码器卷积码生成矩阵子生成元和生成元子生成矩阵和生成矩阵生成矩阵的作用 举例 ( n , 1 , N ) (n,1,N) (n,1,N)卷积码 ( n , k , N ) (n,k,N) (n,k,N)卷积码 卷积码 ( n , k , N ) (n,k,N) (n,k,N)卷积码是将每 k k k个信息比特作为一组&#xff0c;编码…

线性卷积运算

一、卷积定义 卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是g(n)序列和h(n)&#xff0c;则卷积的结果 y ( n ) g ( n ) ∗ h ( n ) ∑ i − ∞ ∞ g ( i ) h ( n − i ) y(n) g(n) * h(n) \sum_{i -\infty}^{\infty}g(i)h(n-i) y(n)g(n)∗h(n)i−∞∑∞​…

向量与矩阵的卷积算法

由于我发现网上并没有关于向量与矩阵两者进行卷积计算的具体算法&#xff0c;所以我就跟各位网友分享一下我的观点。因为本人知识储备有限&#xff0c;对卷积的了解也很是肤浅&#xff0c;没有深入研究&#xff0c;所以有错误的地方还请大神们指正&#xff0c;小子不胜感激。 …

矩阵卷积、矩阵相乘的转化

两个矩阵卷积转化为矩阵相乘形式——Matlab应用(这里考虑二维矩阵&#xff0c;在图像中对应)两个图像模糊&#xff08;边缘&#xff09;操作&#xff0c;假设矩阵A、B&#xff0c;A代表源图像&#xff0c;B代表卷积模板&#xff0c;那么B的取值决定最后运算的结果。 Matlab中的…

矩阵卷积理解

为了验证后续矩阵卷积转化为矩阵相乘&#xff0c;这里给出的conv2的实例描述&#xff1a; 假设矩阵A&#xff08;4*3&#xff09;、B&#xff08;2*3&#xff09;如下&#xff1a; 首先&#xff0c;B需要旋转180&#xff0c; 命令旋转2次90即可&#xff1a; B rot90(rot90(B)…

什么是卷积

目录 卷积是什么鬼卷积为什么这么牛卷积神经网络是个啥 卷积是什么鬼 卷积(convolution) 卷积&#xff1a; f ( t ) ∗ g ( t ) ∫ f ( τ ) g ( τ ) d ( τ ) 卷积运算符号用 ∗ 号来表示 卷积&#xff1a;f(t)*g(t)\int{f(τ)g(τ)d(τ)}\\ 卷积运算符号用*号来表示 卷积…

二维卷积/矩阵卷积

二维卷积/矩阵卷积的计算方程 设有矩阵A和矩阵B&#xff0c;它们的卷积结果矩阵的元素可由下列公式计算得来&#xff1a; C(j,k)∑p∑qA(p,q)B(j−p1,k−q1) 其中的index只要在A&#xff0c;B中valid都要参与运算。 举例来说&#xff0c;令矩阵M为卷积核矩阵&#xff0c;矩阵…

如何计算矩阵的卷积

昨天立下flag&#xff0c;要开始学习深度学习&#xff0c;深度学习中十分重要的就是卷积神经网络&#xff0c;顾名思义&#xff0c;卷积神经网络中一定会用到卷积。喵哥在博友的一篇博文中看到卷积运算用于图像边缘检测的应用实例&#xff0c;博友十分细心的在截图上做了卷积的…

矩阵乘法实现卷积运算

1. 对于普通卷积运算&#xff0c;是使用滑动窗口实现卷积运算&#xff1a; 矩阵根据卷积核的大小进行&#xff0c;从左到右、从上到i下的移动&#xff0c;对应数据相乘再相加得到的数据为该区域的值。 ​​​​​​​ ​​​​​​​ 2.矩阵乘法实现卷积 原理&#xff1a;根据…

各种卷积操作及其矩阵运算

前言 简单来讲&#xff0c;卷积是一种函数和函数产生一个新函数的数学运算&#xff0c;该数学运算的自变量是两个函数f, g&#xff08;连续或离散都可以,&#xff0c;定义域之外的部分记函数值填充为0&#xff09;&#xff0c;输出为一个函数h,满足 ,或者说&#xff0c;就是对…

矩阵卷积运算的具体过程

矩阵卷积运算的具体过程&#xff0c;很简单 最近在看图像处理&#xff0c;卷积运算这一块也查了很多&#xff0c;但是感觉都写的太复杂&#xff0c;我这里简单的写一下卷积到底是一个什么计算过程。 假设有一个卷积核h&#xff0c;就一般为3*3的矩阵&#xff1a; 有一个待处理…

矩阵卷积运算过程讲解

写了那么久的博客&#xff0c;始于Python爬虫&#xff0c;目前专于Java学习&#xff0c;终于有了属于自己的小窝&#xff0c;欢迎各位访问我的个人网站&#xff0c;未来我们一起交流进步。 在爬虫处理验证码的过程中接触到矩阵卷积运算&#xff0c;关于该类运算&#xff0c;记录…

矩阵的卷积以及使用python计算方法

1、离散⼆维卷积公式 其中A为被卷积矩阵&#xff0c;K为卷积核&#xff0c;B为卷积结果&#xff0c;该公式中&#xff0c;三个矩阵的排序均从0开始。 卷积核、滤波器通常为较小尺寸的矩阵&#xff0c;比如3333、5555等&#xff0c;数字图像是相对较大尺寸的2维&#xff08;多…

矩阵卷积

1. 矩阵的卷积运算主要用在图像处理中&#xff0c;假设输入信号为x[m,n]&#xff0c;激活响应为h[m,n]&#xff0c;则其卷积定义为&#xff1a; 2.如果矩阵的中心在边缘就要将原矩阵进行扩展&#xff0c;例如补0 3.卷积的计算步骤&#xff1a; (1) 卷积核绕自己的核心…

隐马尔可夫模型(HMM)及Viterbi算法

HMM简介 对于算法爱好者来说&#xff0c;隐马尔可夫模型的大名那是如雷贯耳。那么&#xff0c;这个模型到底长什么样&#xff1f;具体的原理又是什么呢&#xff1f;有什么具体的应用场景呢&#xff1f;本文将会解答这些疑惑。   本文将通过具体形象的例子来引入该模型&#x…

viterbi算法实例及python实现

Python中hmmlearn给出了三种HMM模型&#xff1a;MultiomialHMM,GaussianHMM,GMMHMM。本文以MultiomialHMM为例&#xff0c;使用《从机器学习到深度学习》中第六章的活动/天气模型进行推算。 假设有这样一个问题&#xff0c;远在另一个城市上大学的儿子每天通过邮件向你汇报他今…

在HMM中实际应用Viterbi算法的例子

在HMM中实际应用Viterbi算法的例子 Viterbi概念动态规划使用HMM的Viterbi算法参考Viterbi概念 本质:动态规划算法 维特比算法是多步骤每步多选择模型的最优选择问题。 其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价…