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]

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM