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]

     

  • 相关阅读:
    2013 蓝桥杯B组C++
    Kruskal 算法 && Kruskal 重构树
    并查集与其优化(启发式合并、压缩路径)
    【2021 首祭】一周晴天
    Docker以过时,看Containerd怎样一统天下
    史上最全的Nginx配置文档
    Windows环境Android studio运行RN项目,Node突然闪退
    solr docker 配置
    腾讯2017暑期实习生编程题详解
    华为2016研发工程师编程题详解
  • 原文地址:https://www.cnblogs.com/skycandy/p/8990566.html
Copyright © 2011-2022 走看看