Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image Matlab中值滤波代码_Image_Matlab_Image Processing_Filter_Median - Fatal编程技术网

Image Matlab中值滤波代码

Image Matlab中值滤波代码,image,matlab,image-processing,filter,median,Image,Matlab,Image Processing,Filter,Median,我需要在MATLAB中实现中值滤波的图像。但是,我不允许在MATLAB中使用medfilt2或ordfilt2函数。我们最近也开始学习MATLAB 是否有中值滤波器或高斯滤波器的可用代码 我在告诉你如何开始你的任务。你所需要的就是建立一个中心值,然后选择中心值。很大一部分是实现排序算法。其中一些: 斗式分拣 列表项 气泡排序 插入排序 选择排序 堆 归并排序 他们不难理解,也不难自己写。你可以很容易地找到已经写好的。键入您的搜索引擎排序算法matlab。你说我正在寻找Matlab中中值滤波器内置

我需要在MATLAB中实现中值滤波的图像。但是,我不允许在MATLAB中使用medfilt2或ordfilt2函数。我们最近也开始学习MATLAB

是否有中值滤波器或高斯滤波器的可用代码

我在告诉你如何开始你的任务。你所需要的就是建立一个中心值,然后选择中心值。很大一部分是实现排序算法。其中一些:

斗式分拣 列表项 气泡排序 插入排序 选择排序 堆 归并排序 他们不难理解,也不难自己写。你可以很容易地找到已经写好的。键入您的搜索引擎排序算法matlab。你说我正在寻找Matlab中中值滤波器内置函数的代码。Matlab允许查看meddilt2和ordfilt2的源代码,您可以查看这些函数的代码,但请记住版权规则

实现排序算法后,您可以通过写入mask numelmask+1/2来轻松地拾取过滤器掩码的中心值

就这样

如果您正在寻找一个人从头开始为您的任务编写完整的解决方案,那么您的工作将非常艰巨

祝你好运

中值滤波有两个MATLAB内置函数:medfilt2和ordfilt2。实际上,medfilt2在其体内调用ordfilt2。因为中值滤波是秩序滤波的特例。

NB:这假设安装了图像处理工具箱

中值滤波的基本前提是分析图像中的像素邻域,对其强度进行排序,然后选择中等强度作为结果。我可以提出的一个建议是将每个像素邻域转换为一个列向量,并使用所有这些列向量创建一个矩阵。每列表示像素邻域内的像素强度。接下来,使用每个列的行进行排序,然后抓住这个排序矩阵的中间,它表示每个像素邻域的中间值。这将是一个单行向量,表示每个像素邻域的中值。完成后,只需将该向量重新整形为与原始图像相同的大小,即可获得中值滤波结果。您可以使用来帮助完成最后一步

然而,使用im2col,它只捕获原始图像边界内的像素邻域。因为要沿图像边界对像素进行中值滤波,所以在使用im2col进行处理之前,需要填充图像边界。用来为你做这件事。我将假设边界用零填充,以使事情更简单

因此,给定一个灰度图像im和一个要分析的对称邻域,即nxn,其中N是邻域的宽度/高度,您的代码可能如下所示。我还将假设N是奇数,以便更容易选择中值:

im_pad = padarray(im, [floor(N/2) floor(N/2)]);
im_col = im2col(im_pad, [N N], 'sliding');
sorted_cols = sort(im_col, 1, 'ascend');
med_vector = sorted_cols(floor(N*N/2) + 1, :);
out = col2im(med_vector, [N N], size(im_pad), 'sliding');
让我们做一个例子。假设我们的过滤器大小是5 x 5,我们将使用cameraman.tif,这是图像处理工具箱的一部分。如果我们执行下面的代码,则运行上面刚刚看到的中值滤波代码:

N = 5;
im = imread('cameraman.tif');
我们得到了以下结果,原始图像和最终图像都经过中值滤波

这正是我们所期望的,因为中值滤波在进行图像平滑时或多或少会保持边缘良好。中值滤波对于椒盐噪声特别有用,因为在对像素邻域进行排序时,这些噪声像素极有可能出现在开始和结束时,因此选择中间值很可能会过滤掉这些噪声值

奖金 你的帖子还要求从第一原理中找到做高斯滤波的代码。几天前我为别人回答了这个问题


查看此处的帖子:

我已经编写了一个代码,它可能会有帮助:

读取图像并向其添加噪波:

I=imread('cameraman.tif');
if(size(I,3)~=1)
I=rgb2gray(I);
end
rr=0.1;  
h=imnoise(I,'salt & pepper',rr);
imshow(h);
[M,N]=size(h);
new=h-h;
询问所需内核的大小:

disp('***************Note:zero-padding method is used!***********');
disp('                                                           ');
kernel_size=input('enter the size of the kernel for the Median-ranking? 3 or 5 or 7 or 9=  ');
k=zeros(kernel_size);  %k is the kernel used. 
将中值滤波器应用于图像:

start=kernel_size-floor(kernel_size*0.5);
for x=start:1:M-floor(kernel_size*0.5)
for y=start:1:N-floor(kernel_size*0.5)

%defining x1 & y1 as the 1st coordinates in the kernel
x1=x-(floor(kernel_size*0.5));
y1=y-(floor(kernel_size*0.5));

%specifying image pixels to the kernel
for p=1:1:kernel_size
for q=1:1:kernel_size
 k(p,q)=h(x1+p-1,y1+q-1);
end    
end
d=reshape(k,1,[]);  %k values into an array d 
[r,c]=size(d);
%*****Ordering kernel members***************
for j=1:1:c-1
for i=1:1:c-1
    a=d(1,i);
    b=d(1,i+1);
    if(a>b)
     d(1,i)=b;
     d(1,i+1)=a;
    end
end  
end
Median=d(1,floor(kernel_size*kernel_size*0.5)+1);
  %*****************end of ordering***********
  %*******************************************

   new(x,y)=Median;    
end
end
显示结果:

figure;imshow(new,[]);

这是我自己编写的代码。我希望它能起作用

clc;
clear all;
close all;

A=imread('2.jpg');
A=rgb2gray(A);
figure;imshow(A);
Y=imnoise(A,'salt & pepper',0.5);
figure;imshow(Y);
[n,m]=size(A);
%median filter
for i=1:n
   for j=1:m
        mat=zeros(3,3);
        if((i-1) == 0 && (j-1) ~= 0 && j~=m)
            mat(2:3,1:3)=Y(i:i+1,j-1:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
       elseif(i==n && (j-1)~=0 && j~=m)
            mat(1:2,:)=Y(i-1:i,j-1:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
       elseif((i-1)~=0 &&(j-1)~=0 && j~=m && i~=n)
            mat(:,:)=Y(i-1:i+1,j-1:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
        elseif((j-1)==0 && (i-1)~=0 && i~=n)
            mat(:,2:3)=Y(i-1:i+1,j:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
        elseif(j==m && (i-1)~=0 && i~=n)
            mat(:,1:2)=Y(i-1:i+1,j-1:j);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
        end
    end
end

figure;
imshow(Y)

我知道这些函数,但我需要中值滤波器的代码,或者至少是algorithm@mehmet-我白手起家写了一篇,但我不需要做很多工作。这只是对我之前的一篇文章的修改,但额外的要求是对强度进行排序并选择中间值。我可能不应该写一个答案,但我写这个答案主要是作为一种思维练习,而不是其他任何东西。@rayryeng-没问题,没问题;你可以使用nfilter吗?@CapeCode听起来像是家庭作业,所以可能不…必须喜欢那些给我提库兹问题的人…但我很内疚并写下答案。哎呀。这更多的是为了锻炼我的编码肌肉