1

イメージに対して 2 倍のダウンサンプリングを実装すると、ダウンサンプリングされたイメージはグレーになります。すべてのカラー コンポーネントをダウンサンプリングの実装に追加して、カラー イメージにするためにはどうすればよいですか?

  I = imread('lena.gif','gif');
  [j k] = size(I)


  x_new = j./2;
  y_new = k./2;


  x_scale = j./x_new;
  y_scale = k./y_new;


  M = zeros(x_new,y_new);


  for count1 = 1:x_new
     for count2 = 1:y_new
     M(count1,count2) = I(count1.*x_scale,count2.*y_scale);
     end
  end


    figure,imshow(I);
    title('Original Image');
    M = uint8(M);
    figure,imshow(M);
    title('Downsample');
4

2 に答える 2

2

GIF 画像は、インデックス付き画像と呼ばれるものです。これは、読み込んだものがカラー マップのインデックスimreadである値であることを意味します。各インデックスは独自の色を生成し、それが GIF 画像の保存方法です。事前定義された色のセットから選択し、GIF 画像の各ピクセルはカラー マップの色の 1 つから取得されます。

最初に画像を RGB に変換する必要があり、ind2rgb. ただし、 の 2 出力バージョンでは、最初にカラー マップを読み込む必要がありますimreaduint8また、次の方法で画像を適切な方法に変換することもできますim2uint8

[X,map] = imread('lena.gif');
I = im2uint8(ind2rgb(X,map));

次に行う必要があるのは、@NKN が提案したことです。アルゴリズムをすべてのチャネルに適用する必要があります。

そのため、単純に 3 つのチャネルを持つ出力マトリックスを作成し、アルゴリズムを各平面に個別に適用します。提案できる場合は、ダウンサンプリング後にこの方法でピクセルにアクセスするときに、定義されていない場所 (たとえば (13.8, 25.5) など) を誤って指定しないように、自分floorまたは画像の座標を確認してください。round画像のピクセル位置は整数であるため、座標も整数であることを確認する必要があります。


[X,map] = imread('lena.gif');
I = im2uint8(ind2rgb(X,map));

j = size(I,1); %// Change
k = size(I,2);

x_new = j./2;
y_new = k./2;


x_scale = j./x_new;
y_scale = k./y_new;


M = zeros(x_new,y_new,size(I,3)); %// Change


for jj = 1 : size(I,3) %// Change
   for count1 = 1:x_new
     for count2 = 1:y_new
        M(count1,count2,jj) = I(floor(count1.*x_scale),floor(count2.*y_scale),jj); %// Change
     end
  end
end


figure,imshow(I);
title('Original Image');
M = uint8(M);
figure,imshow(M);
title('Downsample');

これをテストするためにmandrill、MATLAB の一部であるデータセットを使用しています。これは、カラー マップが関連付けられたインデックス付きイメージです。これらは偶然にも次の場所に保存されXていmapます。

load mandrill;
I = im2uint8(ind2rgb(X,map));

変更したコードを実行すると、次の 2 つの図が得られます。

ここに画像の説明を入力

ここに画像の説明を入力

于 2015-11-02T22:05:08.973 に答える