我正在处理与此类似的图像:a cell image,我想只提取红粉色部分。截至目前,我正在使用img(:,:,1)
来提取红色值,但这会生成二进制图像。我想知道是否有办法提取“红色”值并根据其“红色”程度或强度产生灰度图像。任何帮助都是极好的。
答案 0 :(得分:2)
您捕获的数据将是正确的(并且是灰度),但可视化可能不正确。在尝试可视化2D矩阵(与结果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矩阵版本没有这个问题,因为它直接显示颜色。
答案 1 :(得分:2)
您可能会使用imshow
来显示结果,这会自动将轴的颜色限制设置为0
和1
之间。您的图片为RGB,红色通道的值范围为0
至255
。因此,如果您只为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;
这是结果的子图:
此外,您应该知道,生成灰度图像的“天真”方式不会保留人眼所感知的颜色的“光度”,因为“绿色”的强度与“红色”和“蓝色”相同实际上,人眼会将其视为更亮,同样“红色”比“蓝色”更亮。 Matlab提供rgb2gray
函数,可将rgb图像转换为正确保留亮度的灰度图像。这与您的纯红色,绿色和蓝色转换无关,但可能需要考虑“粉红色到灰度”图像。例如,比较下面的两个图像,您将看到细微的对比差异。
>> F_pinktogray_naive = mean(F(:,:,[1,3]), 3);
>> F_pinktogray_luminance = rgb2gray(F_pink);
两者的子情节:
从某种意义上说,你可能更关心左(天真)的一个,因为你不关心将粉红色转换成灰色的“视觉”,但你更关心的是红色和蓝色荧光灯是“相当于“在灰度图像上的强度”(因为它们代表测量而不是视觉场景)。但是在将rgb图像转换为灰度时要记住这一点,这是一个重要的区别。