如何使用OpenCV获取图像中所有文本的位置?

我有一张包含文本(数字和字母)的图像。我想获取图像中所有文本和数字的位置,并且还想提取所有的文本内容。

enter image description here

如何获取图像中所有文本(数字和字母)的坐标以及文本内容?例如10B、44、16、38、22B等


回答:

这里是一种可能的方法,使用形态学操作来过滤掉非文本轮廓。思路是这样的:

  1. 获取二值图像。 加载图像转换为灰度,然后进行Otsu阈值处理

  2. 移除水平和垂直线条。 使用水平和垂直核通过cv2.getStructuringElement()创建,然后使用cv2.drawContours()移除线条

  3. 移除对角线、圆形物体和曲线轮廓。 使用轮廓面积cv2.contourArea()和轮廓近似cv2.approxPolyDP()过滤以隔离非文本轮廓

  4. 提取文本ROI并进行OCR识别。 查找轮廓并过滤ROI,然后使用Pytesseract进行OCR识别。


移除的水平线以绿色高亮显示

enter image description here

移除的垂直线

enter image description here

移除的各种非文本轮廓(对角线、圆形物体和曲线)

enter image description here

检测到的文本区域

enter image description here

import cv2import numpy as npimport pytesseractpytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"# Load image, grayscale, Otsu's thresholdimage = cv2.imread('1.jpg')gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]clean = thresh.copy()# Remove horizontal lineshorizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))detect_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]for c in cnts:    cv2.drawContours(clean, [c], -1, 0, 3)# Remove vertical linesvertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,30))detect_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]for c in cnts:    cv2.drawContours(clean, [c], -1, 0, 3)cnts = cv2.findContours(clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]for c in cnts:    # Remove diagonal lines    area = cv2.contourArea(c)    if area < 100:        cv2.drawContours(clean, [c], -1, 0, 3)    # Remove circle objects    elif area > 1000:        cv2.drawContours(clean, [c], -1, 0, -1)    # Remove curve stuff    peri = cv2.arcLength(c, True)    approx = cv2.approxPolyDP(c, 0.02 * peri, True)    x,y,w,h = cv2.boundingRect(c)    if len(approx) == 4:        cv2.rectangle(clean, (x, y), (x + w, y + h), 0, -1)open_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))opening = cv2.morphologyEx(clean, cv2.MORPH_OPEN, open_kernel, iterations=2)close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,2))close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, close_kernel, iterations=4)cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]for c in cnts:    x,y,w,h = cv2.boundingRect(c)    area = cv2.contourArea(c)    if area > 500:        ROI = image[y:y+h, x:x+w]        ROI = cv2.GaussianBlur(ROI, (3,3), 0)        data = pytesseract.image_to_string(ROI, lang='eng',config='--psm 6')        if data.isalnum():            cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)            print(data)cv2.imwrite('image.png', image)cv2.imwrite('clean.png', clean)cv2.imwrite('close.png', close)cv2.imwrite('opening.png', opening)cv2.waitKey()

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注