根据一个颜色通道的强度将RGB图像转换为灰度

时间:2016-07-25 16:42:42

标签: matlab image-processing rgb grayscale hsv

我正在处理与此类似的图像:a cell image,我想只提取红粉色部分。截至目前,我正在使用img(:,:,1)来提取红色值,但这会生成二进制图像。我想知道是否有办法提取“红色”值并根据其“红色”程度或强度产生灰度图像。任何帮助都是极好的。

3 个答案:

答案 0 :(得分:2)

您捕获的数据将是正确的(并且是灰度),但可视化可能不正确。在尝试可视化2D矩阵(与结果img(:,:,1)相同)时,matlab应用默认的色彩映射,结果为:

[x,y]=meshgrid(1:200, 1:200);
z=x.^2.*sin(y/max(y(:))*pi);
figure;imagesc(z);

enter image description here

如果您想避免应用jet色彩映射,请更改色彩映射:

colormap('gray')

enter image description here

或将2D矩阵更改为3D矩阵,明确指定要显示的颜色(必须是介于0和1之间的值):

z3d = z(:,:,[1 1 1]); % more efficient than repmat
z3d = (z3d - min(z(:)))./range(z(:)); % make sure values in range [0; 1]

enter image description here

您在色彩映射版本中看到了条带,因为默认情况下为色彩映射contains 64 different colors; 3d矩阵版本没有这个问题,因为它直接显示颜色。

答案 1 :(得分:2)

您可能会使用imshow来显示结果,这会自动将轴的颜色限制设置为01之间。您的图片为RGB,红色通道的值范围为0255。因此,如果您只为imshow指定一个输入,您将获得一个所有值>的图像。 1将显示为白色,所有零值都将为黑色。所以你的图像不是真正的二进制文件,它只是出现

您希望使用imagesc显示图片,这会自动缩放颜色限制以匹配您的数据:

imagesc(img(:,:,1));
colormap gray

或者您可以指定imshow的第二个输入,使其也可以缩放以适合您的数据范围:

imshow(img(:,:,1), [])

当您可视化所有通道时,这不是问题的原因是,如果您指定红色,绿色和蓝色通道,则将其视为真彩色图像,并忽略所有轴颜色限制。

答案 2 :(得分:2)

如果我可以添加您的问题,在我看来,您只是想单独(或组合)分离和可视化红色,绿色和蓝色荧光粉。我特别认为这是因为你提到'粉红色'。

隔离频道可能更好:

>> F_red = F; F_red(:,:,[2,3]) = 0;
>> F_green = F; F_green(:,:,[1,3]) = 0;
>> F_blue = F; F_blue(:,:,[1,2]) = 0;
>> F_pink = F; F_pink(:,:,2) = 0;

这是结果的子图:

enter image description here

此外,您应该知道,生成灰度图像的“天真”方式不会保留人眼所感知的颜色的“光度”,因为“绿色”的强度与“红色”和“蓝色”相同实际上,人眼会将其视为更亮,同样“红色”比“蓝色”更亮。 Matlab提供rgb2gray函数,可将rgb图像转换为正确保留亮度的灰度图像。这与您的红色,绿色和蓝色转换无关,但可能需要考虑“粉红色到灰度”图像。例如,比较下面的两个图像,您将看到细微的对比差异。

>> F_pinktogray_naive = mean(F(:,:,[1,3]), 3);
>> F_pinktogray_luminance = rgb2gray(F_pink);

两者的子情节:

enter image description here

从某种意义上说,你可能更关心左(天真)的一个,因为你不关心将粉红色转换成灰色的“视觉”,但你更关心的是红色和蓝色荧光灯是“相当于“在灰度图像上的强度”(因为它们代表测量而不是视觉场景)。但是在将rgb图像转换为灰度时要记住这一点,这是一个重要的区别。