OpenCV - 图像平滑(Python实现)

  1. 2D卷积
    与以为信号一样, 我们也可以对 2D 图像实施低通滤波(LPF),高通滤波(HPF)等。 LPF 帮助我们去除噪音,模糊图像。 HPF 帮助我们找到图像的边缘
    OpenCV 提供的函数 cv.filter2D() 可以让我们对一幅图像进行卷积操作。
 cv.filter2D()(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst
参数 释义
src 参数表示待处理的输入图像
ddepth 参数表示目标图像深度,输入值为-1时,目标图像和原图像深度保持一致
kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。修改kernel矩阵即可实现不同的模糊
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('logo.jpg')
kernel = np.ones((5,5),np.float32)/25 #5x5 的平均滤波器核:
dst = cv2.filter2D(img,-1,kernel)
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()

OpenCV - 图像平滑(Python实现)_第1张图片

  1. 平均(低通滤波)
    用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用函数 cv2.blur() 来完成这个任务。
cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
参数 释义
src 参数表示待处理的输入图像
ksize 参数表示模糊内核大小。比如(1,15)表示生成的模糊内核是一个1*15的矩阵
dst 参数表示输出与src相同大小和类型的图像
anchor 参数、borderType参数可忽略
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg')
blur = cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV - 图像平滑(Python实现)_第2张图片

  1. 高斯模糊(低通滤波)
    高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
参数 释义
src 参数表示待处理的输入图像
ksize 参数表示高斯滤波器模板大小。 ksize.width和ksize.height可以不同,但它们都必须是正数和奇数。或者,它们可以是零,即(0, 0),然后从σ计算出来。
sigmaX 参数表示 X方向上的高斯内核标准差。
sigmaY 参数表示 Y方向上的高斯内核标准差。 如果sigmaY为零,则设置为等于sigmaX,如果两个sigma均为零,则分别从ksize.width和ksize.height计算得到。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg')
#0 是指根据窗口大小(25,25)来计算高斯函数标准差
blur = cv2.GaussianBlur(img,(25,25),0)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV - 图像平滑(Python实现)_第3张图片
4. 中值滤波
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

cv2.medianBlur(src, ksize[, dst]) -> dst
参数 释义
src 参数表示待处理的输入图像
ksize 参数表示滤波窗口尺寸,必须是奇数并且大于1。比如这里是5,中值滤波器就会使用5×5的范围来计算,即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。
dst 参数表示输出与src相同大小和类型的图像
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg')
median = cv2.medianBlur(img,25)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(median),plt.title('Median')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV - 图像平滑(Python实现)_第4张图片
5. 双边滤波
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
参数 释义
src 参数表示待处理的输入图像
d 表示在过滤期间使用的每个像素邻域的直径。如果输入d非0,则sigmaSpace由d计算得出,如果sigmaColor没输入,则sigmaColor由sigmaSpace计算得出。
sigmaColor 参数表示色彩空间的标准方差,一般尽可能大。较大的参数值意味着像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色。
sigmaSpace 参数表示坐标空间的标准方差(像素单位),一般尽可能小。参数值越大意味着只要它们的颜色足够接近,越远的像素都会相互影响。当d > 0时,它指定邻域大小而不考虑sigmaSpace。 否则,d与sigmaSpace成正比。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg')
blur = cv2.bilateralFilter(img,25,75,75)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blur')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV - 图像平滑(Python实现)_第5张图片


参考链接:
https://www.cnblogs.com/FHC1994/p/9097231.html

你可能感兴趣的:(【OpenCV】,图像平滑,OpenCV)