如何使用 OpenCV 检测文本

Dou*_* LN 2 java opencv tesseract computer-vision east-text-detector

我正在处理一个项目,我应该从图像中检测并提取文本,以便稍后将其提供给搜索软件。

\n\n

我正在学习 OpenCV,但我在 Java 中找不到太多内容,只是在 Python 中。我想用 Java 实现这个。但如果您知道如何在 Python、C++ 中执行此操作,那就没问题了。我只需要算法来获得任何想法。

\n\n

我的计划是将图像旋转 90\xc2\xb0,使其成为二值图像(阈值),检测 ROI(感兴趣区域),在本例中是文本或可能是形状矩形,裁剪保存文本的白色矩形最后使用 Tesseract 进行 OCR 来获取文本(PISF - 28 - 1469 - 3)。

\n\n

但是使用 tesseract 提取文本是可以的,我知道如何做到这一点。我只需要获取保存文本的白色矩形或保存文本的最小区域,并将其保存为更好的形式,以便稍后将其与 Tesseract (OCR) 一起使用。

\n\n

我会批量使用该脚本,因为我没有这个图像。其他图像可以具有不同的尺寸。

\n\n

有人可以帮助我吗?

\n\n

我将不胜感激任何帮助。

\n\n

我的形象是这样的:

\n\n

在此输入图像描述

\n

fmw*_*w42 6

这是在 Python/OpenCV 中执行此操作的一种方法

  • 读取输入
  • 转换为灰度
  • 临界点
  • 使用形态学去除小的白色或黑色区域并用白色封闭文本
  • 获取最大的垂直矩形的轮廓
  • 从该轮廓的边界框中提取文本
  • 保存结果


输入:

在此输入图像描述

import cv2
import numpy as np

# load image
img = cv2.imread("rock.jpg")

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold image
thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)[1]

# apply morphology to clean up small white or black regions
kernel = np.ones((5,5), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_OPEN, kernel)

# thin region to remove excess black border
kernel = np.ones((3,3), np.uint8)
morph = cv2.morphologyEx(morph, cv2.MORPH_ERODE, kernel)

# find contours
cntrs = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]

# Contour filtering -- keep largest, vertically oriented object (h/w > 1)
area_thresh = 0
for c in cntrs:
    area = cv2.contourArea(c)
    x,y,w,h = cv2.boundingRect(c)
    aspect = h / w
    if area > area_thresh and aspect > 1:
        big_contour = c
        area_thresh = area

# extract region of text contour from image
x,y,w,h = cv2.boundingRect(big_contour)
text = img[y:y+h, x:x+w]

# extract region from thresholded image
binary_text = thresh[y:y+h, x:x+w]  

# write result to disk
cv2.imwrite("rock_thresh.jpg", thresh)
cv2.imwrite("rock_morph.jpg", morph)
cv2.imwrite("rock_text.jpg", text)
cv2.imwrite("rock_binary_text.jpg", binary_text)

cv2.imshow("THRESH", thresh)
cv2.imshow("MORPH", morph)
cv2.imshow("TEXT", text)
cv2.imshow("BINARY TEXT", binary_text)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)


阈值图像:

在此输入图像描述

形态学清洗后的图像:

在此输入图像描述

提取的文本区域图像:

在此输入图像描述

提取的二进制文本区域图像:

在此输入图像描述