这是一种方法:
颜色阈值提取黑色文本。我们加载图像,转换为HSV颜色空间,定义上下颜色范围,并使用cv2.inRange()进行颜色阈值并获得二进制面具
执行形态学运算。 创建一个内核并执行变形接近以填充轮廓中的孔。
过滤车牌轮廓。查找轮廓并使用边界矩形区域进行过滤。如果轮廓通过此过滤器,我们将提取 ROI 并将其粘贴到新的空白蒙版上。
使用 Pytesseract 进行 OCR。我们反转图像,使所需的文本为黑色,然后将其放入 Pytesseract。
这是每个步骤的可视化:
通过颜色阈值 + 变形关闭获得蒙版
过滤以绿色突出显示的车牌轮廓
将板轮廓粘贴到空白蒙版上
为 Tesseract 准备的倒置图像
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()