车牌识别之车牌定位(一)


     摘要:最近在网上参考了一些博客以及参考书,对于车牌识别中的车牌定位做了一些了解,这次实验主要是实现前两个步骤,即图像的高斯模糊和灰度化。

      关键词: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

猜你喜欢

转载自blog.csdn.net/HHCCWWlxy/article/details/78287120