0

我需要帮助在 if 语句下调试我的中值函数。我收到输入错误。此外,如果有更简单的方法来编写中值函数,将不胜感激。我正在编写此代码来清理项目的上述图像。谢谢。另外,我对 MATLAB 还是很陌生。

``清除clc格式紧凑

filenameIN = uigetfile('.bmp','Picture');
noisyRGBarray = imread(filenameIN);
%figure(1)
%imshow(noisyRGBarray)
y = noisyRGBarray;
[m,n]=size(y)
cleanRGBarray = y;

for i = 2:m-1    
   for j = 2:n-1   
       if y(i,j) == 0 | y(i,j) == 255 % clean add new
           cleanRGBarray(i,j) = median( ( y ( (i-1),(j-1) ) ) , ( y ( (i-1),(j) ) ) , ( y ( (i-1),(j+1) ) ) ; ( y ( (i),(j-1) ) ), ( y ( (i),(j) ) ) ; ( y ( (i),(j+1) ) ) ; ( y ( (i+1),(j-1) ) ), ( y ( (i+1),(j) ) ), ( y ( (i+1),(j+1) ) ) ) ;
       end   
   end
end
4

2 回答 2

1

matlab有一个内置的中值滤波器medfilt2你也可以试试ordfilt2

于 2013-10-11T00:44:52.427 回答
1

你让自己很难受!重新制定最内层循环的最简单方法是

block = y((-1:1)+i, (-1:1)+j);
cleanRGBarray(i,j) = median(block(:));

有几点需要注意:

  1. 您试图创建一个参数向量,median但没有用[]
  2. 我使用的事实是,当索引超过一维时,Matlab 会执行“嵌套循环”来获取所有数字(所以我的block变量最终是 3x3)
  3. block(:)我将一个带有维度的列向量9x1输入median- 如果你给它一个 N 维矩阵,它只会在第一个非单维维度上运行(所以给它 3x3 并返回 1x3 中位数)
  4. 有一些技术可以更有效地做到这一点 - 内置中值过滤器等blockproc- 但您需要图像处理工具箱。

我希望这个能有一点帮助。

于 2013-10-11T00:54:45.323 回答