Python基于OpenCV实现高斯平滑卷积核构建与图像滤波
本文详细解析在Python中利用OpenCV实现高斯平滑的完整流程。内容涵盖奇数尺寸高斯卷积核的数学构建步骤,包括矩阵计算、求和及归一化处理。同时介绍利用getGaussianKernel函数分离构建一维水平与垂直核的方法,并通过具体代码演示如何对图像依次进行水平与垂直方向卷积,最终实现高效的高斯模糊效果。
假设存在一个列数为W、行数为H的高斯卷积核,其中W和H均为奇数。该卷积核的中心点(描点)坐标位于((H-1)/2, (W-1)/2)。构建该高斯卷积核的具体步骤如下:
1. 计算高斯矩阵

2. 计算高斯矩阵所有元素的总和

3. 将高斯矩阵的每个元素除以其总和,完成归一化处理

接下来,利用Python代码实现高斯卷积算子的构建过程。
def getGaussKernel(sigma, H, W):
r, c = np.mgrid[0:H:1, 0:W:1]
r -= (H - 1) / 2
c -= (W - 1) / 2
gaussMatrix = np.exp(-0.5 * (np.power(r) + np.power(c)) / math.pow(sigma, 2))
# 计算高斯矩阵的和
sunGM = np.sum(gaussMatrix)
# 归一化
gaussKernel = gaussMatrix / sunGM
return gaussKernel
高斯卷积核可以分解为一个一维水平方向的高斯核与一个一维垂直方向的高斯核。OpenCV提供了构建一维垂直方向高斯卷积核的函数:Mat getGaussianKernel(int ksize, double sigma, int ktype = CV_64F)。
| 参数 | 释意 |
|---|---|
| ksize | 一维垂直方向上的高斯核行数,正奇数 |
| sigma | 标准差 |
| ktype | 返回值的数据类型为CV_32F或CV_64F,默认是CV_64F |
下面通过Python代码具体演示图像的高斯平滑处理。首先对图像进行水平方向的卷积操作,随后进行垂直方向的卷积操作。其中,sigma参数代表高斯卷积核的标准差。
def gaussBlur(image,sigma,H,W,_boundary = 'fill', _fillvalue = 0):
#水平方向上的高斯卷积核
gaussKenrnel_x = cv2.getGaussianKernel(sigma,W,cv2.CV_64F)
#进行转置
gaussKenrnel_x = np.transpose(gaussKenrnel_x)
#图像矩阵与水平高斯核卷积
gaussBlur_x = signal.convolve2d(image,gaussKenrnel_x,mode='same',boundary=_boundary,fillvalue=_fillvalue)
#构建垂直方向上的卷积核
gaussKenrnel_y = cv2.getGaussianKernel(sigma,H,cv2.CV_64F)
#图像与垂直方向上的高斯核卷积核
gaussBlur_xy = signal.convolve2d(gaussBlur_x,gaussKenrnel_y,mode='same',boundary= _boundary,fillvalue=_fillvalue)
return gaussBlur_xy
if __name__ == "__main__":
image = cv2.imread("../images/timg.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
#高斯平滑
blurImage = gaussBlur(image, 5, 400, 400, 'symm')
#对bIurImage进行灰度级显示
blurImage = np.round(blurImage)
blurImage = blurImage.astype(np.uint8)
cv2.imshow("GaussBlur", blurImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果截图如下:

以上为基于Python和OpenCV实现高斯平滑的完整内容,更多Python高斯平滑相关技术资料,敬请关注本站其他文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













