我想将图像像素分割成植被和非植被。为此开发了过多的绿色提取算法。算法如下所示。
Outimage(x,y,z)= inimage(x,y,z)
if {inimage(x,y,r)< (x,y,g)inimage(x,y,b)< (x,y,g)}
outimage(x,y,z)= 0否则*
其中outimage(x,y,z)是以jpg格式保存的过度绿色分割后的输出图像,inimage(x,y,z)是相机获取的图像,x是每行中的像素数,y是每列中的像素数,z是红色的主色平面,z等于1,绿色z是2,蓝色是z。
我没有得到如何实现这一点,所以请帮助我实现它。或者只是给出一些粗略的想法或建议如何实现它。
输入图片:
输出:
我希望在应用上述算法后输出采用这种格式
答案 0 :(得分:4)
构建2D蒙版,然后使用bsxfun
将其应用于所有颜色分量(第三个暗淡切片):
inimage = imread('filename'); %// type uint8
mask = inimage(:,:,1)<inimage(:,:,2) & inimage(:,:,3)<inimage(:,:,2); %// 2D mask
outimage = bsxfun(@times, inimage, uint8(mask)); %// apply mask replicated along 3rd dim
答案 1 :(得分:1)
另一种解决方案是将图像转换为HSV colorspace,如果您不熟悉它,它会将RGB值转换为Hue(颜色),饱和度(颜色多么鲜艳),〜亮度(照度级)。关于这一点的好处是你可以在所有照明条件下寻找相同的颜色。
除了我们如何获得我们的面具(使用绿色色调)之外,它与rgb版本采用的过程完全相同
inimage = imread('plants.png');
hsv_im = rgb2hsv(inimage);
%plots only the hues so we can get an idea of what to segment out
hue_channel = 1;
figure(1)
imshow(hsv_im(:,:,hue_channel)); %displays only the hue channel/layer
colormap(hsv) %uses the hue colormap
colorbar %displays the colorbar
%masks the greenish regions (this is subjective)
mask = hsv_im(:,:,hue_channel) < 0.5 & hsv_im(:,:,hue_channel) > 0.2;
%applies the mask to all 3 color layers
outimage = bsxfun(@times, inimage, uint8(mask));
figure(2)
subplot(1,2,1);imshow(inimage);title('original image')
subplot(1,2,2),imshow(outimage);title('segmented image')