因此,我已经搜索了很多有关车牌号图像处理的文章,因为它基本上与读取浮雕字符相同。但是我的问题是,如果浮雕字符的颜色与卡片的颜色相同,那么使用自适应阈值将很难识别。你们对我将如何实现阅读浮雕字符的目标有任何想法吗?或者,如果有关于它的任何文章,那就太好了。这是我的示例图片
我已经读过这个article,但真的不知道如何将其转换为实际代码。
答案 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()
进行提取就可以了!
您可以根据自己的情况使用一些数字参数来调整结果,因为我的项目更多地是关于扫描的文档而不是信用卡号。
祝你好运!