这次我打算把轮廓查找,形状查找,感兴趣区域(roi),绘制图形,增强对比度,锐化图片,imwirte都一并讲了。因为之前老师叫我做了一个检测车牌的小程序,刚好我自己设计的算法里都需要这些,那就讲到这些东西的时候我再拓展开来讲了,这个可能一下子没办法总结完,不急,慢慢来。
我先讲一下我的算法:
我的思路很简单,就是能够说从图像中找到一些符合车牌大小颜色的矩形区域,因为车牌是矩形的嘛,然后最后根据SVM去判断是不是车牌,如果是的话,就把这些roi用绿框框起来。那么接下来我是如何实现车牌区域的查找呢。
直接根据彩色图像来查找绝对是不行的啦。因为担心老师给的图像会有些暗,可能一张图片中车牌区域的颜色就没有那么明显了,所以我们第一步要先提高对比度。
对比度亮度提高:
可以看到,左边是经过提高对比度后 ,车牌区域的颜色和周围颜色的区别就更加的大了,这样的好处是让车牌变得更白,要来判断roi的HSV白色颜色概率的时候能够更加精准。
void raise(Mat & src)//提高亮度以及对比度
{
Mat dest;
namedWindow("src", CV_WINDOW_AUTOSIZE);
imshow("src", src);
dest = Mat::zeros(src.size(), src.type());
int width = src.cols;
int height = src.rows;
int channels = src.channels();
float alphe = 1.1; //(alphe > 1)
int beta = -30;// 负数对比度越高
Mat m1;
src.convertTo(m1, CV_32F); //将原始图片数据(CV_8U类型)转换成CV_32类型,以提高操作的精度
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (channels == 3) { //对于3通道
float b = m1.at<Vec3f>(row, col)[0];
float g = m1.at<Vec3f>(row, col)[1];
float r = m1.at<Vec3f>(row, col)[2];
dest.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alphe * b + beta);
dest.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alphe * g + beta);
dest.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alphe * r + beta);
}
else if (channels == 1) { //对于单通道
int pix = src.at<uchar>(row, col);
dest.at<uchar>(row, col) = saturate_cast<uchar>(alphe * pix + beta);
}
}
}
dest.copyTo(src);
/*namedWindow("change");
imshow("change", src);
waitK