一、学习目标
- 了解什么是卷积
- 了解模糊的使用方法与应用
如有错误欢迎指出~
二、了解模糊的应用
上一篇:[python opencv 计算机视觉零基础到实战] 八、ROI泛洪填充
2.1 了解卷积是什么
在本节中,卷积我们不过多的进行深入讲解,我本人对卷积也只是稍有理解,不敢过多的编写太深的内容。在OpenCV中的模糊操作中,模糊需要用到卷积,在此引入贾志刚老师对于OpenCV的基本卷积的讲解。
以下是一个基本卷积的图示,第一列是一维数组中每一个位置的值。其中111我们称为卷积核。通过卷积核与一维数组进行计算最终将会得到蓝最下面的蓝色方块内的值。第一位我们照着写下,蓝色区域为1,蓝色方块内的第二个值为2,是如何得到的呢?很简单,用卷积核的每一个数乘上淡青蓝色的内容,那就是1_1,2_1,1_5,随后将它们进行相加,除以卷积核的步长,也就是3。这是就可以写成(1_1 2_1 1_5)/3等于2,余数为2,我们只取整数部分。之后的计算也是如此,包括二维的数据进行计算也是根据一维的计算原理一致。
2.2 均值模糊
在OpenCV中均值模糊使用blur函数,blur函数一般使用可以接收2个参数,一个是src为输入的图像,一个是ksize为卷积核大小;卷积核大小可以给予一个矩阵,如上图所属的111是1行3列的卷积核,那么就可以写为(1,3)。模糊都可以去进行去噪操作,不同的模糊对于不同的噪点有不同的效果。均值模糊一般可以用在随机噪点的图片中,可以很好的去除噪点。
首先我们引入一张图片:
代码语言:javascript复制import cv2
img = cv2.imread(r"C:UsersAdministratorDesktop2.jpg")
cv2.imshow("img", img)
随后使用blur均值模糊函数对图片进行降噪:
代码语言:javascript复制blur_img=cv2.blur(img,(2,24))#图片去噪
blur函数第一个参数是img,为我们即将要处理的图片,第二个参数是(2,24),表示创建一个2行24列的卷积核进行卷积。最后显示图片并且进行等待,完整代码如下:
代码语言:javascript复制import cv2
img = cv2.imread(r"C:UsersAdministratorDesktop3.jpg")
cv2.imshow("img", img)
blur_img=cv2.blur(img,(2,24))#图片去噪
cv2.imshow("blur_img", blur_img)
cv2.waitKey (0)#等待关闭
cv2.destroyAllWindows()#destroy
我们可以从图片中看到,原图是存在一定的噪点,但是进行均值模糊后会变淡很多,但是图片会有一定模糊。
2.3 中值模糊
中值模糊使用medianBlur函数,medianBlur一般接收2个参数,一个是待处理的图片,还有一个是核的大小,规定为大于1的奇数,例如3、5、7…
现在我有一张有椒盐噪点的图片:
中值模糊对于该类型的图片进行降噪效果十分显著。由于大多数代码已经讲解过,在此不再赘述,直接贴上代码:
代码语言:javascript复制import cv2
img = cv2.imread(r"C:UsersAdministratorDesktop2.jpg")
cv2.imshow("img", img)
median_blur_img=cv2.medianBlur(img,5)
cv2.imshow("median_blur_img", median_blur_img)
cv2.waitKey (0)#等待关闭
cv2.destroyAllWindows()#destroy
以上代码中使用了medianBlur中值模糊方法,传入了照片,并且给予了核大小值5,该值越大,则越模糊。结果如下:
2.4 锐化
在OpenCV中我们可以自定义内核对图像进行卷积,内核也有几种不同标准的内容,可以给图像进行卷积后达到一些指定的效果。自定义对内核进行卷积使用filter2D函数。函数原型如下:
代码语言:javascript复制cv.filter2D(src, ddepth, kernel)
src为待处理的图像;ddepth一般使用为-1,表示与原图像具有相同的深度;kernel为卷积核,为单通道浮点矩阵;由于我们进行初步使用直接使用一般的卷积核,这个时候直接传入固定数据即可,所以再次并不进行深度说明。
进行锐化的卷积核为:
代码语言:javascript复制kernel=np.array([[0,-1,0],
[-1,5,-1],
[0,-1,0]],np.float32)
传入至filter2D函数则为:
代码语言:javascript复制cv2.filter2D(blur_img, -1, kernel)
现在我们将一个受到均值模糊的图片使用filter2D函数进行锐化处理,完整代码如下:
代码语言:javascript复制import cv2
import numpy as np
img = cv2.imread(r"C:UsersAdministratorDesktop4.jpg")
cv2.imshow("img", img)
blur_img=cv2.blur(img,(1,6))#图片去噪
cv2.imshow("blur_img", blur_img)
kernel=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
dst = cv2.filter2D(blur_img, -1, kernel)
cv2.imshow("dst", dst)
cv2.waitKey (0)#等待关闭
cv2.destroyAllWindows()#destroy
以上代码中blur_img,是均值模糊后的图片,我们将blur_img传入值filter2D函数中使用指定的卷积核进行锐化,最后得到dst图像数据。结果如下:
均值模糊:
锐化处理:
从图片的结果可以看出,进行均值模糊后,再进行锐化,该图片的编译将得到加深。
2.4 浮雕
矩阵:
代码语言:javascript复制kernel=np.array([[-2,-1,0],
[-1,1,1],
[0,1,2]],np.float32)
有点鬼畜,不要笑。
2.5 大纲
矩阵:
代码语言:javascript复制kernel=np.array([[-1,-1,-1],
[-1,8,-1],
[-1,-1,-1]],np.float32)
2.6 拉普拉斯算子
矩阵:
代码语言:javascript复制kernel=np.array([[0,1,0],
[1,-4,1],
[0,1,0]],np.float32)
2.7 分身原图
矩阵:
代码语言:javascript复制kernel=np.array([[0,0,0],
[0,1,0],
[0,0,0]],np.float32)
该系列文章首发于ebaina
三、总结
- 了解了卷积卷积的运算方式
- 了解多种模糊的使用方法
- 了解了中值模糊对于椒盐噪点有很好的去噪效果