精华内容
下载资源
问答
  • 均值滤波和中值滤波
    2021-09-15 09:31:04

    ##1. 均值滤波
    ####先创建一个 medfilter.m 文件,代码如下:

    function [output] = meansfilter(input, radius)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % input: 噪声图像
    % r: 图像块半径
    %
    % Auther: Gao Zheng jie
    % Email: 3170601003@cuit.edu.cn
    % Date: 2017-12-19
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    [m n] = size(input);  % 获取图像的行列维度,并分别赋给m和n
    Output = zeros(m, n);  % 定义m*n的零矩阵,用来存放去噪结果图像
    input_pad = padarray(input, [radius radius], 'symmetric');  %边界延拓,使得位于图像边缘的像素点也能形成图像块。
                                                      % symmetric 对边界区域进行对称性重复(也叫镜像镶边),拓展的大小为[r r],f为图像块半径
                                                      %例如[2 3]表示垂直方向拓展2行,水平方向拓展3列
    % 逐行、依次对图像中的每个像素点进行局部均值去噪处理
    for i=1:m  % 行
        for j=1:n  % 列
            % 在延拓后的图像中确定将要修补点的坐标
            x = i + radius;
            y = j + radius;
            % 确定当前像素点的邻域(或者说当前点所在的图像块)
            neighbordhood = input_pad(x-radius:x+radius, y-radius:y+radius);
            output(i,j) = median(neighbordhood(:));  % 先将整个图像块扁平化,然后取中值
        end
    end
    

    ####创建文件 test_medfilter.m 代码如下:

    clc; %清除命令窗口的内容
    clf; %清除图形
    clear; %清除原有变量
    colormap(gray); %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1
    
    img = imread('einstein.jpg');
    input = imnoise(img, 'salt & pepper');  % 添加椒盐噪声,默认噪声密度0.05(噪声密度是指包含噪声值的图像区域的百分比)
    output = medfilter(input, 1);  % 半径为1,即取3*3的图像块
    output = uint8(output);
    
    %figure %创建新的图形窗口
    %colormap(gray) %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1
    clf %清除图形
    subplot(2,3,1),imagesc(img),xlabel('img'); % 原图
    subplot(2,3,2),imagesc(input),xlabel('input'); % 加了噪声的图像
    subplot(2,3,3),imagesc(input-img),xlabel('real noise'); % 计算并显示所加的噪声
    subplot(2,3,4),imagesc(output),xlabel('output'); % 处理后的图像
    subplot(2,3,5),imagesc(input-output),xlabel('residuals noise'); % 计算并显示噪声冗余图像,对去噪结果进行定性比较
    

    将这两个文件放在同一个文件夹下,然后在 matlab 中运行 test_medfilter.m 即可。

    ##2. 中值滤波
    ####先创建一个 meansfilter.m 文件,代码如下:

    function [output] = meansfilter(input, radius)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % input: 噪声图像
    % r: 图像块半径
    %
    % Auther: Gao Zheng jie
    % Email: 3170601003@cuit.edu.cn
    % Date: 2017-12-19
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    [m n] = size(input);  % 获取图像的行列维度,并分别赋给m和n
    Output = zeros(m, n);  % 定义m*n的零矩阵,用来存放去噪结果图像
    input_pad = padarray(input, [radius radius], 'symmetric');  %边界延拓,使得位于图像边缘的像素点也能形成图像块。
                                                      % symmetric 对边界区域进行对称性重复(也叫镜像镶边),拓展的大小为[r r],f为图像块半径
                                                      %例如[2 3]表示垂直方向拓展2行,水平方向拓展3列
    weight = (2*radius+1)^2;  % 算术均值滤波中每一个像素点的权重
    % 逐行、依次对图像中的每个像素点进行局部均值去噪处理
    for i=1:m  % 行
        for j=1:n  % 列
            % 在延拓后的图像中确定将要修补点的坐标
            x = i + radius;
            y = j + radius;
            % 确定当前像素点的邻域(或者说当前点所在的图像块)
            neighbordhood = input_pad(x-radius:x+radius, y-radius:y+radius);
            output(i,j) = sum(sum(neighbordhood))/weight;
        end
    end
    

    ####创建文件 test_medfilter.m 代码如下:

    clc; %清除命令窗口的内容
    clf; %清除图形
    clear; %清除原有变量
    colormap(gray); %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1
    
    img = imread('einstein.jpg');
    input = imnoise(img, 'gaussian');  % 添加高斯噪声,默认均值为0,方差为0.01
    output = meansfilter(input, 1);  % 半径为1,即取3*3的图像块
    output = uint8(output);
    
    %figure %创建新的图形窗口
    %colormap(gray) %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1
    clf %清除图形
    subplot(2,3,1),imagesc(img),xlabel('img'); % 原图
    subplot(2,3,2),imagesc(input),xlabel('input'); % 加了噪声的图像
    subplot(2,3,3),imagesc(input-img),xlabel('real noise'); % 计算并显示所加的噪声
    subplot(2,3,4),imagesc(output),xlabel('output'); % 处理后的图像
    subplot(2,3,5),imagesc(input-output),xlabel('residuals noise'); % 计算并显示噪声冗余图像,对去噪结果进行定性比较
    

    将这两个文件放在同一个文件夹下,然后在 matlab 中运行 test_medfilter.m 即可。

    更多相关内容
  • 均值滤波和中值滤波在matlab中的应用及其matlab代码
  • 自己选择标准图像,对比验证均值和中值滤波的效果,通过SNR\PSNR\SSIM三个参数以图表形式给出对比结果。
  • 文件包含了数字图像处理这门课程中的中值滤波和均值滤波的基本实现代码
  • 均值滤波和中值滤波的内容非常基础,均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。中值滤波的优点是可以很好的过滤掉椒盐噪声,缺点是易造成图像的不连续性。
  • 添加高斯噪声,并用高斯滤波、均值滤波中值滤波、双边滤波四种滤波去噪方式,并且分别得到这四种滤波后的信噪比值,通过比较信噪比值,得到最佳的滤波去噪处理方式。添加噪声的浓度可以改变,并且也可以改变卷积核...
  • 文件中包含test.m文件和两个函数以及一张测试图片。利用学习机会自己编写了均值滤波和中值滤波函数,并在test.m文件中运行,有详细代码注释,希望一起学习。
  • 题目均值滤波和中值滤波 在自己的证件照中加入椒盐噪声高斯白噪声 分别用3*35*57*7 的均值滤波器和中值滤波器进行滤波 处理过程 1. 用imnoise函数在图像中分别加入椒盐噪声和高斯白噪声 2. 均值滤波用fspecial函数...
  • C# 图像处理 源代码 均值滤波 中值滤波 边缘提取 锐化测试通过非常好用
  • OpenCV–图像平滑(均值滤波、方框滤波、高斯滤波、中值滤波) 首先看以下图,图像平滑(模糊)只是滤波中的一种操作,并不是整个滤波部分。 一、均值滤波 函数: dst = cv.blur( src, ksize[, dst[, anchor[, ...
  • 图像处理中的均值滤波和中值滤波

    千次阅读 2021-07-19 17:12:31
    均值滤波(及代码实现)首先我们看一下图像滤波的概念。图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理分析的...

    在开始我们今天的博客之前,我们需要先了解一下什么是滤波:

    openCV之中值滤波&均值滤波(及代码实现)首先我们看一下图像滤波的概念。图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

    下图左边是原图右边是噪声图:
    在这里插入图片描述
    在这里插入图片描述

    消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
    图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
    而对滤波处理的要求也有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

    平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。
    空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
    关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

    举一个滤波在我们生活中的应用:美颜的磨皮功能。如果将我们脸上坑坑洼洼比作是噪声的话,那么滤波算法就是来取出这些噪声,使我们自拍的皮肤看起来很光滑。

    这篇博文会介绍中值滤波以及均值滤波两种算法

    一.均值滤波

          图片中一个方块区域(一般为3*3)内,中心点的像素为全部点像素值的平均值。均值滤波就是对于整张图片进行以上操作。
    

    我们可以看下图的矩阵进行理解

    在这里插入图片描述
    在这里插入图片描述

    缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声

    实现代码:

    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include<ctime>
    using namespace cv;
    using namespace std;
     
    //均值滤波
    void AverFiltering(const Mat &src,Mat &dst) {
    	if (!src.data) return;
    	//at访问像素点
    	for (int i = 1; i<src.rows; ++i)
    		for (int j = 1; j < src.cols; ++j) {
    			if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1)<src.rows && (j + 1)<src.cols) {//边缘不进行处理
    				dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i - 1, j - 1)[0] + src.at<Vec3b>(i - 1, j)[0] + src.at<Vec3b>(i, j - 1)[0] +
    					src.at<Vec3b>(i - 1, j + 1)[0] + src.at<Vec3b>(i + 1, j - 1)[0] + src.at<Vec3b>(i + 1, j + 1)[0] + src.at<Vec3b>(i, j + 1)[0] +
    					src.at<Vec3b>(i + 1, j)[0]) / 9;
    				dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i, j - 1)[1] +
    					src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] +
    					src.at<Vec3b>(i + 1, j)[1]) / 9;
    				dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i, j - 1)[2] +
    					src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] +
    					src.at<Vec3b>(i + 1, j)[2]) / 9;
    			}
    			else {//边缘赋值
    				dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];
    				dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];
    				dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];
    			}
    		}
    }
    //图像椒盐化
    void salt(Mat &image, int num) {
    	if (!image.data) return;//防止传入空图
    	int i, j;
    	srand(time(NULL));
    	for (int x = 0; x < num; ++x) {
    		i = rand() % image.rows;
    		j = rand() % image.cols;
    		image.at<Vec3b>(i, j)[0] = 255;
    		image.at<Vec3b>(i, j)[1] = 255;
    		image.at<Vec3b>(i, j)[2] = 255;
    	}
    }
    void main() {
    	Mat image = imread("路飞.jpg");
     
    	Mat Salt_Image;
    	image.copyTo(Salt_Image);
    	salt(Salt_Image, 3000);
     
    	Mat image1(image.size(), image.type());
    	Mat image2;
    	AverFiltering(Salt_Image, image1);
    	blur(Salt_Image, image2, Size(3, 3));//openCV库自带的均值滤波函数
    	imshow("原图", image);
    	imshow("自定义均值滤波", image1);
    	imshow("openCV自带的均值滤波", image2);
    	waitKey();
    }
    

    效果图:
    在这里插入图片描述
    在这里插入图片描述
    可以看到图片变模糊而且噪声并没有很有效的去除,该算法只是模糊化了图片而已。

    二.中值滤波

       首先,我们复习中值。在一连串数字{1,4,6,8,9}中,数字6就是这串数字的中值。由此我们可以应用到图像处理中。依然我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。
    

    在这里插入图片描述
    在这里插入图片描述

    代码:

    //求九个数的中值
    uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,
    	uchar n6, uchar n7, uchar n8, uchar n9) {
    	uchar arr[9];
    	arr[0] = n1;
    	arr[1] = n2;
    	arr[2] = n3;
    	arr[3] = n4;
    	arr[4] = n5;
    	arr[5] = n6;
    	arr[6] = n7;
    	arr[7] = n8;
    	arr[8] = n9;
    	for (int gap = 9 / 2; gap > 0; gap /= 2)//希尔排序
    		for (int i = gap; i < 9; ++i)
    			for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
    				swap(arr[j], arr[j + gap]);
    	return arr[4];//返回中值
    }
     
    //图像椒盐化
    void salt(Mat &image, int num) {
    	if (!image.data) return;//防止传入空图
    	int i, j;
    	srand(time(NULL));
    	for (int x = 0; x < num; ++x) {
    		i = rand() % image.rows;
    		j = rand() % image.cols;
    		image.at<Vec3b>(i, j)[0] = 255;
    		image.at<Vec3b>(i, j)[1] = 255;
    		image.at<Vec3b>(i, j)[2] = 255;
    	}
    }
     
    //中值滤波函数
    void MedianFlitering(const Mat &src, Mat &dst) {
    	if (!src.data)return;
    	Mat _dst(src.size(), src.type());
    	for(int i=0;i<src.rows;++i)
    		for (int j=0; j < src.cols; ++j) {
    			if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
    				_dst.at<Vec3b>(i, j)[0] = Median(src.at<Vec3b>(i, j)[0], src.at<Vec3b>(i + 1, j + 1)[0],
    					src.at<Vec3b>(i + 1, j)[0], src.at<Vec3b>(i, j + 1)[0], src.at<Vec3b>(i + 1, j - 1)[0],
    					src.at<Vec3b>(i - 1, j + 1)[0], src.at<Vec3b>(i - 1, j)[0], src.at<Vec3b>(i, j - 1)[0],
    					src.at<Vec3b>(i - 1, j - 1)[0]);
    				_dst.at<Vec3b>(i, j)[1] = Median(src.at<Vec3b>(i, j)[1], src.at<Vec3b>(i + 1, j + 1)[1],
    					src.at<Vec3b>(i + 1, j)[1], src.at<Vec3b>(i, j + 1)[1], src.at<Vec3b>(i + 1, j - 1)[1],
    					src.at<Vec3b>(i - 1, j + 1)[1], src.at<Vec3b>(i - 1, j)[1], src.at<Vec3b>(i, j - 1)[1],
    					src.at<Vec3b>(i - 1, j - 1)[1]);
    				_dst.at<Vec3b>(i, j)[2] = Median(src.at<Vec3b>(i, j)[2], src.at<Vec3b>(i + 1, j + 1)[2],
    					src.at<Vec3b>(i + 1, j)[2], src.at<Vec3b>(i, j + 1)[2], src.at<Vec3b>(i + 1, j - 1)[2],
    					src.at<Vec3b>(i - 1, j + 1)[2], src.at<Vec3b>(i - 1, j)[2], src.at<Vec3b>(i, j - 1)[2],
    					src.at<Vec3b>(i - 1, j - 1)[2]);
    			}
    			else
    				_dst.at<Vec3b>(i, j) = src.at<Vec3b>(i, j);
    		}
    	_dst.copyTo(dst);//拷贝
    }
     
     
    void main() {
    	Mat image = imread("路飞.jpg");
     
    	Mat Salt_Image;
    	image.copyTo(Salt_Image);
    	salt(Salt_Image, 3000);
     
    	Mat image3, image4;
    	MedianFlitering(Salt_Image, image3);
    	medianBlur(Salt_Image, image4, 3);
    	imshow("自定义中值滤波处理后", image3);
    	imshow("openCV自带的中值滤波", image4);
    	waitKey();
    }
     
    

    效果图:

    在这里插入图片描述
    在这里插入图片描述

    可以看到,椒盐噪声很好的被平滑了,而且也没均值那样模糊化太过于严重。

    三 填充问题

    在对图像应用滤波器进行过滤时,边界问题是一个需要处理的问题。一般来说,有3种处理的方法。

    1. 不做边界处理

    不对图像的边界作任何处理,在对图像进行滤波时,滤波器没有作用到图像的四周,因此图像的四周没有发生改变。
    在这里插入图片描述

    2. 填充0

    对图像的边界做扩展,在扩展边界中填充0,对于边长为2k+1的方形滤波器,扩展的边界大小为k,若原来的图像为[m, n],则扩展后图像变为[m+2k, n+2k]。进行滤波之后,图像会出现一条黑色的边框。

    在这里插入图片描述

    1. 填充最近像素值
      扩展与 填充0 的扩展类似,只不过填充0的扩展是在扩展部分填充0,而这个方法是填充距离最近的像素的值。
      在这里插入图片描述

    四 总结:
    均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。

    均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

    中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。

    展开全文
  • 图像处理系列-均值滤波和中值滤波 1.均值滤波中值滤波介绍 在经典书籍《数字图像处理第三版-冈萨雷斯》中介绍了滤波相关概念,并详细讲解了均值滤波中值滤波的原理。如果本文有不详尽之处,可查阅本书P93平滑...

    图像处理系列-均值滤波和中值滤波

    1.均值滤波与中值滤波介绍

    在经典书籍《数字图像处理第三版-冈萨雷斯》中介绍了滤波相关概念,并详细讲解了均值滤波与中值滤波的原理。如果本文有不详尽之处,可查阅本书P93平滑空间滤波部分。

    宏观上,让我们了解均值滤波和中值滤波在图像处理中的位置。在数字图像处理中,滤波是很重要的一部分,均值滤波和中值滤波是都属于空间滤波(对于某一像素点,以该点为中心,通过对该像素点邻域部分的像素进行处理,得到中心替代像素点的滤波方法)中的平滑滤波方法(还有锐化滤波等)。进一步,平滑滤波分为平滑线性滤波器平滑非线性滤波器,而均值滤波属于前者,中值滤波属于后者。

    应用上,均值滤波处理高斯噪声效果较好,中值滤波处理椒盐噪声比较好,原因点击查看

    2.原理说明

    对于通用的加权平滑滤波器,计算公式由下式给出:
    f ( x , y ) = ∑ s = − a a ∑ − b b w ( s , t ) f ( x + s , y + t ) ∑ s = − 1 a ∑ s = − b b w ( s , t ) f(x,y)=\frac{\sum_{s=-a}^{a}\sum_{-b}^{b} w(s,t)f(x+s,y+t)}{\sum_{s=-1}^{a}\sum_{s=-b}^{b}w(s,t)} f(x,y)=s=1as=bbw(s,t)s=aabbw(s,t)f(x+s,y+t)

    其中f(x,y)为图像上坐标为(x,y)的点的灰度值,a与b为以(x,y)为中心的矩形(窗口)的半长与半宽,w(s,t)为给点(s,t)所加的权重。

    对于窗口大小为3的均值滤波器,化简公式如下:
    f ( x , y ) = 1 9 ∑ i = 1 9 Z i f(x,y)=\frac{1}{9}\sum_{i=1}^{9}Z_{i} f(x,y)=91i=19Zi

    其中,Zi为以点(x,y)为中心,3×3的正方形中的九个点的灰度值。同理,窗口大小为n时,正方形的边长随之改变为n。可以看出,如果噪声为高斯噪声,测量值在真实值周围波动,取得平均之后会得到相对准确的值。

    对于窗口大小为3的中值滤波器,f(x,y)的值应为Zi组成的数列(长度为9)的中值。可以看出,如果噪声为椒盐噪声,像素会出现剧烈跳动,而中值对极大值和极小值不敏感,取中值后可以很好过滤掉此类噪声。

    3.图像边界处理

    由于在窗口滑动的过程中,图像的边界不能作为小窗口的中心,故需要对图像边界进行一些人为处理。常见的处理方法如下。

    • 不做处理咳咳咳。
    • 忽略掉图像边界点,输出图像的尺寸会减小。
    • 忽略掉图像边界点,滤波计算完成后裁剪掉未滤波的像素点,再将裁剪后的图像放大到原图大小。
    • 根据窗口大小,想边界外填补一些像素,填充的像素灰度值与最近像素灰度值相同。

    本文代码才用的是第三个处理方案,使用双线性插值法来放大。

    4.效果

    滤波器效果 _1_.jpg

    5.代码

    github仓库

    clc;clear;
    %% 参数输入区,在此选择窗口大小和滤波方式
    filterSize = 7;
    % filterMode = 'median';
    filterMode = 'average';
    I=imread('./circuit.jpg');
    %% 开始运行
    I = rgb2gray(I);
    
    %%边界,数据格式(图像uint8,默认类型转换)
    
    switch filterMode
        case 'average'
            [h,w] = size(I);
            imageOut = zeros(h, w);%为了扩充图像而创建的临时图像
            stepRange = (filterSize-1)/2;
            %%外层两个for循环用来定位窗口中心,内层两个for用来窗口滤波计算
            for pointRow = 1+stepRange : h-stepRange
                for pointCol = 1+stepRange : w-stepRange
                    pixelSum = 0;
                    for i = pointRow-stepRange:pointRow+stepRange
                        for j = pointCol-stepRange:pointCol+stepRange
                            pixelSum = pixelSum + double(I(i, j));
                        end
                    end
                    pixelValue = pixelSum/filterSize^2;
                    imageOut(pointRow, pointCol) = uint8(pixelValue);
                end
            end
            imageOut = uint8(imageOut); %double转化为uint8格式
            imageOut = imcrop(imageOut,[1+stepRange,1+stepRange,w-2*stepRange-1,h-2*stepRange-1]);
            imageOut = imresize(imageOut, [h, w], 'bilinear');
            
        case 'median'
            [h,w] = size(I);
            imageOut = zeros(h, w);%为了扩充图像而创建的临时图像
            stepRange = (filterSize-1)/2;
            %%外层两个for循环用来定位窗口中心,内层两个for用来窗口滤波计算
            for pointRow = 1+stepRange : h-stepRange
                for pointCol = 1+stepRange : w-stepRange
                    pixelArray = zeros(1, filterSize^2);
                    ptrPA = 1;
                    for i = pointRow-stepRange:pointRow+stepRange
                        for j = pointCol-stepRange:pointCol+stepRange
                            pixelArray(ptrPA) = double(I(i, j));
                            ptrPA = ptrPA + 1;
                        end
                    end
                    imageOut(pointRow, pointCol) = uint8(median(pixelArray));
                end
            end
            imageOut = uint8(imageOut); %double转化为uint8格式
            imageOut = imcrop(imageOut,[1+stepRange,1+stepRange,w-2*stepRange-1,h-2*stepRange-1]);
            imageOut = imresize(imageOut, [h, w], 'bilinear');
    end
    
    subplot(121),imshow(I);
    subplot(122),imshow(imageOut);
    impixelinfo;
    
    展开全文
  • 均值滤波和中值滤波.doc
  • 基于MATLAB图像处理的中值滤波均值滤波以及高斯滤波的实现与对比: a) 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. b) 均值滤波是典型的线性滤波算法...
  • 均值滤波和中值滤波

    万次阅读 多人点赞 2018-02-05 16:48:24
    均值滤波中值滤波的区别 均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在...

    均值滤波及中值滤波的区别


    均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。


    填充问题


    在对图像应用滤波器进行过滤时,边界问题是一个需要处理的问题。一般来说,有3种处理的方法。

    1. 不做边界处理

    不对图像的边界作任何处理,在对图像进行滤波时,滤波器没有作用到图像的四周,因此图像的四周没有发生改变。


    2. 填充0

    对图像的边界做扩展,在扩展边界中填充0,对于边长为2k+1的方形滤波器,扩展的边界大小为k,若原来的图像为[m, n],则扩展后图像变为[m+2k, n+2k]。进行滤波之后,图像会出现一条黑色的边框。


    3. 填充最近像素值

    扩展与 填充0 的扩展类似,只不过填充0的扩展是在扩展部分填充0,而这个方法是填充距离最近的像素的值。




    matlab代码实现


    1.  均值滤波函数如下

    该函数为spacelFilter,输入为需要进行滤波的图像(L = 256,像素值为0-255的灰度图像),方形滤波器(大小为2k+1,值类型为uint8),输出为经过滤波器滤波之后的图像。该函数滤波采用填充最近像素值的方法,结果图像不会出现黑边。

    function [image_out] = spacelFilter(image_in, filter)
    % (线性)均值滤波函数
    % 输入为需要进行空间滤波的灰度图像,线性方形滤波器
    % 输出为经过滤波之后的图像
    % 图像边缘的填充为最近的像素值,目的是消除填充0时会出现的黑框
    % 滤波器的大小为 n * n, n = 2 * k + 1, k为整数
    % 输入图像大小为 m * n, 灰度图像,像素值范围为0-255,L = 256
    [m, n] = size(image_in);
    [mf, nf] = size(filter);
    k = (mf - 1) / 2;
    image2 = zeros(m+2*k, n+2*k, 'double');
    image_out = zeros(m, n, 'uint8');
    coeff = sum(filter(:));
    % 填充部分
    % 内部直接复制
    for i = 1+k : m+k
        for j = 1+k : n+k
            image2(i, j) = image_in(i-k, j-k);
        end
    end
    % 填充上下边缘
    for i = 1 : k
        for j = 1 : n
            image2(i, j+k) = image_in(1, j);
            image2(m+k+i, j+k) = image_in(m, j);
        end
    end
    % 填充左右边缘
    for i = 1 : m
        for j = 1 : k
            image2(i+k, j) = image_in(i, 1);
            image2(i+k, n+k+j) = image_in(i, n);
        end
    end
    % 填充四个角
    for i = 1 : k
        for j = 1 : k
            image2(i, j) = image_in(1, 1); %填充左上角
            image2(i, j+n+k) = image_in(1, n); %填充右上角
            image2(i+n+k, j) = image_in(m, 1); %填充左下角
            image2(i+n+k, j+n+k) = image_in(m, n); %填充右下角
        end
    end
    
    % 滤波部分
    for i = 1+k : m+k
        for j = 1+k : n+k
            sub_image = image2(i-k:i+k, j-k:j+k);
            temp1 = double(filter') .* double(sub_image);
            temp2 = sum(temp1(:)) / coeff;
            image_out(i-k, j-k) = uint8(temp2);
        end
    end
    
    end

    2. 中值滤波器

    实现与均值滤波器类似,只不过在滤波部分的实现有所不同。

    % 滤波部分
    for i = 1+k : m+k
        for j = 1+k : n+k
            sub_image = image2(i-k:i+k, j-k:j+k);
            temp = median(sub_image(:));
            image_out(i-k, j-k) = uint8(temp);
        end
    end

    3.  测试代码如下

    为了方便,我在spacelFilter函数中增加了中值滤波部分,增加了一个返回值,这样spacelFilter函数的返回值为[image1,image2],image1为均值滤波图像,image2为中值滤波图像。

    close all;
    clear all;
    clc;
    
    image = imread('2.tif');
    [m, n] = size(image);
    %模板大小
    k = 3;
    myFilter = zeros(k, k, 'uint8');
    
    for i = 1 : k
        for j = 1 : k
            myFilter(i, j) = 1;
        end
    end
    [image2, image3] = spacelFilter(image, myFilter);
    image4 = medfilt2(image, [3 3]);
    figure;
    subplot(2, 2, 1), imshow(image), title('原图像');
    subplot(2, 2, 2), imshow(image2), title('3*3均值滤波图像');
    subplot(2, 2, 3), imshow(image3), title('3*3中值滤波图像');
    subplot(2, 2, 4), imshow(image4), title('matlab自带的中值滤波图像');

    4. 代码运行结果如下(测试图像为被椒盐噪声污染的图像):



    展开全文
  • MATLAB实现图像的中值滤波 均值滤波 维纳滤波
  • 均值滤波和中值滤波matlab实现

    万次阅读 2018-12-18 21:04:42
    clc; close all; %原始图片 283*289*3 data=imread('图片1.png');%读入图片,图片复制到当前文件夹 subplot(221); imshow(data); title('原始图片'); %二值化 283*289 gdata=rgb2gray(data);...%中值滤波...
  • 图像滤波器,包括均值滤波器和中值滤波器,采用MATLAB代码进行编写,可实现滤波功能
  • I=imread('D:\TuPian\lion.png'); subplot(3,3,1);imshow(I);title('原始图像');... %添加高斯噪声,均值为0,方差为0.02 subplot(3,3,4);imshow(G);title('高斯噪声图像'); j1 = fspecial('avera
  • MATLAB常用的滤波函数比较:均值滤波 中值滤波

    万次阅读 多人点赞 2019-03-14 10:11:12
    MATLAB常用的滤波函数比较:均值滤波和中值滤波 均值滤波中值滤波运行结果程序代码 均值滤波 均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,...
  • matlab语言,实现模拟干涉图的生成、加噪、均值滤波中值滤波处理
  • 卷积示例图: 一般来说,在MN的图像f(x,y)上,用mn大小的滤波器掩模进行线性滤波由下式给出: 模板为1*5的中值滤波和均值滤波的对比: 均值滤波 简单来说就是对某个区域内的像素值取平均值代替原像素值 常用的3*3的...
  • 花了我50个c币,真狠呐,我下载下来以后自己从新编译了下,原项目是vs2005的,我用vs2015编译的,代码可用。记得项目属性要设置为允许执行不安全代码
  • 对图片进行均值滤波和中值滤波,VC下可以运行的哦
  • %% 中值滤波: I=rgb2gray(I); J=imnoise(I,'salt & pepper'); subplot(231),imshow(I);title('原图像'); subplot(232),imshow(J);title('添加椒盐噪声图像'); k1=medfilt2(J); %进行3*3模板
  • 均值滤波中值滤波的对比均值滤波中值滤波实验对比matlab 代码 均值滤波中值滤波 均值滤波是典型的线性滤波算法,均值滤波是对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法,通常用卷积来...
  • 用C#开发的的一种图像处理软件,在VS2005下编译通过,能正常运行,实现的功能有均值滤波中值滤波,边缘提取,锐化。
  • 今天小编就为大家分享一篇Python 实现中值滤波均值滤波的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,654
精华内容 4,261
关键字:

均值滤波和中值滤波

友情链接: data.zip