python 一维和二位数据的高斯模糊滤波

高斯分布(正态分布)函数:

高斯函数二阶函数:

    def calc(self,x,y=0):
        if self.level==1:
            return 1/((2*math.pi)**0.5*self.sigema)*math.exp(-(x**2/2/(self.sigema**2)))
        elif self.level==2:
             return 1/(2*math.pi*self.sigema*self.sigema)*math.exp(-(x**2+y**2)/2/self.sigema/self.sigema)

 σ为标准差

定义一个模糊半径,通过上述公式获取到需要的核函数

如半径r=1 ,σ=2

一阶时为x=[-1,0,1],生成核为[0.176033,0.199471,0.176033]/data.sum()

及把[0.319168,0.361664,0.319168]作为下面计算的卷积和

 

对于边缘数据进行镜像模糊对称 ,再将数据进行卷积运算即可得出滤波数据

模糊算法:

  def VerticalFlipping(self,data):#垂直翻转
        if data.shape[0]<=1:
            return data
        newarray=np.zeros(data.shape)
        for i in range(data.shape[0]):
            newarray[i]=data[-i-1]
        return newarray
    def HorizontalFlipping(self,data):#水平翻转
        if data.shape[1]<=1:
            return data
        newarray=np.zeros(data.shape)
        for i in range(data.shape[1]):
            newarray[:,i]=data[:,-i-1]
        return newarray       
    def  fuzzy(self,data):#图像边缘模糊算法: 镜像模糊
        data=np.array(data)  
        if self.level==2:
            data=np.row_stack((self.VerticalFlipping(data[:self.radius]),data))
            data=np.row_stack((data,self.VerticalFlipping(data[-1:])))
        data=np.column_stack((self.HorizontalFlipping(data[:,:self.radius]),data))
        data=np.column_stack((data,self.HorizontalFlipping(data[:,-self.radius:]) ))
        return data

滤波方法

#滤波函数  
    def filter(self, data, template):
        arr=self.fuzzy(data)
        height=arr.shape[0]  
        width=arr.shape[1]  
        newData=np.zeros((height, width)) 
        if self.level==1:
            for i in range(arr.shape[0]):
                for j in range(self.radius,arr.shape[1]-self.radius):
                    t=arr[i, j-self.radius:j+self.radius+1]
                    a=np.multiply(t,template)
                    newData[i,j]=a.sum()
            return newData[:,self.radius:-self.radius]
        elif self.level==2:   
            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 newData[self.radius:-self.radius,self.radius:-self.radius]

 

原文地址:https://www.cnblogs.com/skycandy/p/8990566.html