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

あなたはこれを自分自身に非常に難しくしています!最も内側のループを再定式化する最も簡単な方法は、

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- しかし、それらには Image Processing Toolbox が必要です。

これが少し役立つことを願っています。

于 2013-10-11T00:54:45.323 に答える
1

matlabには組み込みのメディアンフィルターmedfilt2があり、試すこともできますordfilt2

于 2013-10-11T00:44:52.427 に答える