opencv 图像平滑
图像模糊(图像平滑)
- 使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。
- 其实就是去除图像中的高频成分(比如:噪音,边界)。
- 所以边界也会被模糊一点。(当然,也有一些模糊技术不会模糊掉边界)。OpenCV 提供了四种模糊技术
高斯模糊
- 值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。
- 指定高斯核的宽和高(必须是奇数)
- 以及高斯函数沿 X,Y 方向的标准差。
- 如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。
- 如果两个标准差都是 0,那么函数会根据核函数的大小自己计算。
- 高斯滤波可以有效的从图像中去除高斯噪音。
gaussianBlur = cv2.GaussianBlur(img,(5,5),0)
中值模糊
顾名思义就是用与卷积框对应像素的中值来替代中心像素的值。
- 这个滤波器经常用来去除椒盐噪声。
- 前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。
- 他能有效的去除噪声。
median = cv2.medianBlur(img,5)
双边滤波
-
函数 cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音。
-
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。
-
空间高斯函数确保只有邻近区域的像素对中心点有影响,
-
灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。
-
所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。
-
9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)
import cv2
import numpy as np
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(16, 9))
img = cv2.imread('opencv-logo-white.png')
# blur卷积核为 5 * 5
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
blurred = cv2.blur(img,(5,5))
gaussianBlur = cv2.GaussianBlur(img,(5,5),0)
median = cv2.medianBlur(img,5)
bilateralFilter = cv2.bilateralFilter(img,9,75,75)
plt.subplot(231),plt.imshow(img),plt.title('Original', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(blurred),plt.title('Blurred', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(gaussianBlur),plt.title('gaussianBlur', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(median),plt.title('median', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(236),plt.imshow(bilateralFilter),plt.title('bilateralFilter', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.show()