根据一个颜色通道的强度将 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
来可视化结果,这会自动将坐标轴的颜色限制设置在 0
和 1
之间。您的图像是 RGB,红色通道的值范围从 0
到 255
。因此,如果您只为 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 图像转换为灰度图像时,请牢记这一重要区别。
我正在处理与此类似的图像: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
来可视化结果,这会自动将坐标轴的颜色限制设置在 0
和 1
之间。您的图像是 RGB,红色通道的值范围从 0
到 255
。因此,如果您只为 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 图像转换为灰度图像时,请牢记这一重要区别。