模糊(平滑)目的:从图像中去除高频内容,如边缘,并使其平滑。
一、均值模糊
均值模糊:图像与盒式过滤器进行卷积,图像的中心元素被核心区域中所有像素的平均值所取代。
blur(src, dst, ksize, anchor, borderType)
src - 表示此操作的源(输入图像)的Mat对象。
dst - 表示此操作的目标(输出图像)的Mat对象。
ksize - 表示内核大小的Size对象。
anchor - 表示定位点的整数类型的变量。
borderType - 整数类型的变量,表示要用于输出的边框的类型。
"""
def blur_demo(image):
dst = cv.blur(image, (6, 6))
cv.imshow('blur_demo', dst)
二、中值模糊
中值模糊:图像的中心元素被内核区域中所有像素的中值所代替。该操作在消除噪音的同时处理边缘
medianBlur(src, dst, ksize)
src - 表示此操作的源(输入图像)的Mat对象。
dst - 表示此操作的目标(输出图像)的Mat对象。
ksize - 表示内核大小的Size对象。
"""
def median_blur_demo(image):
dst = cv.medianBlur(image, 5) #5%2==1
cv.imshow('median_blur_demo', dst)
三、自定义模糊
def custom_blur_demo(image):
# 该卷积核为5行5列共计25个值,数据类型为float型,由于是全一矩阵,且除以总个数25,相当于求取原图像的平均值,其效果相当于均值滤波
# kernel = np.ones([5, 5], np.float32) / 25
kernel = np.array([[0, -1, 0], [-1.5, 6, -1.5], [0, -1, 0]], np.float32) # 卷积核
"""
filter2D(src, ddepth, kernel)
src为需要处理的图片
ddepth一般使用-1,表示与原图像具有相同的深度;
kernel为卷积核,为单通道浮点矩阵
"""
dst = cv.filter2D(image, -1, kernel=kernel) # 锐化处理
cv.imshow('custom_blur_demo', dst)
四、高斯模糊
# 返回的value介于A、B之间,若value小于min,返回min,若大于max,返回max
def clamp(pv):
if pv > 255:
return 255
if pv < 0:
return 0
else:
return pv
# 获取高斯随机噪声图片
def gussian_noise(image):
"""
:param image:
:return:
image.shape[0], 图片垂直尺寸
image.shape[1], 图片水平尺寸
image.shape[2], 图片通道数
"""
h, w, c = image.shape
for row in range(h):
for col in range(w):
"""
normal(loc=0.0, scale=1.0, size=None):
loc:float(此概率分布的均值:对应着整个分布的中心centre)
scale:float(此概率分布的标准差:对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints(输出的shape,默认为None,只输出一个值)
"""
s = np.random.normal(0, 20, 3) # 产生随机数
b = image[row, col, 0] # blue
g = image[row, col, 1] # green
r = image[row, col, 2] # red
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.imshow('noise image', image)
# 高斯模糊
def gaussian_blur(image):
"""
GaussianBlur(src, dst, ksize, sigmaX)
src - 表示此操作的源(输入图像)的Mat对象。
dst - 表示此操作的目标(输出图像)的Mat对象。
ksize - 表示内核大小的Size对象。ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1
sigmaX - 类型变量double表示X方向上的高斯核标准差。
"""
gussian_noise(image)
dst = cv.GaussianBlur(image, (5, 5), 18)
cv.imshow('gaussian_blur', dst)