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<cv::Mat> 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; 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 学习笔记(提取图像中特点颜色)我们经常需要提取图像中某种特殊颜色的区域,比如黄色或者红色区域。如果只是提取特点的颜色,那么很简单,直接做颜色比较就可以了。如果要选取某个颜色范围,这个工作在 RGB 空间中就不是那么方便了。这时我们通常会选取 HSV 或类似的颜色空间。关于 HSV 空间的介绍网上有很多,这里就不详细写了。但是可以认为 Hue 表示颜色,Saturation 表示颜色的饱和度,Brightness 是亮度。选取颜色范围时我们通常用 Hue 和 Sat 两个维度。下面是在网上