最近在做项目,涉及到车道的检测。由于在日光下,原本就是白色或者是黄色的车道线会比较得很不清晰,于是很自然的想到了灰度拉伸的方案,从少量数据来看的结果,是好的。以下图为例,左图是三通道图,中间是利用opencv的cvtColor函数转换的灰度图,可以看到在右侧日光照射下的车道显得很不清晰,所以对高灰度值区域进行灰度拉伸,可以得到有图,显然车道清晰了很多。虽然由此左侧的车道没有原本那么明显了,但也还在可以接受的范围。
然后今天在探索能否实现自适应的拉伸方案时,用了自己手机拍摄的一张图片观察处理前后的灰度直方图,发现了一些特殊的情况。绘制灰度直方图和实现灰度拉伸的函数如下。
void GrayLinearTransform(Mat input, Mat &output, double x1 = 160, double y1 = 120, double x2 = 220, double y2 = 240);
void CheckGrayHist(Mat img)
{
if (img.channels() == 3) {
/*三通道图像,暂时不符合我们单通道灰度直方的需求.*/
cout << "Error" << endl;
}
else {
/*图像是单通道的*/
//Mat gray;
//cvtColor(img, gray, COLOR_BGR2GRAY);
int histsize &