【问题标题】:Why does downsample appear as a gray image?为什么下采样显示为灰色图像?
【发布时间】:2015-11-02 21:48:04
【问题描述】:

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

【问题讨论】:

  • M 只有一层并且没有 RGB 信息,因此结果为灰色是有道理的。如果输入图像,您应该使用所有 3 层。
  • 那我怎样才能给 M 添加 RGB 信息呢?我是图像处理的新手:/ @NKN
  • 你为什么不用imresize ??
  • 我应该实现它,不应该使用内置函数@bla
  • 如果j 是奇数等,您可能会遇到错误,如果./2 已经完成...您需要在整个代码中使用roundfloor...

标签: image matlab image-processing downsampling


【解决方案1】:

GIF 图片就是所谓的索引图片。这意味着您使用imread 读取的值是颜色映射的索引。每个索引都会为您生成一种独特的颜色,这就是 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');

为了对此进行测试,我使用了 MATLAB 中的 mandrill 数据集。它是带有关联颜色图的索引图像。这些巧合地存储在Xmap中:

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

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

【讨论】:

  • 问题是他的代码没有下采样!
  • 非常感谢!如果我不使用 GIF 怎么办?那么我不需要 (X,map) 部分吗? @rayryeng​​span>
  • @Blu 正确。只需执行I = imread('...');。但是,如果您想确保每次都获得 RGB 图像,您可以随时检查第二个输出是否为非空。像[I,map] = imread('...'); if ~isempty(map), I = ind2rgb(I); end 这样的东西,这将确保我们创建一个 RGB 图像,而不管图像是否有关联的颜色映射。
  • 我应用了您上面提供的代码,但原始图像和下采样图像完全相同。它们的大小应该不同,但不是=/它们实际上是相同的@rayryeng​​span>
  • 他们不应该。我只是在内置图像上尝试过这个。我会上传结果。
【解决方案2】:

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

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

ans =

         768        1024           3

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

您提供的代码没有下采样。一个简单的下采样示例如下:

imshow(I(1:2:end,1:2:end,:))

【讨论】:

  • 这还不是全部。您还需要从 GIF 图像中读取颜色图。但是,将算法应用于每个平面的要点是 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 2012-01-26
  • 2015-05-13
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多