一、均值模糊
均值模糊实际上是使用了典型线性滤波算法中的均值滤波算法,是一种线性平滑技术,通过将图像与归一化卷积核进行卷积来实现地。它仅获取内核区域下所有像素的平均值,并替换中心元素。所谓模糊实际上是卷积在图像处理上的一种表现,也可称之为图像的平滑处理过程。均值模糊优点在于效率高,思路简单,缺点是计算均值会将图像中的边缘信息以及特征信息“模糊”掉,会丢失很多有用特征。
在OpenCV中实现均值模糊的API函数为:
def cv.blur(src, ksize, dst=None, anchor=None, borderType=None)
src | 源图像 |
ksize | 卷积核的大小(矩阵表示,且为奇数) |
注:后三个参数均为None
实例一:对图像进行均值模糊
import cv2 as cv
# 均值模糊-对随机噪声有很好的去噪效果(它仅获取内核区域下所有像素的平均值,并替换中心元素)
def blur_demo(image):
dst = cv.blur(image, (5, 5)) # 卷积核大小为(5,5),可分别进行横向或纵向的模糊
cv.imshow("blur_demo", dst)
src = cv.imread("lena256.tif")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
程序执行结果如下图所示:
二、中值模糊
中值模糊实际上是一种非线性平滑技术,取卷积核所覆盖像素中的中值作为中心点的像素值。中值模糊在处理脉冲噪声以及椒盐噪声时效果极佳,能够有效的保护好图像的边缘信息。
中值滤波与均值滤波比较:
优势:在均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响;而在中值滤波其中,噪声成分很难选上,所以几乎不会影响到输出。
劣势:中值滤波花费的时间是均值滤波的5倍以上。
注意:中值滤波虽然可以克服线性滤波器所带来的图像细节模糊,但是在线、尖顶等细节多的图像不宜用中值滤波。
在OpenCV中实现中值模糊的API函数为:
def cv.medianBlur(src, ksize, dst=None)
src | 源图像 |
ksize | 卷积核的大小(数字表示,且为奇数) |
注:blur()与medianBlur()中的ksize所表示的卷积核大小的方式不同,前者为数组,后者为数字
实例二:对图像进行中值模糊
import cv2 as cv
# 中值模糊-对椒盐噪声有很好的去噪效果(提取内核区域下所有像素的中值,并将中心元素替换为该中值。这对于消除图像中的椒盐噪声非常有效)
def median_blur_demo(image):
dst = cv.medianBlur(image, 5) # 内核大小应为正奇数整数
cv.imshow("median_blur_demo", dst)
src = cv.imread("lena256.tif")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
median_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
程序执行结果如下图所示:
三、自定义模糊
自定义模糊可实现图像的锐化处理,锐化就是突出图像细节或者增强图像被模糊的地方,锐化原理就是细节增强,图像的导数就是图像的细节,随着导数阶数升高,能代表的东西也不同。
在OpenCV中实现中值模糊的API函数为:
def cv.filter2D(src, ddepth, kernel)
src | 源图像 |
ddepth | 图像深度 |
kernel | 卷积核 |
注:ddepth输入值为-1时,目标图像和原图像深度保持一致
实例三:对图像进行自定义模糊
import cv2 as cv
import numpy as np
# 自定义模糊-2D卷积(图像过滤)
def custom_blur_demo(image):
# kernel = np.ones([5, 5], np.float32)/25 # 5x5平均滤波器内核
# kernel = np.array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]], np.float32) / 9
# 锐化算子(算子之和必须为奇数,或者为0或1,其中总和为0 做边缘梯度;总和为1 做锐化增强)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst = cv.filter2D(image, -1, kernel=kernel) # 当ddepth输入值为-1时,目标图像和原图像深度保持一致
cv.imshow("custom_blur_demo", dst)
src = cv.imread("lena256.tif")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
custom_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
注:上述代码中kernel卷积核可分别用三种方式进行赋值表示
程序执行结果如下图所示:
参考链接:
https://www.jianshu.com/p/5844b83dd4c4
https://blog.csdn.net/qq_41603898/article/details/81673900
文章评论