OpenCV零基础入门(4):卷积在图像处理中的应用

频道:生活应用 日期: 浏览:71

介绍

卷积是一个数学概念,两个月前,我首先在一个复杂的功能类中遇到了这个概念。当时,老师使用一堂课来复制黑板上的大量卷积转换公式。完成课后,我不知道卷积的用途是什么。我觉得这只是数学家强迫手动定义的公式。直到最近,我才开始学习AI视觉开yun体育官网入口登录app,我发现卷积甚至所有数学在计算机领域都有很大使用。今天,我将使用本文简要介绍卷积在图像处理中的应用。

1。卷积

卷积定义:

卷积的定义

卷积是一种用于组合数组和功能的新方法。

让我给您一个榜样,以更直观地了解卷积。

如果有两个不平衡的插入开yunapp体育官网入口下载手机版,则投掷1〜6的概率由两个阵列表示:a = [a1,a2,a3,a4,a4,a5,a6],b = [b1,b2,b2,b3,b4,b4,b5 ,B6]。

(其中a1+a2+a3+a4+a5+a6 = 1,b1+b2+b3+b4+b5+b6 = 1)

投掷2到12的可能性如下:

p(2)= a1b1

p(3)= a1b2+a2b1

p(4)= A1B3+A2B2+A3B1

P(12)= A6B6

总结以下规则:

这是数组的卷积操作:

找到阵列(1,2,3)和(4,5,6)(4,5,6)的卷积

使用(A0,A1,A2)代表(1,2,3),使用(B0,B1,B2)代表(4,5,6)

然后:c0 = a0b0 = 1x4 = 4

C1 = A0B1+A1B0 = 1x5+2x4 = 13

C2 = A0B2+A1B1+A2B0 = 1x6+2x5+3x4 = 28

C3 = A1B2+A2B1 = 2x6+3x5 = 27

C4 = A2B2 = 3x6 = 18

因此:(1,2,3)(4,5,6)=(4,13,28,27,18)

使用Python代码验证:

一维数组卷积运算

其中,Numpy是Python的开源数值计算扩展,可用于存储和处理大型矩阵。

卷曲()函数用于在两个一维阵列之间执行卷积操作。

2。卷积在图像处理中的应用

用3x3网格沿原始图像移动。

其中:A11+A12+A13+A​​21+A22+A23+A31+A32+A33 = 1。在每次迭代中,将这些值乘以其下方的相应像素值。每个像素的颜色由三个通道R/g/b组成,因此其像素值为3x1矩阵(如果是灰度图,则只有0到255之间的值来表示它。亮度。亮度)。假设下面涵盖的九个网格中每个像素点的像素值分别分别为B11,B12,B13,B21,B22,B23,B23开元棋官方正版下载,B31,B32,B33。卷积处理后,B22处的相应像素值变为A11B11+A12B12+A13B13+A21B21+A22B22+A23B23+A23B23+A31B31+A32B32+A32B32+A33*B33*B33。

用卷积解释一种生活现象_卷积在生活应用_卷积在生活中的应用

这就是计算每个像素的方式,结果是将每个像素混合到相邻的像素中,这比原始图像具有模糊但更光滑的版本。

卷积在生活应用_卷积在生活中的应用_用卷积解释一种生活现象

就处理的图而言,处理的图是原始图和小网格的卷积。这个小网格称为卷积内核。通过选择不同的内核,可以产生不同的图像处理效果,例如边缘检测和图像模糊。锐化,等等。

3。图像平滑处理

(1)平均过滤,简单的平均卷积操作

卷积内核中的每个值都是相同的。例如,3x3的平均滤波卷积内核为

img=cv2.imread('./img/face.png')
blur=cv2.blur(img,(3,3)) #均值滤波后的图像
plt.subplot(1,2,1),plt.imshow(img,'gray'),plt.title('img')
plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(blur,'gray'),plt.title('blur')
plt.xticks([]),plt.yticks([])
plt.show()

操作结果显示在图中:

blur

可以看出,处理后图像的噪声大大降低。

(2)高斯滤波,高斯模糊卷积内核中的数值满足高斯分布,这相当于更多地关注中间值。目标像素点越接近,当目标像素值再生时的重量就越大。

img=cv2.imread('./img/face.png')
gblur=cv2.GaussianBlur(img,(5,5),1)

操作结果显示在图中:

gblur

(3)中值过滤等同于替换中值值

median=cv2.medianBlur(img,5) #用5x5卷积核的中值替代

操作结果显示在图中:

median

(4)显示全部:

img=cv2.imread('./img/face.png')
blur=cv2.blur(img,(3,3))
gblur=cv2.GaussianBlur(img,(5,5),1)
median=cv2.medianBlur(img,5)
res=np.hstack((blur,gblur,median)) #这是水平拼接。竖直拼接是np.vstack()
cv2.imshow('median vs average',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

all

网友留言(0)

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。