このアルゴリズムをOctaveに実装しました。出力行列(o)は、入力行列(c)に従って期待どおりでしたが、に表示される出力imshow()
は入力画像とは異なります。
これの何が問題なのかを示すのを手伝ってもらえますか?
Ubuntu12.10で実行されているGNUOctave3.6.2を使用しています。
以下の例では、画像のサイズが2x2に変更されています。
ソース画像:
出力画像
ソースマトリックス
ans(:,:,1) =
237 255 34
237 255 34
255 255 255
255 255 255
0 255 0
0 255 0
ans(:,:,2) =
28 242 177
28 242 177
242 242 242
242 242 242
162 242 0
162 242 0
ans(:,:,3) =
36 0 76
36 0 76
0 0 0
0 0 0
232 0 0
232 0 0
出力行列
ans(:,:,1) =
237 237 255 255 34 34
237 237 255 255 34 34
237 237 255 255 34 34
237 237 255 255 34 34
255 255 255 255 255 255
255 255 255 255 255 255
255 255 255 255 255 255
255 255 255 255 255 255
0 0 255 255 0 0
0 0 255 255 0 0
0 0 255 255 0 0
0 0 255 255 0 0
ans(:,:,2) =
28 28 242 242 177 177
28 28 242 242 177 177
28 28 242 242 177 177
28 28 242 242 177 177
242 242 242 242 242 242
242 242 242 242 242 242
242 242 242 242 242 242
242 242 242 242 242 242
162 162 242 242 0 0
162 162 242 242 0 0
162 162 242 242 0 0
162 162 242 242 0 0
ans(:,:,3) =
36 36 0 0 76 76
36 36 0 0 76 76
36 36 0 0 76 76
36 36 0 0 76 76
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
232 232 0 0 0 0
232 232 0 0 0 0
232 232 0 0 0 0
232 232 0 0 0 0
ソースコード
function out_img = nneig(in_img, x_scale, y_scale);
in_img_height = size(in_img, 1);
in_img_width = size(in_img, 2);
in_img_channels = size(in_img, 3);
out_img_height = round(in_img_height * y_scale);
out_img_width = round(in_img_width * x_scale);
out_img_channels = in_img_channels;
out_img = zeros(out_img_height, out_img_width, out_img_channels);
tf_mtx = zeros(3, 3);
tf_mtx(1, 1) = 1 / x_scale;
tf_mtx(2, 2) = 1 / y_scale;
tf_mtx(3, 3) = 1;
for out_channel = 1:out_img_channels
for out_line = 1:out_img_height
for out_col = 1:out_img_width
org_coord_mtx = floor(tf_mtx * [out_col - 1; out_line - 1; 1]) + [1; 1; 0];
org_coord_line = org_coord_mtx(2, 1);
org_coord_col = org_coord_mtx(1, 1);
out_img(out_line, out_col, out_channel) = in_img(org_coord_line, org_coord_col, out_channel);
end
end
end
endfunction