Matlab - 如何检测图像上的绿色?

Matlab - How to detect green color on image?

我从事的项目基本上是检测图像上的三分并删除其他信息。我使用 HSV 作为分割和函数 regionprops 来检测每个元素。它工作正常,但在具有屋顶的相同情况下,它们不会被删除,因为 Hue 的值与三个相似。到目前为止,这是结果:

为了移除屋顶,我认为也许可以在检测到的每个区域中检测到绿色。如果该区域没有 70% 的绿色(例如),则该区域将被删除。我怎样才能做到这一点?如何只检测图像的绿色?

解法说明

评估补丁中的绿色级别是一个有趣的想法。我建议采用以下方法:

  1. 将您的色块从 RGB 颜色系统转换为 HSV 颜色系统。在 HSV 颜色系统中,通过检查第一个通道更容易评估每个像素的色调(或 - 颜色)。

  2. 求色相系统中绿色的范围。在我们的例子中,它大约是 [65/360,170/360],可以看出 here:

  1. 对于每个补丁,计算有多少像素的色调值在绿色范围内,然后除以连通分量的大小。

代码示例

以下函数计算补丁中的 "level of greenness":

function [ res ] = evaluateLevelOfGreen( rgbPatch )
%EVALUATELEVELOFGREEN Summary of this function goes here
%   Detailed explanation goes here

%determines the green threshold in the hue channel
GREEN_RANGE = [65,170]/360;
INTENSITY_T = 0.1;

%converts to HSV color space
hsv = rgb2hsv(rgbPatch);

%generate a region of intereset (only areas which aren't black)
relevanceMask = rgb2gray(rgbPatch)>0;

%finds pixels within the specified range in the H and V channels
greenAreasMask = hsv(:,:,1)>GREEN_RANGE(1) & hsv(:,:,1) < GREEN_RANGE(2) & hsv(:,:,3) > INTENSITY_T;

%returns the mean in thie relevance mask
res = sum(greenAreasMask(:)) / sum(relevanceMask(:));



end

结果

在绿色补丁上使用时:

greenPatch1 = imread('g1.PNG');
evaluateLevelOfGreen(greenPatch1)
greenPatch2 = imread('g2.PNG');
evaluateLevelOfGreen(greenPatch2)
greenPatch3 = imread('g3.PNG');
evaluateLevelOfGreen(greenPatch3)

结果:

ans = 0.8230
ans =  0.8340
ans = 0.6030

在非绿色补丁上使用时:

nonGreenPatch1 = imread('ng1.PNG');
evaluateLevelOfGreen(nonGreenPatch1)

结果:

ans = 0.0197