Roberts 演算子に関する別の質問を投稿しましたが、その時からコードが大幅に変更されたため、新しい質問を投稿することにしました。
私のコードは実行されますが、正しい画像が生成されず、代わりに画像がわずかに明るくなります。
アルゴリズムに間違いは見つかりませんでしたが、これが正しい出力ではないことはわかっています。このプログラムの出力をedge(<image matrix>,'roberts',<threshold>);
やウィキペディアの画像と比較すると、そこに示されている 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