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矩阵。
双边滤波详解:
附下图帮助理解
下图是中值滤波的例图
也推荐大家结合这篇博客学习:https://blog.csdn.net/Vici__/article/details/102476784