欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-03-07 21:21:04
一、均值模糊均值模糊实际上是使用了典型线性滤波算法中的均值滤波算法,是一种线性平滑技术,通过将图像与归一化卷积核进行卷积来实现地。它仅获取内核区域下所有像素的平均值,并替换中心元素。所谓模糊实际上是卷积在图像处理上的一种表现,也可称之为图像的平滑处理过程。均值模糊优点在于效率高,思路简单,缺点是计算均值会将图像中的边缘信息以及特征信息“模糊”掉,会丢失很多有用特征。在OpenCV中实现均值模糊的API函数为:def cv.blur(src, ksize, dst=None, anchor=No...

一、均值模糊

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

在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】模糊操作
左:源图像    右:均值模糊后的图像

二、中值模糊

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

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

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

劣势:中值滤波花费的时间是均值滤波的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】模糊操作
左:源图像     右:中值模糊后的图像

三、自定义模糊

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

在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】模糊操作
左:源图像    右:锐化处理后的图像

参考链接:

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

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

充电视频

 

 

本文地址:https://blog.csdn.net/qq_38052114/article/details/107162010