Rakkos
Rakkos

Reputation: 43

Reading license plate from image using OpenCV Python and Tesseract

I have a problem because I have separate registrations for photos. Now I would like to get the registration number from the photo. Unfortunately, the effectiveness of the code I wrote is very low and I would like to ask for help in achieving greater efficiency. any tips?

In the first phase, the photo looks like this

enter image description here

Then transform the photo to gray and only the black color contrasts

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)

receives

enter image description here

What can I add or do to improve the effectiveness of the program. is there a way for the program to retrieve registrations a bit? Will this help

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

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

print(text)

Upvotes: 4

Views: 3080

Answers (1)

nathancy
nathancy

Reputation: 46700

Here's an approach:

  1. Color threshold to extract black text. We load the image, convert to HSV colorspace, define a lower and upper color range, and use cv2.inRange() to color threshold and obtain a binary mask

  2. Perform morphological operations. Create a kernel and perform morph close to fill holes in the contours.

  3. Filter license plate contours. Find contours and filter using bounding rectangle area. If a contour passes this filter, we extract the ROI and paste it onto a new blank mask.

  4. OCR using Pytesseract. We invert the image so desired text is black and throw it into Pytesseract.


Here's a visualization of each step:

Obtained mask from color thresholding + morph closing

enter image description here

Filter for license plate contours highlighted in green

enter image description here

Pasted plate contours onto a blank mask

enter image description here

Inverted image ready for Tesseract

enter image description here

Result from Tesseract OCR

PZ 689LR

Code

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()

Upvotes: 7

Related Questions