0

我在 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
4

1 回答 1

1

问题出在您的图像类别中。既然你用 来创建它zeros,它的类会加倍。应该是uint8。您可以通过使用zeros (x, y, z, "uint8")或在最后转换类来做到这一点。更好的选择是使用imresize()which 已经为您考虑(尽管您可能需要循环通过 RGB 通道,但我不确定)。

关于您的代码,您应该避免这些循环。当您拥有可能更大的实际图像时,它会真正影响您的性能。只要比例因子是整数,以下代码应该会更好地工作:

function b = nearestresize (a, row_scale, col_scale)
  row_idx = (1:rows (a))(ones (1, row_scale), :);
  col_idx = (1:columns (a))(ones (col_scale, 1), :);
  b = a(row_idx, col_idx, :);
endfunction

无论如何,您应该使用imresize“最近”方法从图像包中使用(我不确定它与 RGB 图像的效果如何):

b = imresize (im, [rows cols], "nearest")

查看代码imresize以了解它是如何工作的(我上面粘贴的代码实际上来自它的开发版本)。基本上; y,最后这一切都归结为interp2()使用“最近”方法。

于 2013-01-22T16:09:11.507 回答