我在 Octave 中实现了这个算法,输出矩阵 (o) 与输入矩阵 (c) 一致,但显示的输出imshow()
与输入图像不相似。
你能帮我指出这有什么问题吗?
我正在使用在 Ubuntu 12.10 上运行的 GNU Octave 3.6.2。
在下面的示例中,图像的大小被调整为 2 x 2。
源图像:
输出图像
源矩阵
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