一般对颜色空间的图像进行有效处理都是在HSV空间进行的。
观察彩色物体时,我们用其色调、饱和度和明度来描述这个物体。
色调用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和;
明度V表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
以上转自百度百科https://baike.baidu.com/item/HSV/547122?fr=aladdin。
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H: 0 — 180
S: 0 — 255
V: 0 — 255
以上转自百度文库https://wenku.baidu.com/view/eb2d600dbb68a98271fefadc.html
颜色空间转换函数:cvtColor( )
默认图片一般为RGB图,但是opencv默认的图片通道存储顺序是BGR,即红绿蓝。
本程序实例:
cvtColor(srcImage,dstImage,COLOR_BGR2HSV);
BGR动态地址与HSV一一对应;
所以提取图片HSV值写法:
H = hsvframe.at<Vec3b>(i, j)[0];
S = hsvframe.at<Vec3b>(i, j)[1];
V = hsvframe.at<Vec3b>(i, j)[2];
此程序为红色提取,范围是:
((H >= 0 && H <= 10) || (H >= 156 && H <= 180)) && S >= 43 && V >= 46
摄像头开启程序:
VideoCapture capture(0);
图像显示:
capture >> frame;
imshow("读取视频", frame);
程序如下:
#include
using namespace cv;
void PickupRed(Mat& inputframe,Mat& outputframe);
int main()
{
VideoCapture capture(0);
while (1)
{
Mat frame;
Mat dstframe;
Mat redframe;
capture >> frame;
imshow("读取视频", frame);
PickupRed(frame, redframe);
imshow("视频", redframe);
waitKey(30);
}
return 0;
}
void PickupRed(Mat&inputframe, Mat& outputframe)
{
Mat hsvframe;
cvtColor(inputframe, hsvframe, COLOR_BGR2HSV);
outputframe = Mat(hsvframe.rows, hsvframe.cols,CV_8UC3, cv::Scalar(255, 255, 255));
int rowNumber = hsvframe.rows;
int colNumber = hsvframe.cols;
double H = 0.0, S = 0.0, V = 0.0;
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
{
H = hsvframe.at(i, j)[0];
S = hsvframe.at(i, j)[1];
V = hsvframe.at(i, j)[2];
if (((H >= 0 && H <= 10) || (H >= 156 && H <= 180)) && S >= 43 && V >= 46)
{
outputframe.at(i, j)[0] =inputframe.at(i, j)[0];
outputframe.at(i, j)[1] =inputframe.at(i, j)[1];
outputframe.at(i, j)[2] =inputframe.at(i, j)[2];
}
}
}
}
此程序没有对图片进行其他处理,效果一般。