车牌的Opencv图像分割

Posted

技术标签:

【中文标题】车牌的Opencv图像分割【英文标题】:Opencv Image segmentation for licence plate 【发布时间】:2017-09-30 16:03:18 【问题描述】:

我正在做一个会读取车牌的项目,我的计划是

    将图像转换为灰度以获得更好的性能 使用直方图均衡器显示车牌字符 模糊图像以去除一些噪点 使用自适应阈值对图像进行二进制化 使用开闭形态 检测车牌的矩形边界框

好吧,问题是:我的代码不太好,结果很糟糕,我无法检测到矩形,下面是我的代码:

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);

输入图像:

输出图像:

如果哪位有经验的可以帮忙,我将不胜感激

【问题讨论】:

【参考方案1】:

首先最好检测图像中的车牌位置,只需按照以下步骤操作:

    转为灰色

    cvCvtColor(image, grayScale, CV_BGR2GRAY);

    请不要这样做

    Mat sobel = new Mat(grayScale.size(), CvType.CV_16S); cvSobel(灰度, sobel, 2, 0, 7); 垫临时=新垫(sobel.size(),CvType.CV_8UC1); convertScaleAbs(sobel, temp, 0.00390625, 0);

    做阈值

    cvThreshold(sobel, 阈值, 0, 255, CV_THRESH_BINARY| CV_THRESH_OTSU);

    做形态学

    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);

    现在您可以检测到图像中的矩形:

    然后您可以对印版进行 OCR 处理

希望对你有帮助!

【讨论】:

请解释5. Now you are able to detect the rectangle in the image: @ZdaR 因为你的反对票,所以没有什么要解释的。请先阅读何时投反对票或投赞成票。 如果我未能解释我的观点,我很抱歉,但我很想知道从第 4 步开始,你有大约。 50 个轮廓,你是如何过滤掉唯一的车牌轮廓的,如果可以用一些代码 sn-p 来解释和支持,那么它对其他寻求相同问题帮助的人会大有裨益:) 嗯,如果你这样问我,不客气!因为那部分如果你知道轮廓很容易被过滤掉,只需检查每个轮廓的高度和宽度以及可能的大小,例如:宽度必须大于高度,大小必须大于和小于某个值(根据情况)。这样就可以过滤掉无效的矩形。 这里的重点是让盘子在二值图像中像一个矩形【参考方案2】:

好的,这就是我想出的

Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY, 0);
    originalFrameGrayScale = image.clone();

    Mat morph = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9, 3));
    Imgproc.morphologyEx(image, image, Imgproc.MORPH_TOPHAT, morph);
    Imgproc.Sobel(image, image, -1, 2, 0);
    Imgproc.GaussianBlur(image, image, new Size(5,5), 3,3);
    Imgproc.morphologyEx(image, image, Imgproc.MORPH_CLOSE, morph);
    Imgproc.threshold(image, image, 200, 255, Imgproc.THRESH_OTSU);
    Vector<Rect> rectangles = detectionContour(image);

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

【讨论】:

以上是关于车牌的Opencv图像分割的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实现车牌识别,OCR分割,ANN神经网络

OpenCV+Python识别车牌和字符分割

在opencv 3.0中擦除图像的阴影[关闭]

车牌识别项目全过程——opencv知识自学

基于python+Opencv的车牌识别

如何在python中使用opencv复制图像区域?