计算机视觉-高斯滤波

来源:互联网 发布:头戴耳机 隔音 知乎 编辑:程序博客网 时间:2024/05/16 17:16

高斯滤波

高斯滤波:
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和领域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作:用一个模板扫描图像中的每一个像素,用模板确定的领域内像素的加权平均灰度值去替代模板中心像素点的作用。
高斯模糊:
我们常说的高斯模糊使用高斯滤波器完成,高斯模糊是低通滤波器的一种,也就是滤波函数是低通高斯函数,但是高斯滤波器是指用高斯函数作为滤波函数,至于是不是模糊,要看高斯低通还是高通。低通就是模糊,高通就是锐化。
算法步骤:
高斯滤波一般有两种方式可以实现,用离散化窗口卷积,另一种通过傅立叶变换。
高斯模糊是一个非常典型的图像卷积的例子,本质上,高斯模糊将灰度图像和一个高斯核进行卷积操作。
平均过程:
对于图像来说,进行平滑和模糊,就是利用周边像素的平均值。
这里写图片描述
中间点取周围点的平均值,在图形上相当于产生了模糊的效果,中间的失去了细节。
一维高斯函数:
这里写图片描述
中心点就是原点,u等于0:
二维高斯函数(中心为原点):
这里写图片描述
计算平均值的时候,我们只需要将“中心点”作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。这就是上述的与二维高斯核卷积的过程。
假定σ=1.5,模糊半径为1的权重矩阵如下。去进行卷积。
所以说高斯滤波是一种加权平均的卷积方式。根据sigma的大小来做出一个卷积核。但是高斯模糊只是通过一个模板去和目标图像进行卷积。这大概是最大的区别。
下面我将实现高斯模糊和高斯滤波。
code:
import math  import numpy as np  import Image    class MyGaussianBlur():      #初始化      def __init__(self, radius=1, sigema=1.5):          self.radius=radius          self.sigema=sigema          #高斯的计算公式      def calc(self,x,y):          res1=1/(2*math.pi*self.sigema*self.sigema)          res2=math.exp(-(x*x+y*y)/(2*self.sigema*self.sigema))          return res1*res2      #得到滤波模版      def template(self):          sideLength=self.radius*2+1          result = np.zeros((sideLength, sideLength))          for i in range(sideLength):              for j in range(sideLength):                  result[i,j]=self.calc(i-self.radius, j-self.radius)          all=result.sum()          return result/all          #滤波函数      def filter(self, image, template):           arr=np.array(image)          height=arr.shape[0]          width=arr.shape[1]          newData=np.zeros((height, width))          for i in range(self.radius, height-self.radius):              for j in range(self.radius, width-self.radius):                  t=arr[i-self.radius:i+self.radius+1, j-self.radius:j+self.radius+1]                  a= np.multiply(t, template)                  newData[i, j] = a.sum()          newImage = Image.fromarray(newData)                    return newImage    r=1 #模版半径,自己自由调整  s=2 #sigema数值,自己自由调整  GBlur=MyGaussianBlur(radius=r, sigema=s)#声明高斯模糊类  temp=GBlur.template()#得到滤波模版  im=Image.open('lena1.bmp')#打开图片  image=GBlur.filter(im, temp)#高斯模糊滤波,得到新的图片  image.show()#图片显示