HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S:取值范围为0.0~1.0;
亮度V:取值范围为0.0(黑色)~1.0(白色)。
如图所示: 这个锥体的高表示亮度,越往上越亮,取值范围【0,1】;
中心到边缘的距离表示饱和度,越靠边饱和度越大,取值范围【0,1】;
旋转角度表示的是色调,范围【0,360】;
opencv 在上面的范围基础上进行了转化。
H: 0— 180 (即H = H / 2)
S: 0— 255 (即S = S * 255)
V: 0— 255 (即V = V * 255)
OpenCV中有超过150种颜色空间转换方法。最广泛使用的,BGR↔灰色和BGR↔HSV。
对于颜色转换,我们使用cv函数。cvtColor()
CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
@param src //输入图像:8位无符号,16位无符号(CV_16UC ...)或单精度浮点数。
@param dst //输出图像的大小和深度与src相同。
@param code //颜色空间转换代码(请参见#ColorConversionCodes)。
@param dstCn //目标图像中的通道数;如果参数为0,则通道是自动从src和代码派生的。
对于BGR→灰度转换,我们使用标志cv::COLOR_BGR2GRAY。
对于BGR→HSV,我们使用标志cv::COLOR_BGR2HSV。
如果将#cvtColor用于8bit图像,转换会损失一些信息。建议先转化为CV_32F
@code
img *= 1./255;
cvtColor(img, img, COLOR_BGR2Luv);
@endcode
现在我们知道了如何将BGR图像转换成HSV,我们可以使用它来提取一个有颜色的对象。在HSV中比在BGR颜色空间中更容易表示颜色。下面我们将尝试提取图片中红色部分。
方法如下:
CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);
@param src //输入数组。
@param lowerb //包括下边界数组或标量。
@param upperb //包含上边界数组或标量。
@param dst //输出数组,其大小与src相同,类型为CV_8U,单通道。
int main() {
cv::namedWindow("src",0);
cv::namedWindow("dst", 0);
cv::Mat src = cv::imread("./img/test1.jpg", 1);
cv::Mat dst,dst1,hsv;
cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV);
cv::inRange(hsv, cv::Scalar(0, 43, 46), cv::Scalar(10, 255, 255),dst);
cv::inRange(hsv, cv::Scalar(156, 43, 46), cv::Scalar(180, 255, 255), dst1);
dst = dst + dst1;
cv::imshow("src", src);
cv::imshow("dst", dst);
cv::waitKey(0);
}