【问题标题】:How to mask green pixels?如何掩盖绿色像素?
【发布时间】:2012-09-10 07:15:12
【问题描述】:

我需要屏蔽图像中的绿色像素。 我有掩蔽红色像素的例子。 示例如下:

Image<Hsv, Byte> hsv = image.Convert<Hsv, Byte>()

Image<Gray, Byte>[] channels = hsv.Split();

               //channels[0] is the mask for hue less than 20 or larger than 160

CvInvoke.cvInRangeS(channels[0], new MCvScalar(20), new MCvScalar(160), channels[0]);
               channels[0]._Not();

但是,我不明白这些参数是从哪里来的:

new MCvScalar(20), new MCvScalar(160)

知道我必须采用哪些参数来掩盖绿色像素吗? 提前谢谢你。

【问题讨论】:

    标签: image-processing opencv computer-vision emgucv


    【解决方案1】:

    代码用 20 - 160 范围之外的色调屏蔽像素(或者更确切地说屏蔽范围内的像素,然后反转屏蔽)。

    首先,了解 HSV(色相、饱和度、值):http://en.wikipedia.org/wiki/HSL_and_HSV

    实际的色调以度为单位,从 0 到 360 度,例如:

    那就见OpenCV documentation on 8-bit HSV format

    先在 0 - 360 范围内计算色调,然后除以 2 以适应 8 位整数。

    这意味着在原始示例中,蒙版像素的实际色调低于 40 度或高于 320 度。显然是 0 度正负 40。

    对于类似的果岭范围,您需要 120 +/- 40,即从 80 到 160。最后将其转换为 8 位表示 - 从 40 到 80。

    但实际代码与您的示例不同:对于红色,他们必须屏蔽 20,160,然后反转屏蔽。对于绿色,只需从 40 到 80 进行屏蔽就足够了(即您必须省略 channels[0]._Not(); 部分)。

    【讨论】:

    • 实际上,您的原始(红色)解决方案将在感知上掩盖恰好略带红色的白色/灰色/黑色像素。为了获得更好的结果,您可以屏蔽饱和度,甚至可以屏蔽值,然后将屏蔽与 and* 结合使用。但实际范围取决于您要解决的问题(因为“绿色像素”是一个模糊的表述)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2014-04-19
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多