图像在采集、传输的过程中,因为人为或者系统的因素难免会产生噪声。这时候就需要对图像进行预处理降低噪声。图像模糊降噪的数学原理是图像的卷积操作。
模糊操作:基于离散卷积,定义好每个卷积核,不同卷积核得到不同的卷积效果,模糊是卷积的一种表现形式。
均值滤波是典型的线性滤波算法,模糊是卷积的一种表象,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值,比如一个3*3的模板可以用如下表示:
中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的。该模板一般用于去除椒盐噪声, 前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他,卷积核的大小也是个奇数。
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将核模板放在图像的一个像素A上,求与之对应的图像上的每个像素点的和,核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。
代码如下:
def blur_demo(image): # 均值模糊
dst = cv.blur(image, (5, 5)) # 最常用
cv.imshow("blur_demo", dst)
原图为:
经过均值模糊后:
可以看到雪女姐姐被明显地模糊了,要想改变模糊深度,可以改变blur里面的第二个参数,同时可以横向或者纵向地改变模糊方向。
代码如下:
def median_blur_demo(image): # 中值模糊
dst = cv.medianBlur(image, 5)
cv.imshow("median_blur_demo", dst)
原图为:
可以看出原图中含有很多椒盐噪声,则我们可以通过中值模糊去除这些椒盐噪声。
这时,莱娜周围的椒盐噪声大部分被去除掉了。
自定义模糊时,我们会用到filter2D这个API,这个API用途比较广泛,用于图像模糊时,可以使用如下代码:
def custom_blur_demo(image): # 自定义模糊
kernel = np.ones([5, 5], np.float32) / 25
"""
声明二维数组5*5,初始化1,保证值不溢出,除以数组大小,实现中值模糊,自定义卷积核的算子
上述生成的5*5核模板其实就是一个均值滤波。,当我们是/25就是中值滤波,归一化处理
"""
dst = cv.filter2D(image, -1, kernel=kernel)
cv.imshow("custom_blur_demo", dst)
原图为:
经过模糊后:
不仅可以模糊,我们还可以锐化图像,代码如下:
def custom_blur_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_blur_demo", dst)
经过锐化后的图像为:
此时的雪女姐姐变得有点魔幻了,反正这就是那种效果了。
import cv2 as cv # 导入opencv模块
import numpy as np # 导入数学函数库
def blur_demo(image): # 均值模糊
# dst = cv.blur(image, (1, 5)) # 一行五列,垂直方向
# dst = cv.blur(image, (5, 1)) # 五行一列,水平方向
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
"""
声明二维数组5*5,初始化1,保证值不溢出,除以数组大小,实现中值模糊,自定义卷积核的算子
上述生成的5*5核模板其实就是一个均值滤波。,当我们是/25就是中值滤波,归一化处理
"""
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 图像锐化
dst = cv.filter2D(image, -1, kernel=kernel)
cv.imshow("custom_blur_demo", dst)
print("------------hello python!------------")
src = cv.imread("D:/opencv3/image/snow girl3.png")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
# blur_demo(src)
# median_blur_demo(src)
custom_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows() # 释放所有窗口