zoukankan      html  css  js  c++  java
  • 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]

     

  • 相关阅读:
    关于ADO.NET连接池
    The Cost of GUIDs as Primary Keys
    数据库反规范设计
    如何快速的呈现我们的网页(转)
    小议数据库主键选取策略(转自吕震宇老师博文)
    javascript 单元测试 (Jsunit应用) 转
    sqlserver版本降级方法
    算术运算表达式正则及分析
    sql STUFF用法
    Flex DashBoard功能
  • 原文地址:https://www.cnblogs.com/skycandy/p/8990566.html
Copyright © 2011-2022 走看看