python+opencv-03 高斯模糊

python+opencv-03 高斯模糊

  • 高斯与高斯模糊
  • 程序代码
  • 代码分析

高斯与高斯模糊

在这个世界上数学界被分为两类:其他数学家与高斯。他是“数学王子”,是站在数学高峰上的神。我们对他了解最多的是他7岁那一年,在解决1+2+3+……+100时,创造性的发现1+100=101, 2+99=101 , …… , 相当于50个101相加,于是“高斯算法”应运而生,梯形公式就此出现。在他18岁时,他发现了质数分布定理和有序数列搜索算法中的一个经典算法——最小二乘法。从质数分布定理出发,他创造了一套数据处理方法,根据这个新方法,一个具有概率性质的测量结果被得出,将这个结果画成曲线,自然界中一个广泛存在的分布谜团被跃然纸上——高斯分布图,也被叫做正态分布图。从这以后,人们发现不管是人群中身高排布,收入排布,班级的成绩排布,生物种群的年龄排布,都和这条曲线有着或明或暗的联系。
我们可以从百度图片库中找到很多正态分布的图片。
python+opencv-03 高斯模糊_第1张图片
而高斯模糊就是将输入图像的矩阵与服从正态分布的核函数做卷积。从正态分布图可以看出,正态分布图像呈现中间图,两边凹的特点,核函数的数值也是这样的。
接下来我们简单来介绍一下核函数的推导。以3行3列的核函数为例。首先我们定义中心点的坐标为(0,0),我们可以推导出其他点的坐标。
python+opencv-03 高斯模糊_第2张图片
下一步,我们可以求各点坐标距离原点的距离——用平方差来表示。
python+opencv-03 高斯模糊_第3张图片
将上面的值代入高斯分布的表达式里,就求出了对应的正态分布的值:
python+opencv-03 高斯模糊_第4张图片
最后一步,将上面的数据归一化,就可以得到高斯模糊的核函数了。
python+opencv-03 高斯模糊_第5张图片

程序代码

我们继续使用,上一节使用过的从百度图片库下载的悟空的图片在进行验证:
python+opencv-03 高斯模糊_第6张图片
在pycharm中编辑如下代码:

import cv2 as cv

image = cv.imread("pig.jpg")
cv.namedWindow("image show", cv.WINDOW_AUTOSIZE)
cv.namedWindow("gaussian image show", cv.WINDOW_AUTOSIZE)

# 高斯模糊
gaussian = cv.GaussianBlur(image, (5, 5), 0)

cv.imshow("image show", image)
cv.imshow("gaussian image show", gaussian)
cv.waitKey(0)
cv.destroyAllWindows()

运行程序,可以得到高斯模糊之后的图片:
python+opencv-03 高斯模糊_第7张图片
可以发现,高斯模糊对噪声有一定的抑制效果。

【注】高斯模糊在图像处理中有着很高的应用率。在使用Photoshop修图时,我们可以使用高斯模糊来磨皮,或者当细节过多时可以使背景或者人像虚化,从而最北一种朦胧的美感。

代码分析

高斯模糊在OpenCV中的代码为:

GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

我们可以发现它里面定义了六个参数,其中后三个有着默认值。

@参数src input image;图像可以有任意数量的独立处理的通道,但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
@参数 dst输出与src大小和类型相同的图像。
@参数ksize高斯核大小。ksize宽度以及ksize高度可以不同,但它们都必须是正数和奇数。或者,它们可以是零,然后根据sigma计算。
@参数sigmaX高斯核在X方向的标准偏差。
@参数sigmaY高斯核Y方向标准偏差;如果sigmaY为零,则设置为等于sigmaX;如果两个sigma都为零,则从K尺寸宽度以及K尺寸高度,分别(有关详细信息,请参见“getGaussianKernel”);为了完全控制结果,而不考虑将来可能对所有这些语义进行修改,建议指定所有ksize、sigmaX和sigmaY。
@参数borderType,请参见像素外推方法

你可能感兴趣的:(opencv,opencv,计算机视觉)