根据像素值范围创建图像蒙版

时间:2018-07-01 12:12:23

标签: matlab image-processing

我需要掩盖我的图像。所有像素的值都不是

R = 170-220 G = 100-150 B = 60-100

应屏蔽为黑色。

可以通过循环并找到像素值来做到这一点,如果它超出R或G或B的范围,然后将其替换为黑色像素,否则会保留其原始值,但是会花费很多。如何避免if循环功能。 matlab中有任何内置函数吗?

2 个答案:

答案 0 :(得分:2)

使用逻辑索引代替。例如R频道:

R = img(:,:,1);
R_Constraint = R >= 170 && R <= 220;
R(R_Constraint) = 1;
R(~R_Constraint) = 0;

分别对GB执行此操作。然后,使用element-wise并获得最终结果为黑白图像。

G = img(:,:,2);
G_Constraint = G >= 100 && G <= 150;
G(G_Constraint) = 1;
G(~G_Constraint) = 0;

B = img(:,:,3);
B_Constraint = B >= 60 && B <= 100;
B(B_Constraint) = 1;
B(~B_Constraint) = 0;

img = R & G & B;
img(img == 1) = 255;
img = uint8(img); 

答案 1 :(得分:2)

您可以使用Matlab的逻辑索引功能。 它使您可以基于不同的逻辑语句(包括基于数组元素值本身的逻辑语句)为数组建立索引。

Image = imread('ImageName.extension');
%Read Image

R_Channel = Image(:,:,1);
G_Channel = Image(:,:,2);
B_Channel = Image(:,:,3);
    %Isolate Colour Channels.

    %R=170-220 G=100-150 B=60-100

    %Logical Indexing
R_Channel(R_Channel < 170 | R_Channel > 220)  = 0;   %Black Mask
G_Channel(G_Channel < 100 | G_Channel > 150)  = 0;   %Black Mask
B_Channel(B_Channel < 60  | B_Channel > 100)  = 0;   %Black Mask
    %Apply constraint on each Channel

MaskedImage = cat(3,R_Channel,G_Channel,B_Channel);
    %Merge all Colour channel to get the masked Image