- A+
1 均值模糊、中值模糊、自定义模糊
1.1 均值模糊
均值滤波是典型的线性滤波算法,模糊是卷积的一种表象,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值,比如一个3*3的模板其实就可以如下表示
均值模糊函数blur():
定义:blur(src, ksize, dst = None, anchor=None, borderType=None),定义是有5个参数,但最后3个均为none,所以也就2个参数
src:要处理的原图像
ksize:必须是奇数卷积核,周围关联的像素的范围
1.2 中值模糊
中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的。 这个模板一般用于去除椒盐噪声。 前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他,卷积核的大小也是个奇数。
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
中值模糊函数medianBlur():
定义:medianBlur(src, ksize, dst=None)
ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示5*5的方阵
1.3 自定义模糊
滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将核模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。
filter2D(src,ddepth,kernel):
ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致
kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵
2 代码
- import cv2 as cv
- import numpy as np
- def blur_demo(image):
- dst = cv.blur(image, (5, 5))
- cv.imshow("blur_demo", dst)
- def median_blur_demo(image):
- dst = cv.medianBlur(image, 5)
- cv.imshow("median_blur_demo", dst)
- def custom_blur_demo(image):
- kernel = np.ones([5, 5], np.float32)/25
- dst = cv.filter2D(image, -1, kernel=kernel)
- cv.imshow("custom_blur_demo", dst)
- def custom_ruihua_demo(image):
- kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
- dst = cv.filter2D(image, -1, kernel=kernel)
- cv.imshow("custom_ruihua_demo", dst)
- print("hello world")
- src = cv.imread("C:/Users/Admin/Desktop/1.jpg") # 读取图像
- cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) # 创建显示图像的窗口
- cv.imshow("input image", src) # 显示图片到特定的窗口中
- blur_demo(src)
- median_blur_demo(src)
- custom_blur_demo(src)
- custom_ruihua_demo(src)
- cv.waitKey(0) # 等待用户操作,0为一直等待,5000为等待用户操作5s
- cv.destroyAllWindows() # 释放所有内存
3 讲解
从print("hello world")开始,读取一幅图像,并显示出来。
blur_demo函数负责用均值模糊算法对图像进行模糊。代码中(5,5)就是5*5大小的卷积框,计算这些范围内的均值即中心位置的像素值
median_blur_demo函数负责使用中值模糊算法对图像进行模糊。用卷积框中像素的中值代替中心值,代码中的5就是5*5大小的卷积框
custom_blur_demo函数负责使用自定义卷积核进行处理,二维数组5*5,初始化1,保证值不溢出,除以数组大小,实现均值模糊,自定义卷积核的算子
custom_ruihua_demo函数负责使用一个特殊的卷积核处理图像来达到锐化图像的目的。