OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)

  • 以前学习了些opencv知识,最近在公司又接触了数字识别,经过一个月的努力,最终识别效果还不错,发文记录一下大概方法与流程。第一次发文,多多包涵。
  • 图像二值化对光照非常敏感,在对数据采集时加了外置光源,二值化后做矫正训练,但测试时不进行预处理的话识别效果不理想,特别是最后一位,靠近边缘部分偏暗,试了多种预处理方法仍不理想,最终在网上看了一些图像增强算法,试了效果不错,最终选用对数增强方法。

     

原图
图1 待识别原图
log增强后图片
图2 对数增强后图片
图3 自适应二值化
  • 图1是通过摄像头采集的原图,图2是经过Log增强后的图片,图3是对其进行预处理后的图片。
  • 预处理流程包括  (1)灰度化(2)自适应二值化(3)腐蚀(1、0、7这样的数字tesseract自带库无法识别,训练校正之后图片也会将其识别成两行,所以将其进行一次腐蚀使其连在一起)(4)滤波
  • 对预处理后的图片用tesseract训练好的库进行识别,识别率在98%以上。

注:若直接对原图进行自适应二值化(图5)或者大津法二值化(图4),效果都不理想,图像周围会有很多大大小小的噪点,最后一位噪点更多。其效果如下,图4是大津法二值化,5图是自适应二值化

图4 大津法
图5 自适应二值化

 

部分代码如下:

Mat imageLog(imgsrc.size(), CV_32FC3);    
    for (int i = 0; i < imgsrc.rows; i++)    
    {        
        for (int j = 0; j <imgsrc.cols; j++)        
        {            
            imageLog.at<Vec3f>(i, j)[0] = log(float(1 + imgsrc.at<Vec3b>(i, j)[0]));        
            imageLog.at<Vec3f>(i, j)[1] = log(float(1 + imgsrc.at<Vec3b>(i, j)[1]));            
            imageLog.at<Vec3f>(i, j)[2] = log(float(1 + imgsrc.at<Vec3b>(i, j)[2]));        
        }    
    }    
    //归一化到0~255        
    normalize(imageLog, imageLog, 0, 255, CV_MINMAX);     
    //转换成8bit图像显示        
    convertScaleAbs(imageLog, imageLog);    
    
    imshow("i",imageLog);
    Mat gray;
    cvtColor(imageLog,gray,COLOR_RGB2GRAY); 
    Mat otsu_image;
    //threshold(gray, otsu_image, 0, 255, CV_THRESH_OTSU);
    cv::adaptiveThreshold(gray, otsu_image,255,ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY,91,0);
    //腐蚀
    Mat erode_image;
    Mat element2 = getStructuringElement(MORPH_CROSS, Size(3, 3));
    erode(otsu_image, erode_image, element2);

    Mat dst;
    GaussianBlur(erode_image, dst, Size(3, 3),0);

图像增强方法参考 https://blog.csdn.net/dcrmg/article/details/53677739

数字识别库可以下载自己训练的 https://download.csdn.net/download/kangshuaibing/10690657

最后再放一张公司产品图,由于数字不是标准的阿拉伯数字,tesseract自带库识别率很低,所以需自己训练库,训练采集了300张这样的图片

图6

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值