车牌校正中水平方向的边缘提取

一笑奈何 提交于 2019-12-20 04:59:03
1.下面是一个水平角度调试比较好的设置
一下是主要几个参数:
 cvSobel(img,imgS,0,1,3);
 cvErode(imgTh,imgTh,KernelVertical,1);

经过试验验证,其实用scharr滤波器比sobel滤波器更好,scharr滤波器只是把最后一个svSobel参数改为-1
 cvSobel(img,imgS,0,1,-1);
scharr滤波器的滤波系数和sobel的滤波系数有差异,
书上说Scharr滤波器同sobel滤波器一样快,但是准确率更高。



使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分

void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
src输入图像.dst输出图像.xorderx 方向上的差分阶数yordery 方向上的差分阶数aperture_size扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况, 使用 3x1 或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是:

对 x-方向 或矩阵转置后对 y-方向。

函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:

由于Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。第一种情况对应:

核。

第二种对应:

或者

核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即像素的位深)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 把运算结果(dst)转换为 8 位的。除了8-位图像,函数也接受 32-位 浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。

http://hi.baidu.com/uestclgh/item/360d811853a2a9fddceeca88

1.倾斜的车牌:


2.经过sobel算子提取的水平方向边沿:
 cvSobel(img,imgS,0,1,3);


3.在保证准确性的前提下,为了降低hough变换的时间复杂度,将sobel计算的到的水平边沿图像进行3像素单位的腐蚀:
IplConvKernel* KernelVertical=cvCreateStructuringElementEx(1,3,0,1,CV_SHAPE_RECT); 
cvErode(imgTh,imgTh,KernelVertical,1);



这样再经过hough变换就可以求出车牌水平方向的倾斜角度。
水平旋转车牌后,可以就行垂直方向上的仿射变换。而不是垂直方向的简单旋转,
经过仿射变换后,车牌的倾斜校正就完成了,
为车牌的字符分隔,字符识别完成预处理。
下一篇:车牌识别的垂直校正

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!