精华内容
下载资源
问答
  • 自适应中值滤波

    2013-06-08 19:13:16
    图像的自适应中值滤波程序,基于matlab的编的程序跟大家分享一下,还有一些问题希望大家讨论
  • 自适应中值滤波MATLAB

    2018-09-07 09:42:00
    自适应中值滤波函数。
  • 重点介绍了自适应中值滤波算法以及两种改进的自适应中值滤波算法。针对这3种滤波算法,对含有不同密度椒盐噪声的图像进行去噪实验。结果表明:改进算法去噪效果明显、能有效保护图像细节,PSNR保持在25 dB以上;改进...
  • 利用simulink搭建仿真模型对自适应中值滤波算法进行验证,结果表明所设计系统的有效性和自适应中值滤波算法的准确性
  • 本文对Matlab工具箱中的中值滤波算法进行改进,提出一种基于×字形滤波窗口的自适应中值滤波算法,在有效去除噪声的同时,较好地保持了图像细节,缩短了运行时间。
  • matlab图像处理自适应中值滤波,function, 可运行,很好很好很好
  • 自适应中值滤波 MATLAB

    2015-06-15 19:50:30
    自适应中值滤波 MATLAB 图像处理.
  • 自己实现的自适应中值滤波,代码绝对没有问题,欢迎指正
  • 图像预处理灰度二值自适应中值滤波腐蚀膨胀matlab基础毕设
  • 自适应中值滤波matlab

    2018-07-11 16:58:10
    基于matlab实现的自适应中值滤波器,基于matlab实现的自适应中值滤波器
  • 自适应中值滤波算法

    2014-08-30 10:41:15
    基于阈值判断的自适应中值滤波算法,视频跟踪,图像处理
  • 对图像做自适应中值滤波与小波全局阈值去噪处理,可以在很大程度上去除噪声
  • 只需要改变图片路径即可,亲测,可用。是RAMF自适应中值滤波
  • MATLAB自适应中值滤波算法,适用于图像处理。
  • 实现了一种滤除医学图像脉冲噪声的自适应中值滤波算法,用均方根误差和噪声对原图像的毁坏程度两个客观评价指标对该算法及传统均值、中值滤波方法进行了比较与评价。根据设定条件检测滤波窗口中心像素是否为脉冲噪声...
  • 基于最小方差的自适应中值滤波算法,钟子豪,刘森,在图像处理应用中,图像噪声消除的好坏决定了图像的质量及后续处理的效果。针对图像处理中常常遇到的椒盐噪声,提出了一种基于最
  • 自适应中值滤波及实现

    万次阅读 多人点赞 2018-04-01 21:04:17
    主要就是提出了一种自适应中值滤波算法,这个算法是很经典的中值滤波算法的改进版本,自动选择滤波器的大小,以追求更好的效果。原理十分简单,后面都尽量简短地进行说明。 中值滤波器(Median Filter) 中值滤波...

    前言

    无意中看到了一篇比较老的论文,Adaptive median filters: new algorithms and results。感兴趣的可以下载下来看看。主要就是提出了一种自适应中值滤波算法,这个算法是很经典的中值滤波算法的改进版本,自动选择滤波器的大小,以追求更好的效果。原理十分简单,后面都尽量简短地进行说明。

    中值滤波器(Median Filter)

    中值滤波的思想就是比较一定领域内的像素值的大小,取出其中值作为这个领域的中心像素新的值。假设对一定领域内的所有像素从小到大进行排序,如果存在孤立的噪声点,比如椒盐噪声(椒噪声——较小的灰度值,呈现的效果是小黑点;盐噪声——较大的灰度值,呈现的效果是小白点),那么从小到大排序的这个数组中,那些孤立的噪声一定会分布在两边(要么很小,要么很大),这样子取出的中值点可以很好地保留像素信息,而滤除了噪声点的影响。
    中值滤波器受滤波窗口大小影响较大,用于消除噪声和保护图像细节,两者会存在冲突。如果窗口较小,则能较好地保护图像中的一些细节信息,但对噪声的过滤效果就会打折扣;反之,如果窗口尺寸较大则会有较好的噪声过滤效果,但也会对图像造成一定的模糊效果,从而丢失一部分细节信息。另外,如果在滤波窗口内的噪声点的个数大于整个窗口内像素的个数,则中值滤波就不能很好的过滤掉噪声。

    自适应中值滤波器(Adaptive Median Filter)

    在噪声密度不是很大的情况下(根据经验,噪声的出现的概率小于0.2),使用中值滤波的效果不错。但是当噪声出现的概率比较高时,原来的中值滤波算法就不是很有效了。只有增大滤波器窗口尺寸,尽管会使图像变得模糊。
    使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。
    下面是自适应中值滤波器算法的详细描述:
    预先定义好以下符号:

    • SxySxy:滤波器的作用区域,滤波器窗口所覆盖的区域,该区域中心点为图像中第y行第x列个像素点;
    • ZminZminSxySxy中最小的灰度值;
    • ZmaxZmaxSxySxy中最大的灰度值;
    • ZmedZmedSxySxy中所有灰度值的中值;
    • ZxyZxy:表示图像中第y行第x列个像素点的灰度值;
    • SmaxSmaxSxySxy所允许的最大窗口尺寸;

    自适应中值滤波器分为以下两个过程,AB
    A:
    1. A1 = ZmedZmed - ZminZmin
    2. A2 = ZmedZmed - ZmaxZmax
    3. 如果A1>0A1>0A2<0A2<0,则跳转到B
    4. 否则,增大窗口的尺寸
    5. 如果增大后的尺寸SmaxSmax,则重复A
    6. 否则,直接输出ZmedZmed
    B
    1. B1 = ZxyZxy - ZminZmin
    2. B2 = ZxyZxy - ZmaxZmax
    3. 如果B1>0B1>0B2<0B2<0,则输出ZxyZxy
    4. 否则输出ZmedZmed

    直观解释

    在自适应中值滤波算法中,A步骤里面会先判断是否满足Zmin<Zmed<ZmaxZmin<Zmed<Zmax。这一步骤实质是判断当前区域的中值点是否是噪声点,通常来说是满足Zmin<Zmed<ZmaxZmin<Zmed<Zmax这个条件的,此时中值点不是噪声点,跳转到B;考虑一些特殊情况,如果Zmed=ZminZmed=Zmin或者Zmed=ZmaxZmed=Zmax,则认为是噪声点,应该扩大窗口尺寸,在一个更大的范围内寻找一个合适的非噪声点,随后再跳转到B,否则输出的中值点是噪声点;
    接下来考虑跳转到B之后的情况:判断中心点的像素值是否是噪声点,判断条件为Zmin<Zxy<ZmaxZmin<Zxy<Zmax,原理同上,因为如果Zxy=ZminZxy=Zmin或者Zxy=ZmaxZxy=Zmax,则认为是噪声点。如果不是噪声点,我们可以保留当前像素点的灰度值;如果是噪声点,则使用中值替代原始灰度值,滤去噪声。

    程序实现

    程序中定义了产生椒噪声和盐噪声函数,以及中值滤波和自适应中值滤波的函数。
    程序很基础,不做赘述。

    #include <stdio.h>
    #include <opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    //盐噪声  
    void saltNoise(cv::Mat img, int n)
    {
        int x, y;
        for (int i = 0;i < n / 2;i++)
        {
            x = std::rand() % img.cols;
            y = std::rand() % img.rows;
            if (img.type() == CV_8UC1)
            {
                img.at<uchar>(y, x) = 255;
            }
            else if (img.type() == CV_8UC3)
            {
                img.at<cv::Vec3b>(y, x)[0] = 255;
                img.at<cv::Vec3b>(y, x)[1] = 255;
                img.at<cv::Vec3b>(y, x)[2] = 255;
            }
        }
    }
    
    //椒噪声  
    void pepperNoise(cv::Mat img, int n)
    {
        int x, y;
        for (int i = 0;i < n / 2;i++)
        {
            x = std::rand() % img.cols;
            y = std::rand() % img.rows;
            if (img.type() == CV_8UC1)
            {
                img.at<uchar>(y, x) = 0;
            }
            else if (img.type() == CV_8UC3)
            {
                img.at<cv::Vec3b>(y, x)[0] = 0;
                img.at<cv::Vec3b>(y, x)[1] = 0;
                img.at<cv::Vec3b>(y, x)[2] = 0;
            }
        }
    }
    
    // 中值滤波器
    uchar medianFilter(cv::Mat img, int row, int col, int kernelSize)
    {
        std::vector<uchar> pixels;
        for (int y = -kernelSize / 2;y <= kernelSize / 2;y++)
        {
            for (int x = -kernelSize / 2;x <= kernelSize / 2;x++)
            {
                pixels.push_back(img.at<uchar>(row + y, col + x));
            }
        }
        sort(pixels.begin(), pixels.end());
        auto med = pixels[kernelSize*kernelSize / 2];
        return med;
    }
    
    // 自适应中值滤波器
    uchar adaptiveMedianFilter(cv::Mat &img, int row, int col, int kernelSize, int maxSize)
    {
        std::vector<uchar> pixels;
        for (int y = -kernelSize / 2;y <= kernelSize / 2;y++)
        {
            for (int x = -kernelSize / 2;x <= kernelSize / 2;x++)
            {
                pixels.push_back(img.at<uchar>(row + y, col + x));
            }
        }
    
        sort(pixels.begin(), pixels.end());
    
        auto min = pixels[0];
        auto max = pixels[kernelSize*kernelSize - 1];
        auto med = pixels[kernelSize*kernelSize / 2];
        auto zxy = img.at<uchar>(row, col);
        if (med > min && med < max)
        {
            // to B
            if (zxy > min && zxy < max)
                return zxy;
            else
                return med;
        }
        else
        {
            kernelSize += 2;
            if (kernelSize <= maxSize)
                return adaptiveMedianFilter(img, row, col, kernelSize, maxSize);// 增大窗口尺寸,继续A过程。
            else
                return med;
        }
    }
    
    
    int main()
    {
        int minSize = 3;
        int maxSize = 7;
        cv::Mat img;
        img = cv::imread("lena.bmp");
        cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
        cv::imshow("src", img);
        saltNoise(img, 40000);
        pepperNoise(img, 40000);
        cv::imshow("noise", img);
        cv::Mat temp = img.clone();
    
        // 自适应中值滤波
        cv::Mat img1;
        // 扩展图像的边界
        cv::copyMakeBorder(img, img1, maxSize / 2, maxSize / 2, maxSize / 2, maxSize / 2, cv::BorderTypes::BORDER_REFLECT);
        // 图像循环
        for (int j = maxSize / 2;j < img1.rows - maxSize / 2;j++)
        {
            for (int i = maxSize / 2;i < img1.cols - maxSize / 2;i++)
            {
                img1.at<uchar>(j, i) = adaptiveMedianFilter(img1, j, i, minSize, maxSize);
            }
        }
        cv::imshow("adaptiveMedianFilter", img1);
    
        // 中值滤波
        cv::Mat img2;
        int kernelSize = 3;
        cv::copyMakeBorder(temp, img2, kernelSize / 2, kernelSize / 2, kernelSize / 2, kernelSize / 2, cv::BorderTypes::BORDER_REFLECT);
        for (int j = kernelSize / 2;j < img2.rows - kernelSize / 2;j++)
        {
            for (int i = kernelSize / 2;i < img2.cols - kernelSize / 2;i++)
            {
                img2.at<uchar>(j, i) = medianFilter(img2, j, i, kernelSize);
            }
        }
        cv::imshow("medianFilter", img2);
    
        cv::waitKey();
        cv::destroyAllWindows();
    
        return 0;
    }

    结果截图

    原始图像和添加椒盐噪声后的图像。
    png
    其实截图中看不出很明显的区别,在自己电脑上运行后看结果会清楚点。可以看到使用普通中值滤波的结果相比另一个会模糊一些,且局部仍然会有一小的噪声点。图像边缘多出来的区域不好做中值滤波处理保留了原始图像,所以边缘那一圈仍然有噪声。
    png

    展开全文
  • 自适应中值滤波用于图像去噪,matlab代码
  • matlab课程设计(自适应中值滤波).doc 10信息工程系课程设计报告课程MATLAB课程设计专业通信工程班级2级本科二班学生姓名1景学号114学生姓名2学号1414学生姓名3王学号6学生姓名4学号31学生姓名4学号02二〇一四年十二...

    41528d3028836879cd698677c3999917.gifmatlab课程设计(自适应中值滤波).doc

    10信息工程系课程设计报告课程MATLAB课程设计专业通信工程班级2级本科二班学生姓名1景学号114学生姓名2学号1414学生姓名3王学号6学生姓名4学号31学生姓名4学号02二〇一四年十二月1目录目录2摘要3关键词31算法描述411噪声点412窗口尺寸选择413求滤波窗口内中值,并替换像素点。42程序实现521准备和描述522扩大窗口、确定窗口623确定最大、最小值和中值724中值替换像素点、输出图像8实验结果10参考文献102摘要通过本次课程设计,主要训练和培养学生综合应用所学MATLAB课程的自适应中值的相关知识,独立学习自适应中值滤波的原理及处理方式。学会扩大窗口并找到其区域内的中值、最小值、以及最大值,然后用中值代替像素点。通过自主学习和查阅资料来了解程序的编写及改进,并用MATLAB进行仿真。关键词自适应中值滤波灰度值椒盐噪声像素点31算法描述11噪声点脉冲噪声是图像处理中常见的一类,中值滤波器对消除脉冲噪声非常有效。噪声脉冲可以是正的(盐点),也可以是负的(胡椒点),所以也称这种噪声为“椒盐噪声”。椒盐噪声一般总表现为图像局部区域的最大值或最小值,并且受污染像素的位置是随机分布的,正负噪声点出现的概率通常相等。图像噪声点往往对应于局部区域的极值。12窗口尺寸选择滤波窗口尺寸的选择影响滤波效果,大尺寸窗口滤波能力强,但细节保持能力较弱;小尺寸窗口能保持图像大量细节但其滤波性能较低。根据噪声密度的大小自适应地选择滤波窗口可以缓和滤波性能与细节保持之间的矛盾,同时也增加了算法的时间复杂度。从形状看来窗口方向要沿着边缘和细节的方向,不能穿过它们也不能把它们和周围相差很大的像素包含在同一窗口中否则边缘和细节会被周围像素模糊。13求滤波窗口内中值,并替换像素点。设FIJ为点I,J的灰度,AI,J为当前工作窗口,FMIN、FMAX和FMED分别为AI,J中的灰度最小值、灰度最大值和灰度中值,AMAX为预4设的允许最大窗口。自适应中值滤波算法的基本步骤如下1FMINL右、下、上运算与左同理YOULENDIFSHANGHSHANGHEND窗口确定结束23确定最大、最小值和中值确定最大最小值SMINII,J给SMIN、SMAX初始化SMAXII,JTOTALYOUZUO1SHANGXIA1TOTAL是放大后的像素点的个数TOTAL5525VECT1ZEROS1,TOTAL1TOTAL1为去掉中心点KN1FORINZUOYOUZUOYOUXIASHANG为横纵向扫描FORJNXIASHANGIFINI把灰度值赋给VECT1KNKN1ENDENDENDSMINNANMINVECT1NANMIN包含缺失值的样本的最小值SMAXNANMAXVECT1NANMAX包含缺失值的样本的最大值SMEDNANMEDIANVECT1NANMEDIAN包含缺失值的样本的中值24中值替换像素点、输出图像IFSMEDSMIN0直接输出8ENDIFOMIGA17当滤波半径很大时不再判断FLAG110MI,JSMED直接等于中值输出FLAGI,J0ENDENDENDWHILE第六页WHILE循环END大循环第六页FOR循环END大循环第六页FOR循环IUINT8M变为8位的无符号整形数据IMSHOWI显示图像9实验结果加入07噪点图片经处理后图片参考文献荆仁杰,叶秀清计算机图像处理M北京浙江大学出版社,1988122韩丽娜,耿国华.基于小波变换的真彩图像降噪与增强[J].计算机工程,2010,36(12)224-225.陈初侠,丁勇,刘栎莉.去除椒盐噪声的自适应开关加权均值滤波[J].计算机工程,2010,36(4)210-212.秦虹,王耀南,朱江,等.一种改进的极值均值自适应滤波算法[J].计算机工程与应用,2009,45(32)180-182.贾洪涛,朱元昌,王建华扩展自适应中值滤波器的原理与实现J中国图象图形学报,2004,98948~950

    展开全文
  • 用于图像去除噪声的自适应中值滤波算法,能够有效的去除图像中的噪声达到图像复原的效果,对于学习图像复原和图像处理有很大的帮助
  • 两个自适应中值滤波程序 用matlab编写的,亲测可用
  • 此方法通过二维变分模态分解将图像分解为一系列不同中心频率的子模态,保留其低频模态,并对其进行自适应中值滤波处理,从而得到其去噪后的图像。实验结果表明,与其他几种常用的去噪方法相比,该方法在滤除噪声的...
  • 自适应中值滤波 MATLAB程序

    热门讨论 2010-06-05 18:59:27
    自适应中值滤波 MATLAB程序 滤波效果很好 自适应中值滤波 滤波效果很好

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 373
精华内容 149
关键字:

自适应中值滤波