在进行opencv的颜色处理的时候,发现HSV通道进行阈值化的效果优于BGR通道,因此采用了HSV通道进行阈值划分,但是在识别红色时发现了一个问题,在opnecv中,HSV通道被划分为以下范围
H - (0-180)
S - (0-255)
V - (0-255)
在进行红色的识别时,发现怎么搞色块中都存在部分空缺,也就是无法识别的红色,如下图
于是上网查询了HSV的具体颜色划分,见下表
由此得知,在HSV通道中,红色的色调(H)存在着两个范围,因此使用单一的阈值化无法正确的将红色进行分离出来。
通过对两个阈值的二值化发现,两个范围的红色识别二值化图像刚好是互补的,于是想到使用像素操作,将两个图像进行相加,使两者白色部分融合,黑色部分保留。效果如下图
代码如下
Mat image_Processing(Mat imgOriginal)
{
Mat imgHSV, imgBGR;
Mat imgThresholded;
imshow("chushi", imgOriginal);
GaussianBlur(imgOriginal, imgOriginal, Size(7, 7), 0, 0);
imshow("gaosi", imgOriginal);
vector<Mat> hsvSplit; //创建向量容器,存放HSV的三通道数据
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
split(imgHSV, hsvSplit); //分类原图像的HSV三通道
equalizeHist(hsvSplit[2], hsvSplit[2]); //对HSV的亮度通道进行直方图均衡
merge(hsvSplit, imgHSV); //合并三种通道
Mat ce1;
Mat ce2;
Mat ce3;
inRange(imgHSV, Scalar(156, 43, 46), Scalar(180, 255, 255), imgThresholded); //红色
inRange(imgHSV, Scalar(156, 43, 46), Scalar(180, 255, 255), ce1); //红色
inRange(imgHSV, Scalar(0, 43, 46), Scalar(3, 255, 255), ce2); //红色
add(ce1,ce2,ce3,Mat());
imshow("0-10", ce1);
imshow("156-180",ce2);
imshow("add后", ce3);
}
至此,问题解决。
你永远不知道别人有多努力,因此请别停下来 --致彭某