我刚刚开始图像处理,我正在寻找进行对象检测的方法或想法。我的最终目标是将静态道路对象(例如车道标记和箭头标志)划分出来。目前,我的方法包括去噪,直方图均衡,阈值化和在图像上绘制轮廓。我寻求图像过滤的指导和帮助,并在此先感谢大家。
问题1:如何从处理后的图像1中移除不需要的背景并保留车道标记和箭头标志?
原始图片1:
处理后的图片1:
问题2:从原始图像2中可以看到,与原始图像1相比,曝光量有所不同,因此该算法无法检测到车道标记和箭头标志。如何使算法对光的照射更鲁棒?
原始图片2:
处理后的图片2:
代码:
// Load the image
Mat image = imread(imagePath,IMREAD_COLOR);
//Grayscale image
Mat imageGrayscale(image.size(),image.type());
cvtColor(image,imageGrayscale,COLOR_BGR2GRAY);
fastNlMeansDenoising(imageGrayscale,imageGrayscale);
equalizeHist(imageGrayscale,imageGrayscale);
//Calculate the average grayscale intensity
int total=0, avgIntensity=0;
for(int i=0; i<imageGrayscale.rows; i++){
for(int j=0; j<imageGrayscale.cols; j++){
total += imageGrayscale.at<uchar>(i,j);
}
}
avgIntensity = total/(imageGrayscale.rows*imageGrayscale.cols);
//Create a binary image
Mat imageBinary(image.size(),image.type());
threshold(imageGrayscale,imageBinary,avgIntensity*1.8,avgIntensity*3,THRESH_BINARY);
//Draw lines
//Mat imageCanny(image.size(),image.type());
//Canny(imageBinary,imageCanny,100,300,3);
//Find contours from the binary image
vector< vector<Point> >contours;
findContours(imageBinary,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for(int i=0; i<contours.size(); i++){
drawContours(image,contours,i,Scalar(0,0,255),-1);
}
//Display the image
namedWindow("Image",WINDOW_AUTOSIZE);
imshow("Image",image);
waitKey(0);