首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用OpenCV检测文本

如何使用OpenCV检测文本
EN

Stack Overflow用户
提问于 2020-03-28 20:14:01
回答 1查看 8.2K关注 0票数 2

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

我正在学习OpenCV,但我只在Python中发现Java中的内容不多。我想用Java实现这一点。但是,如果您知道如何在Python中这样做,C++就可以了。我只需要算法就知道了。

我的计划是旋转图像90°,使其成为二值图像(阈值),检测感兴趣区域( ROI ),在这种情况下,文本或形状矩形,裁剪保存文本的白色矩形,最后使用OCR和Tesseract获得文本(PISF-28-1469-3)。

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

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

有人能帮我吗?

我会接受任何帮助。

我的形象是:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 21:16:28

下面是在Python/OpenCV中这样做的一种方法

grayscale

  • Threshold

  • Use

  • 读取输入

  • ,将其转换为形态学,以去除小的白色或黑色区域,并用白色
  • 关闭文本,得到最大的垂直方向矩形的contour
  • Extract,即从轮廓
  • 保存结果

F 215的边框中提取的文本

输入:

代码语言:javascript
运行
复制
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()

缩影图像:

形态学清洁图像:

提取文本区域图像:

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60906448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档