OpenCV(python)——一键入门--第六篇(图像卷积与模糊)

1:图像卷积

图像卷积可以看成是一个小窗口区域(卷积核)在另一个窗口区域上移动。

这种移动是从左到右,从上到下,有时候可以改变其步长的移动。

对每个小窗口所覆盖的区域进行相乘再相加,就是卷积操作。

(这个窗口可以理解成一个二维矩阵,里面有预先设置好的值)

可以搭配下列代码理解

import cv2 as cv
import numpy as np
#图像卷积

def custom_blur(src):
    h, w, ch = src.shape
    result = np.copy(src)
    for row in range(1, h-1, 1):
        for col in range(1, w-1, 1):
            #这里模拟一个3*3的卷积核,可以搭配图片理解
            v1 = np.int32(src[row-1, col-1])
            v2 = np.int32(src[row-1, col])
            v3 = np.int32(src[row-1, col+1])
            v4 = np.int32(src[row, col-1])
            v5 = np.int32(src[row, col])
            v6 = np.int32(src[row, col+1])
            v7 = np.int32(src[row+1, col-1])
            v8 = np.int32(src[row+1, col])
            v9 = np.int32(src[row+1, col+1])

            b = v1[0] + v2[0] + v3[0] + v4[0] + v5[0] + v6[0] + v7[0] + v8[0] + v9[0];
            g = v1[1] + v2[1] + v3[1] + v4[1] + v5[1] + v6[1] + v7[1] + v8[1] + v9[1];
            r = v1[2] + v2[2] + v3[2] + v4[2] + v5[2] + v6[2] + v7[2] + v8[2] + v9[2];
            result[row, col] = [b//9, g//9, r//9]  #这里是取整
    cv.imshow("result", result)

src = cv.imread("ma.jpg")
cv.imshow("input", src)
dst1 = cv.blur(src, (15, 15))
dst2 = cv.blur(src, (255, 255))
custom_blur(src)

cv.waitKey(0)
cv.destroyAllWindows()

2:介绍四种图像模糊的方法

average 图像均值
median  中值模糊
gaussian 高斯模糊
bilateral  双边滤波

import cv2 as cv
import numpy as np
#图像均值(平均数)
#高斯模糊(高斯分布公式生成不同的权重系数给卷积核,用以卷积得到的结果)


src = cv.imread("ma.jpg")
#src = cv.resize(src,(400,400))

dst1 = cv.blur(src, (5, 5))  #图像均值
dst2 = cv.GaussianBlur(src, (5, 5), sigmaX=15)  #高斯模糊
dst3 = cv.GaussianBlur(src, (0, 0), sigmaX=15)
dst4 = cv.medianBlur(src, 5)    #中值滤波
dst5 = cv.bilateralFilter(src, 9,41,41)    #双边滤波

cv.imshow("blur ksize=5", dst1)
cv.imshow("gaussian ksize=5", dst2)
cv.imshow("gaussian sigmax=15", dst3)
cv.imshow("medianBlur", dst4)
cv.imshow("bilateralFilter", dst5)

cv.waitKey(0)
cv.destroyAllWindows()

高斯模糊函数原型:

cv.GaussianBlur( SRC,ksize,sigmaX [,DST [,sigmaY [,borderType ] ] ] ) →DST

src –输入图像;图像可以具有任何数量的信道,其独立地处理的,但深度应CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
dst –输出与图像大小和类型相同的图像src。
ksize –高斯核大小。 ksize.width 并且 ksize.height 可以有所不同,但它们都必须是正数和奇数。或者,它们可以为零,然后从计算 sigma*。
sigmaX – X方向上的高斯核标准偏差。
sigmaY – Y方向上的高斯核标准差:如果 sigmaY 为零,则将其设置为等于 sigmaX;如果两个西格玛均为零,则分别根据ksize.width 和 进行计算 ksize.height(getGaussianKernel()有关详细信息,请参见 link);完全控制的结果,无论这一切的语义未来可能的修改,建议指定所有的ksize,sigmaX和sigmaY。
borderType –像素外推方法(borderInterpolate()有关详细信息,请参见link

以上内容节选自:https://blog.csdn.net/qq_38132105/article/details/105547468

图像均值函数原型:对图像进行算术平均值模糊

cv.blur(src, ksize, dst=None, anchor=None, borderType=None)

ksize:卷积核的大小
dst,若填入dst,则将图像写入到dst矩阵。
borderType:填充方式

中值模糊函数原型:

cv.mediaBlur(src, ksize, dst=None)

ksize:卷积核的大小
dst,若填入dst,则将图像写入到dst矩阵。

双边滤波详解:

bilateral filter双边滤波器的通俗理解

双边滤波(Bilateral Filter)详解

附下图帮助理解

下图是中值滤波的例图

也推荐大家结合这篇博客学习:https://blog.csdn.net/Vici__/article/details/102476784

(完)