我需要掩盖我的图像。所有像素的值都不是
R = 170-220 G = 100-150 B = 60-100
应屏蔽为黑色。
可以通过循环并找到像素值来做到这一点,如果它超出R或G或B的范围,然后将其替换为黑色像素,否则会保留其原始值,但是会花费很多。如何避免if循环功能。 matlab中有任何内置函数吗?
答案 0 :(得分:2)
使用逻辑索引代替。例如R
频道:
R = img(:,:,1);
R_Constraint = R >= 170 && R <= 220;
R(R_Constraint) = 1;
R(~R_Constraint) = 0;
分别对G
和B
执行此操作。然后,使用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