车牌识别之车牌定位(一)
摘要:最近在网上参考了一些博客以及参考书,对于车牌识别中的车牌定位做了一些了解,这次实验主要是实现前两个步骤,即图像的高斯模糊和灰度化。
关键词:GaussianBlur cvtColor
高斯滤波
车牌识别中利用高斯模糊将图片平滑化,去除干扰的噪声对后续图像处理的影响。
void GaussianBlur(InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY=0,int bordeType=BORDER_DEFAULT)
高斯滤波支持in place(in place 即意味着输入图像与结果图像是同一个图像 )的方式输入。高斯滤波具有标准sigma值的3×3,5×5和7×7比其他核有更优的性能。
src和dst:前者是平滑操作的输入图像,后者是结果;
ksize:高斯内核大小。ksize.width和ksize.height允许不相同但是它们必须是正奇数。或者等于零,由参数 sigma的乘积决定;
sigmaX和sigmaY:前者是高斯内核在X方向的标准方差,后者是高斯内核在Y方向的标准方差。如果sigmaY为0,它将和sigmaX的值相同,若都为0,则由ksize.width和ksize.height的乘积计算得出;
bordeType:用于判断图像边界的模式。
灰度化
void cvtColor(InputAarry src,OutputArray dst, int code, int dstCn=0)
src 和dst:输入图像,输出结果;
code:输出图像颜色空间转换的代码;
dstCn:目标图像中的信道数;如果参数为0,则从SRC和代码自动导出信道的数目。
实验代码如下:
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace cv;
int main(int argc, char* argv[])
{
Mat m = imread("1.jpg", CV_LOAD_IMAGE_COLOR);//读入一张图片
imshow("显示原图", m);
//高斯模糊
Mat out;
GaussianBlur(m, out, Size(7, 7), 0, 0);//进行高斯滤波操作
imshow("高斯滤波【效果图】", out);//输出效果图
//均值模糊
//Mat dst;
//blur(m, dst, Size(7, 7));
//imshow("均值滤波【效果图】", dst);//进行均值滤波操作
IplImage src(m);
cvNamedWindow("showImage");//创建showImage窗口
IplImage* img = cvCreateImage(cvGetSize(&src), 8, 1);//创建一幅无符型8位单通道的图片,大小和原图相同
cvCvtColor(&src, img, CV_BGR2GRAY);//转为灰度图
cvShowImage("灰度图【效果图】", img);//显示效果图
cvWaitKey(0);
cvReleaseImage(&img);//释放图片指针
cvDestroyWindow("showImage");//销毁showImage窗口
return 0;
}
运行结果如下图:
关于 图像的平滑处理,据我所了解大多是用高斯模糊,之前了解过一点均值滤波,所以就也使用了这个方法,但是从运行结果来看,效果没有高斯滤波的好。后来,在网上查了一下,发现均值滤波本身存在着固有缺陷,即它不能够很好的保护图像细节,在图像去噪的同时破坏了图像的细节部分,从而使图像变得模糊,不能很好地达到去噪的效果。
参考文献:《学习OpenCv(中文版)》P128-134