OpenCV篇7---平滑图像

学会目标:
1、用各种低通滤波器模糊图像

2、将定制滤镜应用于图像(2D卷积)

分节讲解

1、二维卷积(图像过滤)

对于一维信号,图像也可以用各种低通滤波器(LPF),高通滤波器(HPF)等进行滤波。LPF有助于消除噪声或模糊图像。 HPF滤镜有助于在图像中找到边缘。

OpenCV提供了一个函数cv2.filter2D()来将内核与图像进行卷积。 作为一个例子,我们将尝试对图像进行平均过滤。 一个5x5的平均滤波器内核可以定义如下:


使用上述内核进行过滤会导致执行以下操作:对于每个像素,一个5x5窗口以此像素为中心,将落在此窗口内的所有像素相加,然后将结果除以25.这等同于计算平均值该窗口内的像素值。 对图像中的所有像素执行此操作以产生输出滤波图像。 试试这段代码并检查结果:

实现代码:

#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:/lena.jpg', 0)
kernel = np.ones((5, 5), np.float32)/25
dst = cv2.filter2D(img, -1, kernel)

cv2.imshow('original', img)
cv2.imshow('result', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:


2、图像模糊(图像平滑)

通过将图像与低通滤波器内核进行卷积来实现图像模糊,这对消除噪音很有用。 它实际上从图像中去除高频内容(例如:噪声,边缘),导致在应用滤波器时边缘模糊。 OpenCV主要提供四种模糊技术:

①、平均

这是通过将图像与标准化的框过滤器进行卷积来完成的。 它仅取内核区域内所有像素的平均值,并用此平均值替换中心元素。 这由函数cv2.blur()或cv2.boxFilter()完成。

注意:如果你不想使用标准化的框过滤器,请使用cv2.boxFilter()并将参数normalize = False传递给该函数。

实现代码:

#coding:utf8
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:/lena.jpg', 0)
blur = cv2.blur(img, (5, 5))

cv2.imshow('original', img)
cv2.imshow('result', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:


②、高斯滤波

在这种方法中,不使用由相同滤波器系数组成的盒式滤波器,而是使用高斯内核。 它使用函数cv2.GaussianBlur()完成。 我们应该指定内核的宽度和高度,它应该是正数和奇数。 我们还应该分别指定X和Y方向的标准偏差sigmaX和sigmaY。 如果只指定sigmaX,则sigmaY等于sigmaX。 如果两者均为零,则从内核大小进行计算。 高斯滤波非常有效地消除图像中的高斯噪声。

cv2.getGaussianKernel()

实现代码:

#coding:utf8
import cv2
img = cv2.imread('F:/lena.jpg', 0)
blur = cv2.GaussianBlur(img,(5,5),0)

cv2.imshow('original', img)
cv2.imshow('result', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:


③、中值滤波

函数cv2.medianBlur()计算核心窗口下所有像素的中值,中心像素被这个中值替换。 这对消除椒盐噪音非常有效。 有一点值得注意的是,在高斯和盒式滤波器中,中心元素的滤波值可以是原始图像中可能不存在的值。 然而,在中值滤波中情况并非如此,因为中心元素总是被图像中的某个像素值替换。 这有效地降低了噪音。 内核大小必须是正奇数。

实现代码:

#coding:utf8
import cv2
img = cv2.imread('F:/lena.jpg', 0)
median = cv2.medianBlur(img,5)

cv2.imshow('original', img)
cv2.imshow('result', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:

④、双边滤波

双边滤波器cv2.bilateralFilter()不是这种情况,该滤波器被定义,并且在保留边缘的同时非常有效地去除噪声。 但与其他过滤器相比,操作速度较慢。 我们已经看到,高斯滤波器将像素周围的一个邻域看作高斯加权平均。 这个高斯滤波器仅仅是空间的函数,也就是在滤波时考虑附近的像素。 它不考虑像素是否具有几乎相同的亮度值,并且不考虑像素是否位于边缘。 其结果是高斯滤波器趋于模糊边缘,这是不希望的。

双边滤波器还在空间域中使用高斯滤波器,但它还使用一个(乘法)高斯滤波器分量,该分量是像素强度差的函数。 空间的高斯函数确保只有像素是'空间邻居'才被考虑用于滤波,而应用在强度域(强度差的高斯函数)中的高斯分量确保只有强度类似于中心 包括像素('强度邻居')以计算模糊强度值。 因此,该方法保留了边缘,因为对于位于边缘附近的像素,放置在边缘另一侧的相邻像素因此与中心像素相比表现出较大的强度变化,因此不会包含在模糊中。

实现代码:

#coding:utf8
import cv2
img = cv2.imread('F:/lena.jpg', 0)
blur = cv2.bilateralFilter(img,9,75,75)

cv2.imshow('original', img)
cv2.imshow('result', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:



猜你喜欢

转载自blog.csdn.net/songchunxiao1991/article/details/80229351