当前位置: 首页 > 知识库问答 >
问题:

字符识别前的OpenCV图像预处理(tesseract)

施招
2023-03-14

我试图开发一个简单的车牌识别PC应用程序(Java+OpenCV+Tess4j)。图像不是真的好(在进一步,他们将是好的)。我想为tesseract预处理图像,我被困在车牌检测(矩形检测)上。

我的脚步:

1)源图像

Mat img = new Mat();
img = Imgcodecs.imread("sample_photo.jpg"); 
Imgcodecs.imwrite("preprocess/True_Image.png", img);
Mat imgGray = new Mat();
Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("preprocess/Gray.png", imgGray);
Mat imgGaussianBlur = new Mat(); 
Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(3, 3),0);
Imgcodecs.imwrite("preprocess/gaussian_blur.png", imgGaussianBlur);  
Mat imgAdaptiveThreshold = new Mat();
Imgproc.adaptiveThreshold(imgGaussianBlur, imgAdaptiveThreshold, 255, CV_ADAPTIVE_THRESH_MEAN_C ,CV_THRESH_BINARY, 99, 4);
Imgcodecs.imwrite("preprocess/adaptive_threshold.png", imgAdaptiveThreshold);

我用油漆从图像(第四步后)中裁剪出所需的区域,并得到:

然后我做了OCR(通过tesseract,tess4j):

File imageFile = new File("preprocess/adaptive_threshold_AFTER_PAINT.png");
ITesseract instance = new Tesseract();
instance.setLanguage("eng");
instance.setTessVariable("tessedit_char_whitelist", "acekopxyABCEHKMOPTXY0123456789");
String result = instance.doOCR(imageFile); 
System.out.println(result);

而且得到了(足够好?)结果-“Y841OX EH”(几乎正确)

共有1个答案

曹高轩
2023-03-14

以下是我建议你做这项任务的方法。

>

  • 转换为灰度。
  • 使用3x3或5x5滤波器进行高斯模糊。
  • 应用Sobel滤波器查找垂直边缘。

    Sobel(gray,dst,-1,1,0)

    1. 将Canny边缘检测器直接应用于输入图像。让canned图像为ic.
    2. 将Sobel滤波器和IC的结果相乘。基本上,拿一张Sobel和Canny的照片。
    3. 高斯模糊的结果图像与一个大的滤波器。我使用了21x21.
    4. 用Otsu的方法对得到的图像进行阈值。您将得到一个二进制图像
    5. 对于每个红色矩形,旋转该矩形内的部分(在二值图像中)使其直立。循环遍历矩形的像素并计数白色像素。(怎么旋转?)

    边缘密度=矩形中白色像素的数目/总数。矩形中像素的

    注意:您也可以使用步骤5中的二值图像来计算边缘密度,而不是通过步骤1到3。

  •  类似资料:
    • 我试图开发一个应用程序,使用Tesseract从手机摄像头拍摄的文件中识别文本。为了更好的识别,我使用OpenCV对图像进行预处理,使用高斯模糊和阈值方法进行二值化,但结果很糟糕。 我可以使用哪些其他过滤器来使图像对Tesseract更具可读性?

    • null 有些数字比其他数字更好用--例如,'1'似乎有很多麻烦。出现在“+”或“-”后面的数字通常不显示出来,“+”通常显示为“-”。我也玩了一下阈值。 最后三个部分是因为我的视频样本,我一直在画有点歪斜。我可以尝试使用一些更好的数据,我也可以尝试在标准的“letsgoDigital”朗上制作自己的训练数据。虽然我觉得我没有以最好的方式进行图像处理,但我希望得到一些指导。 我计划使用某种程度的边

    • 为了用OCR库tesseract获得更好的结果,我会做一些预处理,但还不知道什么步骤可以帮助我。 我试图用15因子调整图像的大小,并应用了一个适应的阈值(见图像),但这导致了“波浪”字符,这无法用tesseract OCR库检测到。在底部,你可以通过Dropbox找到我的图像链接。原始图像大小为115x18px,字符高度为10px。 我想从背景中提取人物。什么步骤可以导致更好的结果?对于OCR部分

    • @subpage tutorial_py_colorspaces_cn 学习如何将图像从一个颜色空间变换到另外一个。 另外,我们还将学习在一段视频中追踪一个有颜色的物体。 @subpage tutorial_py_geometric_transformations_cn 学习对图像进行不同的几何变换,像旋转、平移等等。 @subpage tutorial_py_thresholding_cn 学习

    • [source] ImageDataGenerator 类 keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False,

    • 为什么车牌识别不正确呢? 原图: 我希望输出AT0H69