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

Converting a RGB image to grayscale based on the intensity of one color channel

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

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

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

如果您想避免应用 jet 颜色图,请更改颜色图:

colormap('gray')

或将 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]

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

您可能会使用 imshow 来可视化结果,这会自动将坐标轴的颜色限制设置在 01 之间。您的图像是 RGB,红色通道的值范围从 0255。因此,如果您只为 imshow 指定一个输入,您将得到一张图像,其中所有值 > 1 都将显示为白色,所有零值将显示为黑色。所以你的图像并不是真正的二元图像,它只是 那样显示

您想使用 imagesc 显示您的图像,这将自动缩放颜色限制以匹配您的数据:

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

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

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

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

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

隔离通道可能更好:

>> 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;

这是结果的子图:

此外,您应该知道 'naive' 生成灰度图像的方法不会保留人眼感知的 'luminosity' 颜色,因为 'green' 同时'red' 和 'blue' 的强度实际上会被人眼感知为 更亮 ,同样地,'red' 比 'blue' 更亮。 Matlab 提供了一个 rgb2gray 函数,可以将 rgb 图像转换为正确保留亮度的灰度图像。这与您的 pure 红色、绿色和蓝色转换无关,但对于 'pink-to-grayscale' 图像可能需要考虑。例如,比较下面的两张图片,您会发现细微的对比度差异。

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

两者的子图:

从某种意义上说,您可能更关心左边(幼稚)的,因为您不关心将粉色的转换为灰色的"visually",但您更关心红色和蓝色荧光素在灰度图像上的强度为 "comparable"(因为它们代表测量值而不是视觉场景)。但在将 RGB 图像转换为灰度图像时,请牢记这一重要区别。