精华内容
下载资源
问答
  • 加权均值滤波算法:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度。可以对其进行改进,主要避开对景物边缘的平滑处理。加权均值滤波方法是,对待处理的当前像素,选择一个模板...
  • 中值滤波与高斯滤波的实验性对比 代码 可供参考
  • 中值滤波的代码实现

    千次阅读 2021-03-21 16:58:12
    二值图片处理 无论是平均平滑还是高斯平滑,在处理图像噪声...不过这个不是该章节的内容,这一章是要学习中值滤波中值滤波本质上是一个统计排序滤波器,是以该点为中心的的邻域内的所有像素的统计排序中值作为该点的

    二值图片处理

    无论是平均平滑还是高斯平滑,在处理图像噪声时,都或多或少会对图片产生一定的模糊,损失部分信息。较为理想的情况,是可以选择性地进行滤波,只在噪声区域进行平滑,而在无噪声区域不进行平滑,将模糊的影响降到最低,这就是自适应性滤波的思想。通常噪声的存在,可能会使得附近邻域内,极值的上下差距较大,或者是方差较大,我们可以设置一定的阈值来判断该点是否需要进行平滑。不过这个不是该章节的内容,这一章是要学习中值滤波,中值滤波本质上是一个统计排序滤波器,是以该点为中心的的邻域内的所有像素的统计排序中值作为该点的响应;而平滑就是加权平均数作为响应,概念上有一定差别。

       不同的滤波器在处理不同类型的噪声是效果不同,对于线性平滑滤波,在处理像素邻域内的噪声点时,噪
       声或多或少都会影响该点的像素值计算(以高斯平滑为例,距离近则影响大,距离远则影响小,与距离的
       平方呈反比);但是中值滤波通常可以将噪声点直接忽略掉。同时,中值滤波在降噪的同时引起的模糊效
       应较低。中值滤波的一种典型应用,就是用来消除椒盐(salt & pepper)噪声。于是我们先编写一个函数来
       为我们的灰度图像添加椒盐噪声。
    
    from PIL import Image
    import numpy as np
     
    def AddNoise(src, dst, probility = 0.05, method = "salt_pepper"):
     
    	imarray = np.array(Image.open(src))
    	height, width = imarray.shape
     
    	for i in range(height):
    		for j in range(width):
    			if np.random.random(1) < probility:
    				if np.random.random(1) < 0.5:
    					imarray[i, j] = 0
    				else:
    					imarray[i, j] = 255
    	new_im = Image.fromarray(imarray)
    	new_im.save(dst)
     
    gray_girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
    tar = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl_saltpepper.jpg"
     
    AddNoise(gray_girl, tar)
    
       处理之后的图像如下,这就是椒盐噪声。
    

    在这里插入图片描述

         使用平均模板处理之后的图像如下,图片变模糊的同时并没有消除椒盐噪声。虽然没有摆图,但是如果
         使用高斯平滑,也是同样的效果,椒盐噪声的影响依旧存在。
    

    在这里插入图片描述

          使用一个3x3尺寸的中值滤波来处理含有突发性的椒盐噪声的代码如下。其中我们选择的填充方式是无
          填充,也就是对图像边缘,上下左右处忽略掉不进行滤波,只对可以容纳下一个滤波模板的区域滤波。
          这样子的做法好处是代码编写起来比较简单,而一般情况下图像边缘出的信息不是那么重要所以这样子
          做的风险比较小。另外,执行寻找中值的用numpy自带的median方法,我们也可以自己写一个排序算法
          来执行。
    
    from PIL import Image
    import numpy as np
     
    def MedianFilter(src, dst, k = 3, padding = None):
     
    	imarray = np.array(Image.open(src))
    	height, width = imarray.shape
     
    	if not padding:
    		edge = int((k-1)/2)
    		if height - 1 - edge <= edge or width - 1 - edge <= edge:
    			print("The parameter k is to large.")
    			return None
    		new_arr = np.zeros((height, width), dtype = "uint8")
    		for i in range(height):
    			for j in range(width):
    				if i <= edge - 1 or i >= height - 1 - edge or j <= edge - 1 or j >= height - edge - 1:
    					new_arr[i, j] = imarray[i, j]
    				else:
    					new_arr[i, j] = np.median(imarray[i - edge:i + edge + 1, j - edge:j + edge + 1])
    		new_im = Image.fromarray(new_arr)
    		new_im.save(dst)
     
    src = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl_saltpepper.jpg"
    dst = "C:/Users/60214/Desktop/python_work/DigitalExecution/aaa.jpg"
     
    MedianFilter(src, dst)
    
    

    在这里插入图片描述

       代码运行的结果是得到一张处理后的图像,如上图所示。可以看到确实把绝大部分的椒盐点都去除了,除
       了在边缘上一个像素宽度的区域有一些零星的点。但是,跟其他平滑的结果类似的,中值滤波也使得图像
       的清晰度有所下降。这是因为在处理一些边缘的时候也采用了中值滤波,导致了清晰度的下降。所以如果
       要解决这个问题,可以在对像素点赋予邻域的中位数之前添加一个判断条件。因为我们知道,噪声,往往
       都是数值与附近的区域相差很大,接近0或者是255,也就是很大可能是附近邻域内的极值。所以我们的判
       断条件就是,该像素是否是滤波窗口覆盖下邻域的极大值或极小值,如果是就进行中值滤波;如果不是就
       不予处理。修改后的新的代码为
    
    from PIL import Image
    import numpy as np
     
    def BetterMedianFilter(src, dst, k = 3, padding = None):
     
    	imarray = np.array(Image.open(src))
    	height, width = imarray.shape
     
    	if not padding:
    		edge = int((k-1)/2)
    		if height - 1 - edge <= edge or width - 1 - edge <= edge:
    			print("The parameter k is to large.")
    			return None
    		new_arr = np.zeros((height, width), dtype = "uint8")
    		for i in range(height):
    			for j in range(width):
    				if i <= edge - 1 or i >= height - 1 - edge or j <= edge - 1 or j >= height - edge - 1:
    					new_arr[i, j] = imarray[i, j]
    				else:
    					#nm:neighbour matrix
    					nm = imarray[i - edge:i + edge + 1, j - edge:j + edge + 1]
    					max = np.max(nm)
    					min = np.min(nm)
    					if imarray[i, j] == max or imarray[i, j] == min:
    						new_arr[i, j] = np.median(nm)
    					else:
    						new_arr[i, j] = imarray[i, j]
    		new_im = Image.fromarray(new_arr)
    		new_im.save(dst)
     
    src = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl_saltpepper.jpg"
    dst = "C:/Users/60214/Desktop/python_work/DigitalExecution/aaaa.jpg"
    MedianFilter(src, dst)
    
       下图是k=3是的改进后的中值滤波策略的结果,可以看到图像的清晰度得到了较大的保留,噪声的数量就
       相对也残留的比较多。从中可以看到,二者之间有此消彼长的关系。至于为什么还有这么多的椒盐噪声,
       原因是因为我们添加噪声的代码中设置的概率太高了,导致图像中的椒盐噪声数量非常多,在小区域内有
       可能有许多的噪声点,导致算法所寻找到的中值仍然是噪声的数值范围。这种情况下扩大滤波模板的大小
       并不会有多大的改变。此时可以将已经执行过一次中值滤波的结果图像再执行一次中值滤波,效果就会更
       好一些。
    

    在这里插入图片描述
    执行了一次改良过的中值滤波的结果

    在这里插入图片描述
    转载于:https://blog.csdn.net/baidu_41902768/article/details/94451787

    执行了两次改良过的中值滤波的结果

    三通道图片处理

    中值滤波的原理:

    中值滤波,其原理在于使用卷积核内的中值来代替中心点的值。例如,当一个点值为255时,而周围其他点全都低于120,这时候它就是一个明显的噪点。使用中值滤波时,就会用其他的点代替该点的值。不敢说替换的点就是真值,但是它一定比原来的点更接近真值。

    下面将介绍如何使用python代码来实现。(文中所使用的图像为网图,如有侵权请及时联系删除)

    from PIL import Image
    import numpy as np
    class Mdiean_Filter:
         def __init__(self, source_img):
             self.source_img = source_img   #原图
             self.noise_img = './salt_noise.jpg' #加了椒盐噪声之后的图像
             self.mdiean_img = './mdiean_filter.jpg' #中值滤波的图像
             self.k = 3
         def Add_Salt_Noise(self): # 加椒盐噪声
             img = Image.open(self.source_img)
             imgarray = np.array(img)
             height,width = imgarray.shape[0], imgarray.shape[1]
             for i in range(height):
                 for j in range(width):
                     if np.random.random(1) < 0.05:
                         if np.random.random(1) < 0.3:
                             imgarray[i][j] = 0
                         else:
                             imgarray[i][j] = 255
             new_img = Image.fromarray(imgarray)
             new_img.save(self.noise_img)
             return imgarray
         def Mdiean_Filtering(self, padding = None): #中值滤波会变为二值图
             img = Image.open(self.noise_img)
             imgarray = np.array(img)
             height, width = imgarray.shape[0], imgarray.shape[1]
             print(imgarray.shape)
             if not padding:
                 edge = int((self.k -1)/2)
                 if height -1 -edge <=edge or width -1-edge<=edge:
                     print("the kenerl is to long")
                     return  None
                 new_arr = np.zeros((height, width,3), dtype='uint8')
                 print(new_arr.shape)
                 for i in range(height):
                     for j in range(width):
                         if i <=edge -1 or i >= height -1 -edge or  j <=edge -1 or j >= height -1 -edge:
                             new_arr[i, j] = imgarray[i, j]
                         else:
                             new_arr[i, j] = np.median(imgarray[i - edge:i + edge + 1, j -edge:j+edge + 1]) #numpy的代码计算时会把矩阵三个数值变成一样,这也是色彩损失的原因
                 new_img = Image.fromarray(new_arr)
                 new_img.save(self.mdiean_img)
    
         def Mdiean_Filter1(self, padding = None): #中值滤波不损失色彩
    
             imgarray = self.Add_Salt_Noise()
             height, width = imgarray.shape[0], imgarray.shape[1]
    
             if not padding:
                 edge = int((self.k -1)/2)
                 if height -1 -edge <=edge or width -1-edge<=edge:
                     print("the kenerl is to long")
                     return  None
                 for i in range(height):
                     for j in range(width):
                         if i <=edge -1 or i >= height -1 -edge or  j <=edge -1 or j >= height -1 -edge:
                             imgarray[i][j] = imgarray[i][j]
                         else:
    
                             num = []
                             for m in range(i - edge, i + edge + 1):
                                 for n in range(j -edge, j+edge + 1):
                                     num.append((imgarray[m][n])[0]) #这里通过彩色图像第一个值计算中值也可以改为第二个或者第三个
                             temp = np.median(num)
                             idex_tem = num.index(temp)  #获取中值在数组中的坐标
                             l1 = int((idex_tem / self.k ))- edge + i #根据进制转换反推出中值在图像中的坐标
                             l2 = (idex_tem % self.k )- edge + j
                             print(imgarray[l1][l2])
                             imgarray[i][j] = imgarray[l1][l2] #赋值
                             #num1 = np.sort(num)[int(self.k * self.k / 2)]
                             #print(idex_tem)
                             #temp = np.median(imgarray[i][j], imgarray[i - edge][j], imgarray[i - edge][j])
                             #imgarray[i][j] = np.median(imgarray[i - edge:i + edge + 1, j -edge:j+edge + 1])
    
                 new_img = Image.fromarray(imgarray)
                 new_img.save(self.mdiean_img)
    if __name__=="__main__":
        example = 'example.jpg'
        filter = Mdiean_Filter(example)
        #filter.Add_Salt_Noise()
        filter.Mdiean_Filter1()
    
    

    在这里插入图片描述
    转载于:https://www.pianshen.com/article/66921359095/

    代码注解:

    1.基本功能

    #初始化具有三种功能的对象
    lter = Mdiean_Filter(example)
    #加椒盐噪点
    filter.Add_Salt_Noise()
    #二值图片中值滤波
    filter.Mdiean_Filter()
    #三通道图片中值滤波
    filter.Mdiean_Filter1()

    2.
    在两种中值滤波方法中都是用的是含有椒盐噪点的图片,为了反映效果

     imgarray = self.Add_Salt_Noise()
     height, width = imgarray.shape[0], imgarray.shape[1]
    

    但是我们直接使用在原图上既可,将代码改至如下:

    img = Image.open(self.source_img)
    imgarray = np.array(img)
    height, width = imgarray.shape[0], imgarray.shape[1]
    if __name__=="__main__":
        example = "G:/soft/img_done.png"
        filter = Mdiean_Filter(example)
        filter.Mdiean_Filter1()
    
    展开全文
  • 高斯滤波 中值滤波 均值滤波

    千次阅读 2021-02-25 10:27:32
    高斯噪声:顾名思义指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和温度引起的传感器噪声。...中值滤波,将模板内的像素数据,按从小到大的顺序排列,取中间的像素替换原始像素的卷积操作。注:如果

    线性滤波

    方框滤波、均值滤波、高斯滤波,原始数据和滤波结果是一种线性的算术运算,即用加减乘除等运算实现所以称之为线性滤波。

    非线性滤波

    中值滤波、双边滤波。原始数据和滤波结果是一种逻辑关系,即通过比较一定邻域内的灰度值大小来实现的。

    高斯噪声

    顾名思义指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和温度引起的传感器噪声。通常在RGB图像中,显现比较明显。如图:

    椒盐噪声

    通常是由图像传感器,传输通道,解压处理等产生的黑白相间的亮暗点噪声(椒-黑,盐-白)。椒盐噪声往往由图像切割引起,去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。

    降噪是图像卷积运算的重要功能之一;中值模板的卷积对去除椒盐噪声有比较好的作用但均值滤波的降噪效果不佳。对于高斯噪声通过高斯滤波去除噪声。

    我们使用信噪比(Signal NoiseRate)衡量图像噪声,图象的信噪比应该等于信号与噪声的功率谱之比,但通常功率谱难以计算,有一种方法可以近似估计图象信噪比,即信号与噪声的方差之比(其实在均值为零的情况下,功率就是方差)。首先计算图象所有像素的局部方差,将局部方差的最大值认为是信号方差,最小值是噪声方差,求出它们的比值,再转成dB数,最后用经验公式修正。
    如果是灰度图像的话,SNR=(洁净图片中的像素点的灰度值之和)/abs(噪声图片的灰度值之和-洁净图片中的灰度值之和)为该图像的信噪比。

    如何给一幅数字图像加上椒盐噪声:

    1. 指定信噪比 SNR (其取值范围在[0, 1]之间)
    2. 计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
    3. 随机获取要加噪的每个像素位置P(i, j)
    4. 指定像素值为255或者0。
    5. 重复3,4两个步骤完成所有像素的NP个像素
    6. 输出加噪以后的图像
    import cv2
    import numpy as np
    
    filename = "d:/1.jpg"
    winname = "figure"
    img = cv2.imread(filename)
    
    def addSaltNoise():
        # 指定信噪比
        SNR = 0.9
        # 获取总共像素个数
        size = img.size
        # 因为信噪比是 SNR ,所以噪声占据百分之10,所以需要对这百分之10加噪声
        noiseSize = int(size * (1 - SNR))
        # 对这些点加噪声
        for k in range(0, noiseSize):
            # 随机获取 某个点
            xi = int(np.random.uniform(0, img.shape[1]))
            xj = int(np.random.uniform(0, img.shape[0]))
            # 增加噪声
            if img.ndim == 2:
                img[xj, xi] = 255
            elif img.ndim == 3:
                img[xj, xi] = 0
        cv2.imshow(winname, img)
        cv2.waitKey(0)
    
    def main():
        addSaltNoise()
    
    if __name__ == '__main__':
        main()

    中值滤波

    将模板内的像素数据,按从小到大的顺序排列,取中间的像素替换原始像素的卷积操作。

    注:如果数量为偶数那么中位数则是中间两数的均值。中值滤波是一种可以非常有效去除少量异常像素值的滤波方法。

    中值滤波在一定的条件下可以克服常见线性滤波器如方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

    但是中值滤波的缺点也很明显,因为要进行排序操作,所以处理的时间长,是均值滤波的5倍以上。

    void medianBlur( InputArray src, OutputArray dst, int ksize );

    输入图像src,输出图像dst,以及核的大小ksize。注意这里的ksize必须为正奇数1,3,5,7……否则程序会出错。

    均值滤波

    求取模板内的像素均值替代像素值。

     

    高斯滤波

    高斯滤波是最常用的图像去噪方法之一,它能很好地滤除掉图像中随机出现的高斯噪声,高斯滤波是一种低通滤波,它在滤除图像中噪声信号的同时,也会对图像中的边缘信息进行平滑,表现出来的结果就是图像变得模糊。高斯滤波之所以会导致图像变得模糊,是因为它在滤波过程中只关注了位置信息。

    在滤波窗口内,距离中心点越近的点的权重越大;这种只关注距离的思想在某些情况下是可行的,例如在平坦的区域,距离越近的区域其像素分布也越相近,自然地,这些点的像素值对滤波中心点的像素值更有参考价值。但是在像素值出现跃变的边缘区域,这种方法会适得其反,损失掉有用的边缘信息。此时就出现了一类算法——边缘保护滤波方法,双边滤波就是最常用的边缘保护滤波方法(另一种常用来与双边滤波对比的边缘保护滤波方法——引导滤波)。

    双边滤波

    双边滤波的思想很简单,在高斯滤波的基础上加入了像素值权重项,也就是说既要考虑距离因素,也要考虑像素值差异的影响,像素值越相近,权重越大。

    Python: cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst

    函数中的参数依次表示

    src:输入图像,

    d:滤波窗口的直径(函数注释中使用的是Diameter,那么很可能函数中选取的窗口是圆形窗口),

    sigmaColor:像素值域方差,颜色空间的标准差,即灰度值相似性高斯函数标准差,一遍尽可能大。

    sigmaSpace:空间域方差,以及边缘处理方式。一般尽可能小,参数越大,邻近像素将会在越远的地方mix

    引导滤波

    引导滤波与双边滤波相似,同样具有保持边缘的特性,在引导滤波中,用到了局部线性模型,用如下图进行简单理解:

    某函数上一点与其临近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需要计算所有包含该点的线性函数的值做平均即可。这种模型,在表示非解析函数上非常有用。

    在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。

    引导滤波最大的优势在于,可以写出时间复杂度与窗口大小无关的算法,因此在使用大窗口处理图片时,其效率更高。

    在图像去雾、图像抠图上均有相应的应用。

    最小二乘滤波(WLS)

     

     

    参考

    1、https://blog.csdn.net/firstlai/article/details/77675344

    2、https://blog.csdn.net/weixin_43194305/article/details/88959183?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs&dist_request_id=5df70368-b884-4333-9019-48a25179440b&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs

    3、https://blog.csdn.net/tsfx051435adsl/article/details/78251739

     

     

     

     

     

     

    展开全文
  • 中值滤波器是一种非线性数字滤波技术,常用于通过拉普拉斯分布去除噪声。 中值滤波器的主要思想是逐个条目遍历信号条目,用相邻条目的中值替换每个条目。 邻居的模式称为“窗口”,它在整个信号上逐项滑动。
  • 今天给大侠简单带来FPGA verilog HDL实现中值滤波,话不多说,上货。 一、实现步骤: 1、查看了中值滤波实现相关的网站和paper; 2、按照某篇paper的设计思想进行编程实现; 3、对各个模块进行语法检查、波形仿真...

    ​大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

    今天给大侠简单带来FPGA verilog HDL实现中值滤波,话不多说,上货。

    一、实现步骤:

    1、查看了中值滤波实现相关的网站和paper;

    2、按照某篇paper的设计思想进行编程实现;

    3、对各个模块进行语法检查、波形仿真、时序设计、调试验证;

    4、与matlab的中值滤波结果进行比较。
     

    二、实现过程:

    1、查看了中值滤波实现相关的网站和paper;

    在网上看了很多中值滤波的设计,也有一些代码可以下载,也有一片讲解的,只是感觉讲解的比较模糊而且不完整,最后看了几篇硕士论文,论文竟然主要做了中值滤波的工作,发现了一些设计思路,然后就按照自己的想法进行设计。

    2、按照某篇paper的设计思想进行编程实现;

    整个中值滤波模块分为几个小的模块:3*3窗口生成模块、计数器控制模块、3*3中值滤波模块、顶层模块以及最后的测试模块testbench的编写。

    整个框架的设计如下图所示(使用visio画的框架图):

     

    各个模块的设计:

    1)ROM IP核的生成,用于存储原始灰度图像的数据。
    使用matlab生成.coe图像数据文件,然后使用Xilinx ISE工具将.coe文件添加到ROM核进行数据初始化,按步骤得到ROM模块,参考生成的.v文件在顶层模块直接调用即可。

    rom_512by512 rom_512by512_inst
     (
       .clka(CLK),          //input clka;
       .addra(rom_addr),   //input-from 
       .douta(rom_data)     //output-to 
     );

    注意ROM的存储空间的大小;
     

    2)3*3窗口生成模块,用于生成滤波的滑动窗口,得到窗口内的所有元素数据。

    功能:

    (1)根据中心像素点得到所在其所在的行、列位置;

    (2)根据该模块的开始信号设计得到获取数据的有效时间序列;

    (3)在读取数据的有效时序内,得到窗口内的所有元素数据;

    (4)窗口数据的获取按照一定的时序顺序来获得,类似于黑金推荐的“仿顺序操作”,这个比较适合my style;不过后来发现调试的过程中被项目组的硬件人员改动了一些,甚至说不好,感觉可能是本人还没有理解掌握吃透“仿顺序操作”的精髓吧。

    (5)根据中心像素点的行、列位置信息得到每个窗口元素的ROM地址,根据某一时刻ROM地址,下一时刻调用ROM模块得到对应的元素数据,下一时刻将数据锁存,然后再读取该地址的数据;所以要注意地址和数据的获取不是在同一时刻,而是需要延迟两个时刻;

    (6)还需要注意的是图像的边界问题的特殊化处理;一般图像处理都会遇到边界问题,这个需要谨慎;

    (7)对matlab的中值滤波函数medfilt2原理的深入掌握对我们编写这一模块非常重要。matlab并没有主要过程的代码,看注释默认情况下边界元素设置为0,这也可以通过结果反推回去发现的。

     

    3)计数器控制模块,主要用于获得中心像素点的地址信息。

    (1)系统模块开始信号之后开始获取第一个中心像素点,注意初始化信号值和系统开始的信号值的区别;

    (2)该时刻得到的的数据将在下一个时刻产生结果,该时刻的数据并没有改变;

    (3)注意中心像素点的行、列位置信息的计算;

     

    4) 3*3中值滤波模块

    功能:得到某一中心像素点的3*3滑窗区域的灰度值的中值,作为中心像素点的值;

    中值滤波原理,网上有很多,大家可以查看一下。

    本项目采用的是快速中值滤波的方法。

    (1)若是3*3窗口生成模块完成之后就计算下一个中心像素点,需要将该中心像素点的窗口元素锁存起来,以防计算过程中将这些元素掩盖,不能正确进行中值滤波的计算;

     

    (2)需要在时序的有效区域内进行计算,怎么设计信号的有效性;

     

    (3)仿顺序操作可以分开进行;每一个时刻只进行一个操作,这样可能更明了(代码中没有这样做);

     

    (4)verilog编程调用函数的方法,指出输入信号,函数内可以使用其他定义声明的信号,最后的输出信号作为调用函数的结果(突然想起来,如果输出信号有多个元素呢,又该怎么办呢?大家可以想想);

     

    该模块的代码:

     

    5)顶层模块

    用于将低层的各个功能/控制模块衔接起来,得到结果;注意输入输出信号,以及不同模块之间是如何进行连线的。信号的名称尽量有其特别的意义,不要重复使用同一个信号名称,容易造成混乱;

     

    区别wire和reg类型数据的使用情况;

     

    6)测试模块

    如何将数据写入文件,需要定义文件的名称和类型;

    integer fouti;

    需要在初始化部分打开文件:

    fouti = $fopen("medfilter2_re.txt");

    代码如下:

    整体的代码就是这样的。

     

    3、对各个模块进行语法检查、波形仿真、时序设计、调试验证;

    本人觉得原理清楚之后按部就班的编写代码还好,只是刚接触波形仿真和调试的时候是真心不顺心,还好有其他人帮忙调试;在调试的过程中其实会学习到很多东西,很多经验,以及很简单的但你之前就是不知道的知识,这就是一个实践的过程,有时候你根本不知道错误在哪里,这怎么会是错误的呢,为什么不可以这样写,我觉得这样写才是正确的,这些就是在调试过程中本人的真实心情写照呀。可是,没有那么多为什么,verilog就是这样编程的,只是你不知道而已!这才是最伤人的,因为你不知道!

    仿真调试的过程中遇到的问题以及解决方法有空专门写一篇,调试的过程中最好是一个一个模块的测试,特别是关键信号的数值,最好搞懂整体模块和各个模块的时序设计过程,推荐使用TimeDesigner进行波形的设计;另外还需要有关联的两个甚至多个不同模块信号的交叉仿真验证。

     

    4、与matlab的中值滤波结果进行比较

    使用matlab编程基于自带的中值滤波函数得到处理之后的图像与数据,并将verilog得到的滤波数据转换为图像,将二者进行比较

    使用matlab自带的中值滤波函数medfilt2生成原图像的灰度图像的滤波数据;
    % mcode to median filter for one jpg image, and create a image data file
    src = imread('lena.jpg');
    gray = rgb2gray(src);
    medfilt2im = medfilt2( gray );
    [m, n] = size( medfilt2im );                  % m行 n列
    N = m*n;                               %%数据的长度,即存储器深度。
    word_len = 8;                          %%每个单元的占据的位数,需自己设定
    lena_gray = reshape(gray', 1, N);% 1行N列
    lena_medfilt = reshape(medfilt2im', 1, N);% 1行N列
    fid_gray=fopen('lena_gray.txt', 'wt');       %打开文件
    fid_medfilt=fopen('lena_medfilt.txt', 'wt');       %打开文件
    % fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');
    % fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n');
    for i = 1 : N-1
    fprintf(fid_gray, '%d,\n', lena_gray(i));%使用%x表示十六进制数
    end
    fprintf(fid_gray, '%d;\n', data(N));                 %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
    fclose(fid_gray);                            %%关闭文件
    for i = 1 : N-1
    fprintf(fid_medfilt, '%d,\n', lena_medfilt(i));%使用%x表示十六进制数
    end
    fprintf(fid_medfilt, '%d;\n', lena_medfilt(N));                 %%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
    fclose(fid_medfilt);                            %%关闭文件
     

    将medfilt2函数和verilog产生的滤波数据转换为图像,并与matlab直接产生的滤波图像进行对比,代码如下:
    % code to create image data from txt file
    clc;
    clear all;
    close all;
    I_rgb = imread('lena.jpg');
    subplot(2, 3, 1), imshow(I_rgb), title('lena-rgb')

    I_gray = rgb2gray(I_rgb);
    subplot(2, 3, 2), imshow(I_gray), title('lena-gray')

    medfilt_m_load = load('.\lena_medfilt.txt');
    %medfilt_m_load = load('.\lena.coe');
    medfilt_v_load = load('.\medfilter2_reV1.txt'); % verilog 产生的中值滤波之后数据

    medfilt2im = medfilt2( I_gray );
    subplot(2, 3, 3), imshow(medfilt2im), title('lena-medfilt2')

    m = 512;
    n = 512;
    medfilt_m = reshape(medfilt_m_load, m, n);
    medfilt_v = reshape(medfilt_v_load, m, n);
    medfilt_m = uint8(medfilt_m');
    medfilt_v = uint8(medfilt_v');

    aa = medfilt2im - medfilt_m;
    bb = medfilt2im - medfilt_v;
    cc = medfilt_m - medfilt_v;

    subplot(2, 3, 5), imshow(medfilt_m), title('medfilt-matlab');
    subplot(2, 3, 6), imshow(medfilt_v), title('medfilt-verilog');
     

    显示的结果如下图所示:

    结果:两种滤波产生的图像数据完全一致,不过感觉函数直接产生的图像颜色更深一些,不知道为什么。

    这里需要了解一下medfilt2这个函数的原理。结果数据表明,默认情况下该函数对图像边界采用的是补0的方法进行处理的。

     

    结论

    中值滤波终于告一段落了!简单的问题还是需要深入进去研究的,实践的过程中你才会发现自己之前了解的东西是多么的浅薄,对已知的知识掌握的是多么的流于表面!最后结果的数据还是很让人开心的!

    后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

    大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

    展开全文
  • 中值滤波的基本思想是将图像中每个像素的灰度值用其邻域内像素灰度的中值代替,它是一种非线性平滑滤波算法。 设加噪图像为 f(x,y) ,经中值滤波处理后的图像为g(x,y) ,则: 式中,S是(x,y)像素点的邻域。本实验...

    一、原理_中值滤波

    中值滤波的基本思想是将图像中每个像素的灰度值用其邻域内像素灰度的中值代替,它是一种非线性平滑滤波算法。
    设加噪图像为 f(x,y) ,经中值滤波处理后的图像为g(x,y) ,则:
    公式

    式中,S是(x,y)像素点的邻域。本实验分别选用3×3、5×5、7×7的中值滤波窗口对图像进行处理。

    需要注意的是,当模板滑动到图像边缘时,模板的部分行或列就会处于图像之外,本实验可采用下面的任一种方法处理这种问题:
    ①先在图像边缘以外补上一行和一列灰度为零的像素点,再对原图像中的每个像素点进行模板处理。
    ②保留图像的边缘像素,对其它像素进行模板处理。

    二、步骤

    (1)读入原图像lena.bmp并显示;
    (2)对原图像分别添加高斯噪声和椒盐噪声,并显示加噪图像;
    (3)采用中值滤波进行去噪处理,并显示去噪图像;

    三、实验图像

    图片

    lena.bmp

    四、框图

    框图

    五、代码

    %------------------------------------------------------------------------
    % File name:           second_2
    % Last modified Date:  2021年6月10日20点09分
    % Author:              Jasmine
    % Descriptions:        中值滤波
    %------------------------------------------------------------------------
    
    %清空工作区
    clc,clear,close all;
    %读入原图像
    lena = imread('D:\lena.bmp');
    %显示原图像
    subplot(3,3,1);imshow(lena);title('原图');
    %添加高斯噪声并显示
    guassian_lena = imnoise(lena, 'gaussian', 0, 0.02);
    subplot(3,3,2);imshow(guassian_lena);title('加入 均值:0 方差:0.02 的高斯噪声');
    %添加椒盐噪声并显示
    salt_lena=imnoise(lena,'salt & pepper',0.02);
    subplot(3,3,3),imshow(salt_lena),title('加入噪声密度:0.02的椒盐噪声');
    %高斯噪声   中值滤波
    guassian_lena=rgb2gray(guassian_lena);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %手动中值滤波
    n=3;    %模板大小
    [height, width]=size(guassian_lena);   %获取图像的尺寸(n小于图片的宽高)
    x1=double(guassian_lena);  %数据类型转换
    x2 = x1;  %转换后的数据赋给x2
    for i=1:height-n+1  
        for j=1:width-n+1  
            c=x1(i:i+(n-1),j:j+(n-1)); %在x1中从头取模板大小的块赋给c  
            e=c(1,:);      %e中存放是c矩阵的第一行  
            for u=2:n  %将c中的其他行元素取出来接在e后使e为一个行矩阵 
                e=[e,c(u,:)];          
            end  
            med=median(e);      %取一行的中值
            x2(i+(n-1)/2,j+(n-1)/2)=med;   %将模板各元素的均值赋给模板中心位置的元素  
        end  
    end
    result=uint8(x2);  %转换格式
    subplot(3,3,4);imshow(result);title('高斯噪声 3*3中值滤波');
    %5*5
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %借助MATLAB中值滤波函数中值滤波(以下皆是)
    gua_k2=medfilt2(guassian_lena,[5,5]);
    subplot(3,3,5);imshow(gua_k2);title('高斯噪声 5*5中值滤波');
    %7*7
    gua_k3=medfilt2(guassian_lena,[7,7]);
    subplot(3,3,6);imshow(gua_k3);title('高斯噪声 7*7中值滤波');
    
    %椒盐噪声    中值滤波
    salt_lena=rgb2gray(salt_lena);
    %3*3
    salt_k1=medfilt2(salt_lena);
    subplot(3,3,7);imshow(salt_k1);title('椒盐噪声 3*3中值滤波');
    %5*5
    salt_k2=medfilt2(salt_lena,[5,5]);
    subplot(3,3,8);imshow(salt_k2);title('椒盐噪声 5*5中值滤波');
    %7*7
    salt_k3=medfilt2(salt_lena,[7,7]);
    subplot(3,3,9);imshow(salt_k3);title('椒盐噪声 7*7中值滤波');
    

    六、运行结果

    中值滤波运行结果

    中值滤波运行结果
    展开全文
  • 图像处理——中值滤波

    千次阅读 2021-10-25 11:13:56
    【基本原理/思想中值滤波是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。举个例子: 【具体操作/流程】 用一个奇数点的移动窗口,并将...
  • 在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被...
  • 针对传统中值滤波方法存在的不足,提出一种新的基于噪点检测的自适应中值滤波图像去噪方法。该方法通过自适应地改变滤波窗口的大小,局部检测并判断极值点是否为噪声点,有效地降低了非噪声点误判为噪声点的概率。...
  • 基于多级中值滤波 提升小波技术的图像去噪吴昌东1,江 桦2,邱晓初11.西华大学电气信息学院,成都 610039;2.西南交通大学峨眉校区计算机与通信工程系,峨眉 614202提要:针对实际图像含有椒盐噪声及高斯噪声等混合噪声,...
  • 在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被...
  • 通过本实验,掌握中值滤波处理。 二、实验任务 设计程序,用中值滤波法(模板的大小为3×3)。进行去噪处理。 得出实验结果图像后,分析去噪的具体原因。并尝试使用1×3 1×11 1×21模板去处理图像,并分析不同...
  • 中值滤波原理及其代码实现

    千次阅读 2020-10-26 21:45:35
    本文主要是对高斯滤波,中值滤波原理进行简单介绍,随后用代码实现高斯噪声和椒盐噪声。以及用高斯滤波和中值滤波对这两种图像进行相关的处理。 高斯噪声:就是服从高斯正态分布的噪声,通常是因为高温或者是传感器...
  • 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声...
  • 基于图像并行处理的思想,提出了一种基于横向拓展窗口的快速中值滤波算法。算法将传统的方形窗口进行横向拓展,从而改变滤波窗口漫游的滑动步长,同时可以有效利用算法执行过程中的比较信息,达到提高整幅图像处理速度的...
  • 文章目录中值滤波介绍opencv自带的中值滤波函数简单算法实现中值滤波快速算法实现中值滤波 中值滤波介绍 中值滤波介绍 中值滤波定义:将????(????为奇数)个数据按其值????????进行从大到小或者从小到大排列后得到一...
  • 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 图像滤波的主要目的:为了消除图像中...
  • 快速中值滤波——Python实现

    千次阅读 2019-02-28 11:31:44
    中值滤波是空域中常用的一种滤波方式,是一种非线性的滤波。它的原理就是将窗口像素排序,取中值,然后移动窗口,不断重复取中值的过程。 快速中值滤波中值滤波的优化版,它利用了窗口每次平移时,没有移出窗口的...
  • 算术均值滤波与中值滤波去噪

    千次阅读 2020-03-11 11:45:18
    算术均值滤波与中值滤波去噪 我们知道在图像生成和传输的过程中,很容易产生噪声干扰。噪声其实分为很多类型,分为泊松噪声、椒盐噪声等。这我们就不一一赘述了,我们主要介绍一下如何通过算术均值滤波和中值滤波对...
  • 图像平滑处理-中值滤波

    万次阅读 多人点赞 2018-11-06 15:57:18
    图像平滑处理-中值滤波1.什么是滤波?2.平滑处理的目的3.平滑处理的应用4.中值滤波的处理方法5.中值滤波的示意图椒盐噪声6.椒盐处理和中值滤波的效果展示7.代码(面向过程)8.程序演示(面向对象) 1.什么是滤波? ...
  • 中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度...
  • 中值滤波

    万次阅读 多人点赞 2017-06-05 11:54:00
    与之前介绍的均值处理的思想有所不同,中值滤波是通过对邻域内像素按灰度排序的结果决定中心像素的灰度。具体的操作过程如下:用一个奇数点的移动窗口,将窗口中心点的值用窗口内各点的中值代替。假设窗口内有5个点...
  • 移动均值滤波与中值滤波

    万次阅读 2017-05-24 17:08:26
    引言基于MATLAB,使用中值滤波与均值滤波器进行滤波操作简单,原理也容易理解。好理解,也只针对于数据处在中间部分能够正好能够取到一个完整窗口,但是当数据恰巧在两端时,如何计算均值或者中值确是值得思考的问题...
  • 图像噪声: 椒盐噪声(脉冲噪声):随机出现的噪声,成因可能是有影像信号受到突如其来的强烈干扰而产生...采用均值滤波模板对图像噪声进行滤除。令Sxy 表示中心在(x, y)点,尺寸为m×n 的矩形子图像窗口的坐标组。由
  • 中值滤波(Median filter)是基于排序统计理论的有效抑制噪声的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,它不依赖于邻域内那些与典型值差别很大的值。 优点:中值滤波无论是在...
  • 相关图像处理概念介绍 “平滑处理“(smoothing)也称“模糊处理”(bluring),是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多,最...滤波可分低通滤波和高通滤波两种。而高斯滤波是指用高斯函数作...
  • 新的快速中值滤波,里面的思想非常好。速度加快了2/3,可以自己添加噪声试验。
  • 文章目录Matlab实现图像滤波(叁):高效的中值滤波0 背景介绍1 高效的中值...基本思想是:用一个中值滤波器窗口依次遍历整个图像,在每个位置都计算得到一个中值,然后将这些值拼在一起就得到了中值滤波后的图像。中
  • 非线性滤波: 中值滤波、双边滤波图像 图像滤波要求: 不能损害图像的轮廓和边缘, 图像清晰视觉效果更好 (1)方框滤波 它是滤波器中最简单的,是通过滤波器核K内每个像素值的平均值得到的,滤波核如下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,380
精华内容 952
关键字:

中值滤波思想