用于车牌的Opencv图像分割

时间:2017-05-03 01:23:50

标签: java opencv ocr image-segmentation

我正在研究一个能读取车牌的项目,我的计划是

  1. 将图像转换为灰度以获得更好的性能
  2. 使用直方图均衡器显示车牌字符
  3. 模糊图像以消除一些噪音
  4. 使用自适应阈值对图像进行二进制化
  5. 使用开放和关闭形态
  6. 检测车牌的矩形边界框
  7. 嗯,问题是:我的代码不太好,结果太差我无法检测到矩形,下面是我的代码:

    Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
        Imgproc.blur(image, image, new Size(3, 3));
        Imgproc.equalizeHist(image, image);
        Mat openElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
        Mat closeElem = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1));
        Imgproc.adaptiveThreshold(image, image, 225, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);
    

    输入图片:

    input image

    输出图像:

    Output image

    如果有经验的人会帮助我会很感激

2 个答案:

答案 0 :(得分:2)

首先要检测图像中的印版位置,只需按照以下步骤操作:

  1. 转换为灰色

    cvCvtColor(image,grayScale,CV_BGR2GRAY);

  2. enter image description here

    1. 做索贝尔

      Mat sobel = new Mat(grayScale.size(),CvType.CV_16S); cvSobel(grayScale,sobel,2,0,7); Mat temp = new Mat(sobel.size(),CvType.CV_8UC1); convertScaleAbs(sobel,temp,0.00390625,0);

    2. enter image description here

      1. 做阈值

        cvThreshold(sobel,threshold,0,255,CV_THRESH_BINARY | CV_THRESH_OTSU); enter image description here

      2. 做形态学

        Mat kernal = cvCreateStructuringElementEx(3,1,1,0,CV_SHAPE_RECT); cvDilate(threshold,erode_dilate,kernal,2); // X. vErode(erode_dilate,erode_dilate,kernal,4); // X. cvDilate(erode_dilate,erode_dilate,kernal,2); // X

        kernal = cvCreateStructuringElementEx(1,3,0,1,CV_SHAPE_RECT); cvErode(erode_dilate,erode_dilate,kernal,1); // Y. cvDilate(erode_dilate,erode_dilate,kernal,2);

      3. enter image description here

        1. 现在您可以检测到图像中的矩形:
        2. enter image description here

          1. 然后您可以处理OCR板
          2. 希望它可以帮到你!

答案 1 :(得分:0)

好的,这就是我想出来的

pip install selenium==2.53.6

找到最大的轮廓,高度,宽度和面积匹配某些值 enter image description here