Image 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是奇数,以便更容易选择中值:Image Matlab中值滤波代码,image,matlab,image-processing,filter,median,Image,Matlab,Image Processing,Filter,Median,我需要在MATLAB中实现中值滤波的图像。但是,我不允许在MATLAB中使用medfilt2或ordfilt2函数。我们最近也开始学习MATLAB 是否有中值滤波器或高斯滤波器的可用代码 我在告诉你如何开始你的任务。你所需要的就是建立一个中心值,然后选择中心值。很大一部分是实现排序算法。其中一些: 斗式分拣 列表项 气泡排序 插入排序 选择排序 堆 归并排序 他们不难理解,也不难自己写。你可以很容易地找到已经写好的。键入您的搜索引擎排序算法matlab。你说我正在寻找Matlab中中值滤波器内置
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听起来像是家庭作业,所以可能不…必须喜欢那些给我提库兹问题的人…但我很内疚并写下答案。哎呀。这更多的是为了锻炼我的编码肌肉