拟采用的技术路线
本次设计计划以最快的速度实现一个清晰车牌的识别,后续再增加识别精确度,故采取以下技术路线本篇文章主要讲述图像二值化的实现。
打开图像->二值化->边沿检测->包络检测->提取轮廓->车牌识别
腐蚀的实现
二值化完成之后,需要进行边沿检测,边沿检测之前需要对一些无用的点进行腐蚀,将无用的噪点给删除掉。
删除的原理则是通过8邻域取色素,进行处理。
以下实现了腐蚀功能,具体原理是通过窗口进行扫描,每一个点都会检测附近是否有黑点,如果有,则保留该黑点,如果没有则删除该黑点,能够清除掉小型的黑点,也就是去噪。
#define kernel_x 3
#define kernel_y 3
void CorAndExp::corrosion(QImage *m_qimg)//腐蚀实现
{
QColor pix;
int count;
QHash <int,QPoint*> hash;
QPoint* tmp_point;
int red_value=1;
for (int x=kernel_x;x<m_qimg->width()-kernel_x;x++) {
for(int y=kernel_y;y<m_qimg->height()-kernel_y;y++){
int grey=qGray(m_qimg->pixel(x,y));//获取当前坐标的灰度值
red_value=1;
if(grey==0){
// m_qimg->setPixel(x,y,qRgb(0,255,0));
//对像素点的8邻域进行处理
//8邻域中有任何一个点是0色,当前像素都应该是0色
for(int i=-1;i<kernel_x;i++){
for(int j=-1;j<kernel_y;j++){
int tmp_grey=qGray(m_qimg->pixel(x+i,y+j));
if(tmp_grey==255){
count++;
tmp_point=new QPoint(x,y);
hash.insert(count,tmp_point);
//m_qimg->setPixel(x,y,qRgb(0,0,0));
red_value=0;
break;
}
}
if(red_value==0)
break;
}
}
}
}
foreach (QPoint* a,hash)
{
m_qimg->setPixel(*a,qRgb(255,255,255));
delete a;
}
}
膨胀的实现
void CorAndExp::expansion(QImage *m_qimg)
{
QColor pix;
int count;
QHash <int,QPoint*> hash;
QPoint* tmp_point;
int red_value=1;
for (int x=kernel_x;x<m_qimg->width()-kernel_x;x++) {
for(int y=kernel_y;y<m_qimg->height()-kernel_y;y++){
int grey=qGray(m_qimg->pixel(x,y));//获取当前坐标的灰度值
red_value=1;
if(grey==255){
// m_qimg->setPixel(x,y,qRgb(0,255,0));
//对像素点的8邻域进行处理
for(int i=-1;i<kernel_x;i++){
for(int j=-1;j<kernel_y;j++){
int tmp_grey=qGray(m_qimg->pixel(x+i,y+j));
if(tmp_grey==0){
count++;
tmp_point=new QPoint(x,y);
hash.insert(count,tmp_point);
//m_qimg->setPixel(x,y,qRgb(0,0,0));
red_value=0;
break;
}
}
if(red_value==0)
break;
}
}
}
}
foreach (QPoint* a,hash)
{
m_qimg->setPixel(*a,qRgb(0,0,0));
delete a;
}
}
处理前后对比
二值化:
腐蚀后:
膨胀后: