OpenCV-图像处理技术,可以更好地读取浮雕字符(例如信用卡,车牌号)

时间:2018-06-28 06:12:29

标签: java android opencv image-processing ocr

因此,我已经搜索了很多有关车牌号图像处理的文章,因为它基本上与读取浮雕字符相同。但是我的问题是,如果浮雕字符的颜色与卡片的颜色相同,那么使用自适应阈值将很难识别。你们对我将如何实现阅读浮雕字符的目标有任何想法吗?或者,如果有关于它的任何文章,那就太好了。这是我的示例图片

我已经读过这个article,但真的不知道如何将其转换为实际代码。

这是我的示例图片 enter image description here

1 个答案:

答案 0 :(得分:1)

您可以尝试this代码。它在python中,但是根据我的个人经验,所有的opencv方法都与Java完全相同。

编辑: 您可以跳过此处使用的所有OCR增强方法。让我描述一下您可以使用的过程:

在python中,使用上面的链接:

首先,将颜色转换应用于灰度:

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

然后: 应用高帽(whitehat)形态运算符查找光 深色背景的区域。

rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)

由于图像对比度不高,您可能需要先使用阈值。

gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)
thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

对二进制图像进行第二次关闭操作,以使区域出现并缩小信用卡号区域之间的间隙

sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))    
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)

然后找到您的卡号区域的轮廓

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
locs = []

您将获得一系列可以使用this thread提取的区域

在Java中:

我以前用Java写过类似的东西,您应该有类似的东西(ImgTransformation是我的类之一,它简化了一些opencv参数,它基本上与Imgproc相同,请检查doc here):

图像转换:

ImgTransformation.adjustConvertColor(tempMat,tempMat,Imgproc.COLOR_BGR2GRAY);

Imgproc.adaptiveThreshold(tempMat,tempMat,255,Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY,31,40);

ImgTransformation.gaussianBlur(tempMat,tempMat,5,5,2);
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new  Size(2*1 + 1, 2*1+1));
Imgproc.dilate(tempMat,tempMat,element);
Imgproc.erode(tempMat,tempMat,element);
ImgTransformation.adjustBinary(tempMat,tempMat,205,255,Imgproc.THRESH_BINARY_INV);

细分:

Mat structuringElements = ImgSegmentation.getStructuringElement(Imgproc.MORPH_RECT, new Size(5, 3));
Imgproc.dilate(tempMat,tempMat,structuringElements,new Point(-1,-1),16);

然后提取区域:

List<MatOfPoint> contours = ImgSegmentation.findContours(tempMat, tempMat);

您只需要使用submat()进行提取就可以了! 您可以根据自己的情况使用一些数字参数来调整结果,因为我的项目更多地是关于扫描的文档而不是信用卡号。

祝你好运!