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 }
下面给一个简单的例子:
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);
下面是输出结果:
可以看到提取的效果还蛮不错的。