如何在Matlab中将RGB图像转换为灰度图像,而不使用rgb2gray函数

4

我目前正在使用的代码:

i = imread('/usr/share/icons/matlab.png');
for k=1:1:m
    for l=1:1:n
        %a(k,l)=m*n;
        a(k,l) = (.299*i(k,l,1))+(.587*i(k,l,2))+(.114*i(k,l,3));
    end
end
imshow(a); 

它只显示一个白屏。而且新生成的尺寸为 n x m x 3,而应该是 m x n x 1。如果我使用 mat2gray 它会显示如下图片:
2个回答

4
由于图像是PNG格式,因此imread()返回一个整数图像,其强度值在[0 255]或等效范围内,具体取决于原始位深度。转换公式使得a成为一个double图像,预期其强度在[0 1]范围内。由于a中的所有像素值可能远大于1,因此它们被imshow()剪切为1(白色)。

最好的选择是在开始之前明确转换图像格式 - 这将正确处理缩放:

i = imread('/usr/share/icons/matlab.png');
i = im2double(i);
a = .299*i(:,:,1) + .587*i(:,:,2) + .114*i(:,:,3);  % no need for loops
imshow(a);

3
如果没有图像处理工具箱,可以用double(i)./double(intmax(class(i)))替换im2double,前者是将图像转为双精度类型的方法。 - Daniel
如果我使用你的方程式,似乎不需要使用im2double。 - user3263192
@user3263192 如果您不预分配a,它将创建一个原始位深度的整数灰度图像,此时不需要重新缩放。但是,如果您使用整数进行操作,请注意四舍五入和溢出问题 - 对于更复杂的处理算法,双精度可能更可取。 - Notlikethat

0
input=imread('test.jpg');
subplot(1,2,1), imshow(input), title('RGB Scale image');
[x,y,~] = size(input);

for i = 1:1:x
   for j = 1:1:y
      output(i,j) = 0.40*input(i,j,1) + 0.50*input(i,j,2) + 0.30*input(i,j,3);
   end
end

subplot(1,2,2), imshow(output), title('Gray Scale  image');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接