为什么下采样显示为灰色图像?

时间:2015-11-02 21:48:05

标签: image matlab image-processing downsampling

在对图像进行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');

2 个答案:

答案 0 :(得分:2)

GIF图片就是所谓的索引图片。这意味着您使用imread读到的内容是颜色贴图的 indices 值。每个索引都会为您生成一种独特的颜色,这就是GIF图像的存储方式。他们从一组预定义的颜色中进行选择,GIF图像中的每个像素都来自颜色图中的一种颜色。

首先需要将图像转换为RGB,然后使用ind2rgb进行转换。但是,您需要首先使用双输出版本imread读取颜色映射。您还希望将图片转换为uint8作为im2uint8的良好做法:

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

接下来需要做的是@NKN建议的内容。您必须将算法应用于所有通道。

因此,只需制作一个具有三个通道的输出矩阵,并将算法独立地应用于每个平面。如果我可以提出建议,在下采样后以这种方式访问​​像素时,请确保floorround图像坐标,这样您就不会无意中指定未定义的位置 - 例如(例如,13.8,25.5)。图像像素位置是整数,因此您需要确保坐标也是整数。

[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的一部分。它是带有关联颜色映射的索引图像。这些巧合地存储在Xmap中:

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

运行修改过的代码,我得到了这两个数字:

enter image description here

enter image description here

答案 1 :(得分:1)

当您阅读原始图像时,它包含3层,R-G-B(由@rayryeng建议:

overflow: visible;

您应该对所有图层执行下采样过程:

您提供的代码不会进行下采样。一个简单的下采样示例如下:

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

ans =

         768        1024           3
相关问题