二维高斯是构建高斯滤波器的基础。二维高斯的分布是一个凸起的帽子形状,如图所示:
概率分布函数为:
这里的σ可以看做两个值,一个是x方向的标准差,一个是y方向的标准差,当、取值越大,整个形状越趋近于扁平, 当、 取值越小,整个形状越凸起。
正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。计算平滑结果时,只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
高斯平滑在图像中去除高斯噪声方面非常有效。
首先确定权重矩阵
假定中心点的坐标为(0,0),那么距离它最近的8个点为:
为了计算权重的值,需要设定σ的值,假定σ=1.5,则模糊半径为1的权重矩阵如下:
(例如:对于(-1,1)点,将x=-1,y=1代入中得0.0453542)
这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵
计算高斯模糊
假设有9个像素点,灰度值(0-255)如下:
每个点乘以对应的权重值:
将这9个值加起来,就是中心点的高斯模糊的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。
如果原图是彩色图片,可以对RGB三个通道分别做高斯平滑
OpenCv API:
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
参数:
import numpy as np
import cv2 as cv
import random
import matplotlib.pyplot as plt
src = cv.imread("E:\\view.jpg")
img = src.copy()
# 调用噪声函数生成高斯噪声图片‘
img_gauss = gasuss_noise(img, mean=0, var=0.01) # 均值为0,方差为0.01
# 高斯滤波
img_gaussianBlur = cv.GaussianBlur(img_gauss, (3, 3), 1)
# 显示图像
cv.imshow("gauss", img_gauss)
cv.imshow("gaussianBlur", img_gaussianBlur)
cv.waitKey(0)
注:gasuss_noise()函数见文章:
python+OpenCv笔记(八):图像噪声(椒盐噪声、高斯噪声)https://blog.csdn.net/qq_45832961/article/details/122309422
高斯噪声图像:
高斯平滑后: