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]

     

  • 相关阅读:
    第1件事 产品经理工作的8个核心步骤
    产品心经:产品经理应该知道的60件事
    漫画中国式项目管理摘录
    敏捷落地的会议和工具
    UML的9种图例解析
    UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)-转
    UML类图与类的关系详解
    eclipse-4.4.2安装Groovy插件(其他版本eclipse可参考)
    Eclipse 安装Groovy插件
    Groovy安装与入门实例
  • 原文地址:https://www.cnblogs.com/skycandy/p/8990566.html
Copyright © 2011-2022 走看看