OpenCV 学习笔记(提取图像中特定颜色区域)

OpenCV 学习笔记(提取图像中特定颜色区域)

我们经常需要提取图像中某种特殊颜色的区域,比如黄色或者红色区域。如果只是提取特点的颜色,那么很简单,直接做颜色比较就可以了。如果要选取某个颜色范围,这个工作在 RGB 空间中就不是那么方便了。这时我们通常会选取 HSV 或类似的颜色空间。

关于 HSV 空间的介绍网上有很多,这里就不详细写了。但是可以认为 Hue 表示颜色,Saturation 表示颜色的饱和度,Brightness 是亮度。选取颜色范围时我们通常用 Hue 和 Sat 两个维度。下面是在网上找到的一个代码片段,我觉得很实用,就放到这里了。

/**
 * @brief detectHSColor 提取图像中具有特定颜色范围的区域,图像是3 通道 BGR 图像
 * @param image 输入图像,要求是 3 通道 BGR 图像
 * @param minHue  Hue 的最小值,Hue 范围 0-179 (Hue本质是个角度,在0-360之间,OpenCV 用 0-180 表示。0表示红色。)
 * @param maxHue  Hue 的最大值,Hue 范围 0-179
 * @param minSat Sat 的最小值,Sat 范围 0-255
 * @param maxSat Sat 的最大值,Sat 范围 0-255
 * @param mask 提取出的区域
 */
void detectHSColor(const cv::Mat &image,
                   double minHue, double maxHue,
                   double minSat, double maxSat,
                   cv::Mat &mask)
{
    cv::Mat hsv;
    cv::cvtColor(image, hsv, CV_BGR2HSV);
    std::vector channels;
    cv::split(hsv, channels);
    cv::Mat mask1, mask2, hueMask;
    cv::threshold(channels[0], mask1, maxHue, 255, cv::THRESH_BINARY_INV);
    cv::threshold(channels[0], mask2, minHue, 255, cv::THRESH_BINARY);
    if(minHue < maxHue)
    {
        hueMask = mask1 & mask2;
    }
    else
    {
        hueMask = mask1 | mask2;
    }
    cv::Mat satMask;
    cv::inRange(channels[1], minSat, maxSat, satMask);
    mask = hueMask & satMask;
}

下面给一个简单的例子:

    cv::Mat image = cv::imread("D:\\向日葵.jpg");

    cv::imshow("origin", image);
    cv::Mat mask;
    detectHSColor(image, 10, 40, 200, 255, mask);

    cv::Mat out;
    image.copyTo(out, mask);

    cv::imshow("out", out);

下面是输出结果:
OpenCV 学习笔记(提取图像中特定颜色区域)_第1张图片可以看到提取的效果还蛮不错的。

你可能感兴趣的:(OpenCV 学习笔记(提取图像中特定颜色区域))