python - 使用 Python OpenCV 从车牌图像中提取数字和字母
问题描述
我想检测然后从这张图片中提取字母和数字。我刚刚开始学习 OpenCV,我认为这可以用那个 lib 来完成。您有我使用的图像和下面的所需输出。这是我拥有的代码:
import cv2
# read original image
img = cv2.imread('image.jpg')
cv2.imshow('original', img)
cv2.waitKey(0)
# convert it to gray and apply filter
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale
gray = cv2.bilateralFilter(gray, 11, 17, 17)
cv2.imshow('gray', gray)
cv2.waitKey(0)
#apply treshold
thresh = cv2.threshold(gray, 10, 255, cv2.THRESH_OTSU)[1]
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
这是图像:
我的目标是获取每个字母和数字的分离图像(我在绘画中这样做):
那么,我该怎么做才能得到这个?保持相同的字母和数字顺序是完美的,例如:
MXF51051
解决方案
这是一种使用简单阈值 + 轮廓过滤的方法
- 将图像转换为灰度和 Otsu 的阈值
- 使用轮廓区域查找轮廓和过滤
- 提取并保存 ROI
我们首先转换为灰度,然后转换为 Otsu 阈值以获得二值图像
接下来我们使用 找到轮廓cv2.findContours()
。为了保持字母/数字的相同顺序,我们使用imutils.contours.sort_contours()
withleft-to-right
参数来确保当我们遍历轮廓时,每个轮廓都以正确的顺序排列。对于每个轮廓,我们使用最小和最大区域阈值进行过滤,以确保我们只保留带有所需文本的轮廓。获得过滤后的 ROI 后,我们使用 Numpy 切片提取/保存 ROI。这是过滤后的蒙版,仅包含所需的文本
检测到的数字和字母
以正确顺序提取的 ROI
import cv2
import numpy as np
from imutils import contours
image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
(cnts, _) = contours.sort_contours(cnts, method="left-to-right")
ROI_number = 0
for c in cnts:
area = cv2.contourArea(c)
if area < 800 and area > 200:
x,y,w,h = cv2.boundingRect(c)
ROI = 255 - thresh[y:y+h, x:x+w]
cv2.drawContours(mask, [c], -1, (255,255,255), -1)
cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
ROI_number += 1
cv2.imshow('mask', mask)
cv2.imshow('thresh', thresh)
cv2.waitKey()
推荐阅读
- ubuntu - helm init - 执行访问令牌命令时出错
- laravel - 如何显示我喜欢它 laravel 格式 created_at 时间戳
- java - Hazelcast Hibernate 枚举序列化/反序列化异常
- wpf - NotifyCollectionChangedAction.Reset 和 VirtualizationStackPanel 容器重建
- three.js - 在 three.js 中创建一个金色外观对象
- javascript - 有没有办法在一行中从数组值设置对象键
- java - 如何读取 jar 内的资源
- python - 如何使用 POST 请求 Django 更改布尔值
- javascript - HTML 按钮,在单击按钮时切换并切换所有其他按钮(折叠信息)
- javascript - Spring:从客户端发送时请求正文丢失错误但与邮递员一起使用?