Python+OpenCV 实现简单的高斯滤波(推荐)
本文介绍了使用Python和OpenCV库手动实现高斯滤波的完整过程。内容涵盖高斯核函数的构建原理、权重矩阵的归一化处理,以及针对彩色图像和灰度图像的不同滤波实现逻辑。通过具体代码示例展示了如何生成高斯核并应用滤波算法,同时指出了该原始方法在处理大尺寸图像时的性能局限性。
高斯滤波原理与核函数构建
高斯模糊算法的基本原理
在编写高斯核函数时,核心任务是构建权重矩阵,该矩阵遵循二维高斯分布的形式。需要特别说明的是,当前实现中并未对 sigma(标准差)等于 0 的特殊情况进行单独判断或处理。
具体实现步骤如下:
第一步是构建权重矩阵。
依据高斯分布公式进行计算。

在计算矩阵内部元素时,由于后续需要进行归一化处理,公式中根号下 2Π 的系数会在除法中被约去,因此代码实现中省略了该系数的计算。
第二步是对矩阵元素进行归一化处理。
计算矩阵内所有元素的总和 sum,最后将矩阵中每个元素除以该总和,从而得到归一化后的权重矩阵。
# 高斯核生成函数 kernel_size:滤波核大小 sigma:高斯核函数的局部影响范围
def gauss(kernel_size, sigma):
#定型0填充
kernel = np.zeros((kernel_size, kernel_size))
#确定正态分布中间值
center = kernel_size // 2
# s:方差 sum:记录总和
s = sigma ** 2
sum = 0
for i in range(kernel_size):
for j in range(kernel_size):
#由于最后要进行归一化处理,此处根号下2Π计算可以省略
x, y = i - center, j - center
kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / (2 * s))
sum += kernel[i, j]
#归一化处理后输出
kernel = kernel / sum
return kernel
图像滤波函数实现细节
接下来编写滤波函数,其作用是将图像中每个像素点(边缘像素除外)及其周围邻域像素与权重矩阵相乘,从而完成高斯滤波操作。


需要注意的是,上述函数仅适用于处理彩色图像,因为彩色图像具有 img.shape[2] 这一通道维度,而灰度图像缺少该维度,无法直接使用此方法处理。
# 高斯滤波实现,img:输入图像 kermel:输入高斯核函数
def myfilter(img,kernel):
# 读取img行数核列数
h = img.shape[0]
w = img.shape[1]
# 直接拷贝父对象
img1 = copy.copy(img)
# 去掉边缘
for i in range(1,h-1):
for j in range(1,w-1):
# 三通道处理
for c in range(0,2):
sum = 0
# 加权
for k in range(-1,2):
for l in range(-1,2):
sum += img[i+k,j+l,c]*kernel[k+1,l+1]
img1[i,j,c] = sum
return img1
此外,当前滤波函数的实现是针对 kernel_size 为 3*3 的情况编写的。如果需要更改 kernel_size 的大小,必须相应调整代码中 range 函数的范围。

灰度图像与完整代码示例
以下是针对灰度图像的处理方式:
def myfilter2(img,kernel):
# 读取img行数核列数
h = img.shape[0]
w = img.shape[1]
# 直接拷贝父对象
img1 = copy.copy(img)
# 去掉边缘
for i in range(1,h-1):
for j in range(1,w-1):
sum = 0
for k in range(-1,2):
for l in range(-1,2):
sum += img[i+k,j+l]*kernel[k+1,l+1]
img1[i,j] = sum
return img1
整个程序的完整运行代码如下:
import copy
import cv2
import numpy as np
#图像读取
img_y = cv2.imread('p2.jpg')
# 选择高斯生成函数3*3,其中sigama = 3
kernel = gauss(3,3)
# 打印这个生成函数
print(kernel)
# 高斯滤波处理
img1 = myfilter(img_y, kernel)
cv2.imshow('P1_yuantu',img_y)
cv2.imshow('P1_gaussian', img1)
cv2.waitKey(0)
输入与输出图像的结果展示如下:
原图与经过高斯滤波处理后的图像对比。


需要指出的是,所采用的方法较为原始,如果输入的图像尺寸过大,运行时间将会显著增加。
这方面的内容颇具趣味,本文仅作为初步学习的基础分享,代码中可能存在疏漏或错误,恳请各位专家指正。
到此关于 Python+OpenCV 实现简单高斯滤波的文章介绍完毕,更多相关 Python OpenCV 高斯滤波内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













