【OpenCV基础笔记6】模糊操作

一、均值模糊

均值模糊实际上是使用了典型线性滤波算法中的均值滤波算法,是一种线性平滑技术,通过将图像与归一化卷积核进行卷积来实现地。它仅获取内核区域下所有像素的平均值,并替换中心元素。所谓模糊实际上是卷积在图像处理上的一种表现,也可称之为图像的平滑处理过程。均值模糊优点在于效率高,思路简单,缺点是计算均值会将图像中的边缘信息以及特征信息“模糊”掉,会丢失很多有用特征。

在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()

程序执行结果如下图所示:

【OpenCV基础笔记6】模糊操作_第1张图片 左:源图像    右:均值模糊后的图像

二、中值模糊

中值模糊实际上是一种非线性平滑技术,取卷积核所覆盖像素中的中值作为中心点的像素值。中值模糊在处理脉冲噪声以及椒盐噪声时效果极佳,能够有效的保护好图像的边缘信息。

中值滤波与均值滤波比较:     

优势:在均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响;而在中值滤波其中,噪声成分很难选上,所以几乎不会影响到输出。     

劣势:中值滤波花费的时间是均值滤波的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基础笔记6】模糊操作_第2张图片 左:源图像     右:中值模糊后的图像

三、自定义模糊

自定义模糊可实现图像的锐化处理,锐化就是突出图像细节或者增强图像被模糊的地方,锐化原理就是细节增强,图像的导数就是图像的细节,随着导数阶数升高,能代表的东西也不同。

在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卷积核可分别用三种方式进行赋值表示

程序执行结果如下图所示:

【OpenCV基础笔记6】模糊操作_第3张图片 左:源图像    右:锐化处理后的图像

参考链接:

https://www.jianshu.com/p/5844b83dd4c4

https://blog.csdn.net/qq_41603898/article/details/81673900

充电视频

 

 

你可能感兴趣的:(OpenCV,Python,图像处理)