Matlab - 如何检测图像上的绿色?
Matlab - How to detect green color on image?
我从事的项目基本上是检测图像上的三分并删除其他信息。我使用 HSV 作为分割和函数 regionprops 来检测每个元素。它工作正常,但在具有屋顶的相同情况下,它们不会被删除,因为 Hue 的值与三个相似。到目前为止,这是结果:
为了移除屋顶,我认为也许可以在检测到的每个区域中检测到绿色。如果该区域没有 70% 的绿色(例如),则该区域将被删除。我怎样才能做到这一点?如何只检测图像的绿色?
解法说明
评估补丁中的绿色级别是一个有趣的想法。我建议采用以下方法:
将您的色块从 RGB 颜色系统转换为 HSV 颜色系统。在 HSV 颜色系统中,通过检查第一个通道更容易评估每个像素的色调(或 - 颜色)。
求色相系统中绿色的范围。在我们的例子中,它大约是 [65/360,170/360],可以看出 here:
- 对于每个补丁,计算有多少像素的色调值在绿色范围内,然后除以连通分量的大小。
代码示例
以下函数计算补丁中的 "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
我从事的项目基本上是检测图像上的三分并删除其他信息。我使用 HSV 作为分割和函数 regionprops 来检测每个元素。它工作正常,但在具有屋顶的相同情况下,它们不会被删除,因为 Hue 的值与三个相似。到目前为止,这是结果:
为了移除屋顶,我认为也许可以在检测到的每个区域中检测到绿色。如果该区域没有 70% 的绿色(例如),则该区域将被删除。我怎样才能做到这一点?如何只检测图像的绿色?
解法说明
评估补丁中的绿色级别是一个有趣的想法。我建议采用以下方法:
将您的色块从 RGB 颜色系统转换为 HSV 颜色系统。在 HSV 颜色系统中,通过检查第一个通道更容易评估每个像素的色调(或 - 颜色)。
求色相系统中绿色的范围。在我们的例子中,它大约是 [65/360,170/360],可以看出 here:
- 对于每个补丁,计算有多少像素的色调值在绿色范围内,然后除以连通分量的大小。
代码示例
以下函数计算补丁中的 "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