参考:
一、模糊原理
使用模糊操作的原因之一就是为了给图像预处理时候降低噪声 , 把噪声与周围的数值平均一下就可以平滑噪声。
模糊基于数学的卷积计算。
卷积:通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数 与经过翻转和平移的重叠部分的面积。
- 其中:
表示一副图像
表示图像的行和列
表示卷积算子(卷积核)(也可以叫掩膜)
又可以叫窗口大小(掩膜的大小,比如3*3)
表示输出的像素值
不同的卷积核得到不同的卷积效果。
通常这些卷积算子计算都是线性操作,所以又叫线性滤波。
二、基本模糊操作
1.均值模糊
import cv2 as cv
import numpy as np
def blur_demo(image):
"""
均值模糊
- - - -
image - 原图像
"""
# 均值模糊函数:(1,3)分别代表水平模糊和垂直模糊,常用(5,5)
dst = cv.blur(image, (1, 20))
cv.imwrite("blur.png", dst)
if __name__ == "__main__":
src = cv.imread('blurtest.jpeg')
blur_demo(src)
结果:
2.中值模糊
def median_blur_demo(image):
"""
中值模糊
- - - -
image - 原图像
"""
# 中值模糊函数
dst = cv.medianBlur(image, 5)
cv.imwrite("median_blur.png", dst)
if __name__ == "__main__":
src = cv.imread('blurtest.jpeg')
median_blur_demo(src)
结果:
可以看出,对于椒盐噪点(有不规则黑白点)图像,中值模糊的去噪效果明显好于均值模糊。
3.自定义模糊
def custom_blur_demo(image):
"""
自定义模糊
- - - -
image - 原图像
"""
# 自定义卷积核,为了防止像素值溢出,需除25(=5*5*1![在这里插入图片描述](https://img-blog.csdnimg.cn/2019122522022841.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmFzaGlfRg==,size_16,color_FFFFFF,t_70))
kernel = np.ones([5,5],np.float32)/25
# 自定义模糊函数:
dst = cv.filter2D(image,-1,kernel)
cv.imwrite("custom_blur.png", dst)
if __name__ == "__main__":
src = cv.imread('blurtest.jpeg')
blur_demo(src)
median_blur_demo(src)
custom_blur_demo(src)
结果:
可以看出,模糊后结果与均值模糊一致。
另外,还可以通过自定义模糊实现图像锐化的功能,如下(重点是卷积核):
def custom_blur_demo2(image):
"""
自定义模糊-锐化
- - - -
image - 原图像
"""
# 自定义卷积核
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]],np.float32)
# 自定义模糊函数:(1,3)分别代表水平模糊和垂直模糊
dst = cv.filter2D(image,-1,kernel)
cv.imwrite("custom_blur2.png", dst)
if __name__ == "__main__":
src = cv.imread('cat.jpg')
custom_blur_demo2(src)
结果:
三、高斯模糊
1.原理
高斯模糊是一种图像模糊滤波器,它用正态分布计算图像中每个像素的变换。N维空间正态分布方程为
在二维空间定义为
其中,r是模糊半径,σ是正态分布的标准偏差。
在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。
原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。
这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果,参见尺度空间实现。
2.产生高斯噪声
def clamp(pv):
"""
防止像素溢出
- - - -
pv - 像素值
"""
if pv > 255:
return 255
elif pv < 0:
return 0
else:
return pv
def gaussian_noise(image):
"""
产生高斯噪声图像
- - - -
image - 原图像
"""
h, w = image.shape[:2]
for row in range(h):
for col in range(w):
# np.random.normal()生成随机正态元组:
# 0-均值,20-标准差,3-shape
s = np.random.normal(0, 20, 3)
b = image[row, col, 0]
g = image[row, col, 1]
r = image[row, col, 2]
image[row, col, 0] = clamp(b + s[0])
image[row, col, 1] = clamp(g + s[1])
image[row, col, 2] = clamp(r + s[2])
cv.imwrite("gaussNoise.jpg", image)
if __name__ == "__main__":
src = cv.imread('cat.jpg')
gaussian_noise(src)
结果:
3.高斯模糊
if __name__ == "__main__":
src = cv.imread('cat.jpg')
# 高斯模糊函数
dst = cv.GaussianBlur(src, (0, 0), 15)
cv.imwrite("GaussianBlur.png", dst)
结果(毛玻璃效果):
- 若对高斯噪声图像使用高斯模糊
if __name__ == "__main__":
src = cv.imread("gaussNoise.jpg")
# 高斯模糊函数
dst = cv.GaussianBlur(src, (0, 0), 3)
cv.imwrite("GaussianBlur.png", dst)
结果:
可以看出影响减少了
来源:CSDN
作者:nanashi_F
链接:https://blog.csdn.net/nanashi_F/article/details/103702970