为什么下采样显示为灰色图像?
Why does downsample appear as a gray image?
在对图像进行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');
当您阅读原始图像时,它包含 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 图像被称为 索引 图像。这意味着您使用 imread
读取的值是 indices 到颜色图的值。每个索引都会为您生成一种独特的颜色,这就是 GIF 图像的存储方式。他们从一组预定义的颜色中进行选择,GIF 图像中的每个像素都来自颜色图中的一种颜色。
您首先需要将图像转换为 RGB,然后使用 ind2rgb
. However, you need to read in the colour map first with the two-output version of imread
. You also will want to convert the images to uint8
as good practice with im2uint8
:
[X,map] = imread('lena.gif');
I = im2uint8(ind2rgb(X,map));
您接下来需要做的是@NKN 建议的。您必须将算法应用于所有频道。
因此,只需制作一个具有三个通道的输出矩阵,并将算法独立应用于每个平面。如果我可以提出建议,当你在缩减采样后以这种方式访问像素时,请确保你 floor
或 round
图像坐标,这样你就不会无意中指定未定义的位置 - 比如( 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
数据集。它是具有关联颜色图的索引图像。巧合的是,恭敬地存入了X
和map
:
load mandrill;
I = im2uint8(ind2rgb(X,map));
运行修改后的代码,得到这两个数字:
在对图像进行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');
当您阅读原始图像时,它包含 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 图像被称为 索引 图像。这意味着您使用 imread
读取的值是 indices 到颜色图的值。每个索引都会为您生成一种独特的颜色,这就是 GIF 图像的存储方式。他们从一组预定义的颜色中进行选择,GIF 图像中的每个像素都来自颜色图中的一种颜色。
您首先需要将图像转换为 RGB,然后使用 ind2rgb
. However, you need to read in the colour map first with the two-output version of imread
. You also will want to convert the images to uint8
as good practice with im2uint8
:
[X,map] = imread('lena.gif');
I = im2uint8(ind2rgb(X,map));
您接下来需要做的是@NKN 建议的。您必须将算法应用于所有频道。
因此,只需制作一个具有三个通道的输出矩阵,并将算法独立应用于每个平面。如果我可以提出建议,当你在缩减采样后以这种方式访问像素时,请确保你 floor
或 round
图像坐标,这样你就不会无意中指定未定义的位置 - 比如( 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
数据集。它是具有关联颜色图的索引图像。巧合的是,恭敬地存入了X
和map
:
load mandrill;
I = im2uint8(ind2rgb(X,map));
运行修改后的代码,得到这两个数字: