OpenCV 学习笔记(提取图像中特定颜色区域)
Posted liyuanbhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<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;
}
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 学习笔记(提取图像中特定颜色区域)的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 学习笔记(直方图反向投影 BackProject)