Robertsオペレーターについて別の質問を投稿しましたが、その時からコードが大幅に変更されたため、新しいものを投稿することにしました。Robertsオペレーターが画像を明るくするだけです
コードは実行されますが、正しいイメージが生成されず、イメージがわずかに明るくなります。
アルゴリズムで間違いが見つかりませんでしたが、これは正しい出力ではないことがわかりました。このプログラムの出力をedge(<image matrix>,'roberts',<threshold>);
、またはwikipediaの画像と比較すると、そこに表示されているroberts演算子の効果のようには見えません。
コード:
function [] = Robertize(filename)
Img = imread(filename);
NewImg = Img;
SI = size(Img);
I_W = SI(2)
I_H = SI(1)
Robertsx = [1,0;0,-1];
Robertsy = [0,-1;1,0];
M_W = 2; % do not need the + 1, I assume the for loop means while <less than or equal to>
% x and y are reversed...
for y=1 : I_H
for x=1 : I_W
S = 0;
for M_Y = 1 : M_W
for M_X = 1 : M_W
if (x + M_X - 1 < 1) || (x + M_X - 1 > I_W)
S = 0;
%disp('out of range, x');
continue
end
if (y + M_Y - 1 < 1) || (y + M_Y - 1 > I_H)
S = 0;
%disp('out of range, y');
continue
end
S = S + Img(y + M_Y - 1 , x + M_X - 1) * Robertsx(M_Y,M_X);
S = S + Img(y + M_Y - 1, x + M_X - 1) * Robertsy(M_Y,M_X);
% It is y + M_Y - 1 because you multiply Robertsx(1,1) *
% Img(y,x).
end
end
NewImg(y,x) = S;
end
end
imwrite(NewImg,'Roberts.bmp');
end
ていますか?記事は理にかなっていますが、クラスで学んだことから、特定のピクセルの2つのxとyの勾配値を追加するだけです。おそらく2つの勾配行列には平方根が組み込まれているでしょうか?編集 - ソーベルオペレーターの勾配値を二乗する必要があると聞いたことがありますが、ロバーツはそうではありません。 – superlazyname
ここに - それを少し説明するかもしれない編集を追加します... – aardvarkk
ありがとう、私は今理解して、それはネガになると推測したことはありませんでした。 – superlazyname