0

このアルゴリズムを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
4

1 に答える 1

1

問題は画像のクラスにあります。で作成したのでzeros、クラスはdoubleになります。する必要がありますuint8。を使用するzeros (x, y, z, "uint8")か、最後にクラスを変換することで、これを行うことができます。ただし、より良いオプションは、imresize()すでにその考え方を行っているものを使用することです(ただし、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を参照して、どのように機能するかを確認してください(上記で貼り付けたコードは、実際には開発バージョンのものです)。基本的に、結局のところ、それはすべてinterp2()「最も近い」方法を使用することになります。

于 2013-01-22T16:09:11.507 に答える