使用OpenCV Python和Tesseract从图像中读取车牌号

4
我有一个问题,因为我的照片有单独的注册。现在我想从照片中获取注册号码。不幸的是,我编写的代码效率非常低,我希望能够获得更高的效率。有什么提示吗?
第一阶段,照片像这样:
然后将照片转换为灰色,并只保留黑色对比度。
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# define range of black color in HSV
lower_val = np.array([0,0,0])
upper_val = np.array([179,100,130])

# Threshold the HSV image to get only black colors
mask = cv2.inRange(hsv, lower_val, upper_val)

接收

图片描述

我能添加或做些什么来提高程序的效果。程序是否有一种方法可以稍微恢复注册? 这样做会有所帮助吗?

configr = ('-l eng --oem 1 --psm 6-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

text = pytesseract.image_to_string(mask,lang='eng', config=configr)

print(text)
1个回答

6
这里有一种方法:
  1. 颜色阈值提取黑色文本。我们加载图像,将其转换为HSV颜色空间,定义下限和上限颜色范围,并使用 cv2.inRange() 进行颜色阈值处理并获取二进制掩模。

  2. 执行形态学操作。创建一个核并执行形态闭合以填充轮廓中的孔。

  3. 过滤车牌轮廓。查找轮廓并使用边框矩形面积进行过滤。如果一个轮廓通过此过滤器,我们会提取ROI并将其粘贴到新的空白掩模中。

  4. 使用 Pytesseract 进行OCR。我们反转图像以使目标文本为黑色,然后输入到Pytesseract中。


下面是每个步骤的可视化:

从颜色阈值和形态闭合中获得的掩模

enter image description here

高亮显示车牌轮廓的过滤结果

enter image description here

将车牌轮廓粘贴到空白掩模上

enter image description here

准备用于Tesseract的反转图像

enter image description here

Tesseract OCR的结果

PZ 689LR

代码

import numpy as np
import pytesseract
import cv2

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, create blank mask, convert to HSV, define thresholds, color threshold
image = cv2.imread('1.png')
result = np.zeros(image.shape, dtype=np.uint8)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0,0,0])
upper = np.array([179,100,130])
mask = cv2.inRange(hsv, lower, upper)

# Perform morph close and merge for 3-channel ROI extraction
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=1)
extract = cv2.merge([close,close,close])

# Find contours, filter using contour area, and extract using Numpy slicing
cnts = cv2.findContours(close, cv2.RETR_TREE, 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 = w * h
    if area < 5000 and area > 2500:
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)
        result[y:y+h, x:x+w] = extract[y:y+h, x:x+w] 

# Invert image and throw into Pytesseract
invert = 255 - result
data = pytesseract.image_to_string(invert, lang='eng',config='--psm 6')
print(data)

cv2.imshow('image', image)
cv2.imshow('close', close)
cv2.imshow('result', result)
cv2.imshow('invert', invert)
cv2.waitKey()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接