如何在Matlab中标记像素?

时间:2016-02-28 21:01:02

标签: image matlab image-processing

我有一个图像,我试图将绿色的像素标记为0,并将所有绿色标记为1.但是,由于像素的格式为(x,y),因此我不确定如何处理它。到目前为止,我已经加载了图像并提取了绿色通道,假设它是RGB格式,所以类似于(0,255,0)

这是我到目前为止所拥有的:

% read in the image and display to make sure its loading correctly
    I = imread('Sample.tif');
    imshow(I)
    % extract green color channel
    green = I(:,:,2);
    % Extract all green pixels as an array? Then mark them as 0?

    % Display resulting image 
    imshow(I)

这里有任何建议或资源吗?提前致谢!

1 个答案:

答案 0 :(得分:0)

我不确定您的问题后到底是什么,但下面的代码可以帮助您实现结果。如果您发表评论,我或许可以改进答案。

0)以RGB格式读入图像。

第一个选项:分离绿色和其他组件(每个组件单独绘制),并将所有非绿色组件的最终绘图设置为1.注意:这会产生完全黑色的图像,因为所有组件都有一定量的绿色

第二个选项:根据最大贡献将图像分为红色,绿色或蓝色。最后一个图表显示转换为黑色和白色。注意:算法没有矢量化,因此如果处理大量/多个图像,这将会很慢。

I = imread('autumn.tif');

IG = I; IG(:,:,[1 3]) = 0; % Green only
INoG = I-IG; 
INoG1 = INoG; INoG1(abs(INoG1) > 0) = 1; 
              % Possibly what you want?


% Display resulting images
subplot(4,2,1)
imshow(I)
title('Original');

subplot(4,2,2)
imshow(INoG)
title('No Green');

subplot(4,2,3)
imshow(IG)
title('Only Green');

subplot(4,2,4)
imshow(INoG1)
title('No Green (all 1?)');
% Note: There is a bit of each color in every pixel...
%       => Potential solution: Use major contributor

% Not vectorized => Slow for large images
IRGB = I*0;
for i = 1:size(I,1)
for j = 1:size(I,2)
    [~,k] = max(I(i,j,:));
    if (size(k) > 1)
        k = k(1);
    end

    IRGB(i,j,k) = 255;
end
end

IRGBG = IRGB; IRGBG(:,:,[1 3]) = 0; % Green only
IRGBNoG = IRGB-IRGBG; 
BandWNoG = IRGBG(:,:,2); % Possibly what you want?

% Display resulting images
subplot(4,2,5)
imshow(IRGB);
title('RGB - Original');

subplot(4,2,6)
imshow(IRGBNoG);
title('RGB - No Green');

subplot(4,2,7)
imshow(IRGBG);
title('RGB - Only Green');

subplot(4,2,8)
imshow(BandWNoG)
title('Black and White - No Green');