图像平滑(模糊)与图像滤波
- 低通滤波和高通滤波
- 学习使用不同的低通滤波器对图像进行模糊
- 使用自定义的滤波器对图像进行卷积(2D 卷积)
- opencv中常见的图像滤波
一、低通滤波和高通滤波
与以为信号一样,我们也可以对 2D 图像实施低通滤波(LPF),高通滤波(HPF)。
- LPF 帮助我们去除噪音,模糊图像
- HPF 帮助我们找到图像的边缘
- 低通滤波器是模糊,高通滤波器是锐化
- 低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。
二、图像卷积概念
在OpenCV中也可以自己定义自己的滤波器,然后使用filter2D函数进行运算。OpenCV 提供的函数 cv.filter2D() 可以让我们对一幅图像进行卷积操作。
dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
- 参数 描述
- src 原图像
- dst 目标图像,与原图像尺寸和通过数相同
- ddepth ddepth表示目标图像的所需深度,它包含有关图像中存储的数据类型的信息,可以是unsigned char(CV_8U),signed char(CV_8S),unsigned short(CV_16U)等等。 当ddepth=-1时,表示输出图像与原图像有相同的深度。
- kernel 卷积核(或相当于相关核),单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用拆分将图像拆分为单独的颜色平面,然后单独处理它们。
- anchor 内核的锚点,指示内核中过滤点的相对位置;锚应位于内核中;默认值(-1,-1)表示锚位于内核中心。
- detal 在将它们存储在dst中之前,将可选值添加到已过滤的像素中。类似于偏置。
- borderType 像素外推法,参见BorderTypes
下面我们将对一幅图像使用平均滤波器。下面是一个 5x5 的平均滤波器核:
操作过程:将核放在图像的一个像素 A 上,求与核对应的图像上 25(5x5)个像素的和,在取平均数,用这个平均数替代像素 A 的值。重复以上操作直到将图像的每一个像素值都更新一边
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('hair.jpg')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
# 显示图像
plt.figure(figsize = (15, 10))
plt.subplot(121),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging'),plt.xticks([]), plt.yticks([])
plt.show()
三、图像平滑(模糊)
-
使用低通滤波器可以达到图像模糊的目的。
-
去除噪音。其实就是去除图像中的高频成分(比如:噪音,边界)。所以边界也会被模糊一点。也有一些模糊技术不会模糊掉边界。
-
平滑(模糊)和滤波的区别: 它们都属于卷积,不同滤波方法之间只是卷积核不同(对线性滤波而言)
四、图像滤波
图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。图像滤波可以通过公式:
其中K为滤波器,在很多文献中也称之为核(kernel)。常见的应用包括去噪、图像增强、检测边缘、检测角点、模板匹配等。
OpenCV 提供五种常见的图像滤波方式:线性滤波(方框滤波、均值滤波、高斯滤波);非线性滤波(中值滤波、双边滤波)</