python-opencv图像处理之车牌识别图像处理之车牌识别+区域划分区域划分+车牌提取车牌提取+保存图片(保存图片(2))
话不多说,先上效果图:
把车牌的每一个字母和数字都完美的分开,并保存在想保存的区域。车牌区域的划分详见我的另一个博客:python-opencv图像处理之基于HSV、面积、角度的车牌定位里面讲的比
较详细。
在得到我们要的车牌之后,我们要把此区域提取出来,因为照片就是矩阵,所以我们可以通过
license_image = new_img[round( c ):round(d), round(a):round(b)]
的方式提取出车牌,但是要注意rect[2]这个角度,否则的话,有可能提取的是竖着的,不是横着的。
接着进行车牌的放大和二值化,二值化选用的参数要根据车牌识别的情况进行调整,也就是其中的160这个数值,需要按情况调整。
ret, license_image_erzhi = cv2.threshold(license_image_gray, 160, 255,
cv2.THRESH_BINARY)
然后进行腐蚀和膨胀
img_erode = cv2.erode(license_image_erzhi, kernel, iterations=1)
img_dilated = cv2.dilate(img_erode, kernel, iterations=2)
腐蚀和膨胀的次数也要进行调整,一般都不超过4。
接着就是你要保存的路径,os操作
在轮廓提取中,提取出的是车牌数字和字母在二值化图像中的位置信息,构成数组,由起始点的横坐标和纵坐标,以及高和宽构成。
设置count参数记录个数,正常是7个,但也有可能多或者少,可以根据面积参数进行筛选。
location_list.append((x,y,w,h))
用来向数组添加参数
要根据车牌从左往右的顺序提取车牌,所以还要进行排序
def takefirst(elem):
return elem[0] #指定第一个元素排序
location_list.sort(key=takefirst)
排序完成之后就可以进行车牌的再次切割和保存了,并在二值图上标出
for i in range(0, count):
license_image_1 = img_dilated[ location_list[i][1] :location_list[i][1] + location_list[i][3], location_list[i][0] : location_list[i][0]+location_list[i][2]] file_name = 'img' + str(i) + '.jpg'
cv2.imwrite(path + file_name, license_image_1)
cv2.rectangle(license_image_erzhi, (location_list[i][0], location_list[i][1]-10), (location_list[i][0] + location_list[i][2], location_list[i][1] + location_list[i][3]), (255, 255, 255), 4)
接下来给出完整代码:
from cv2 import cv2
import numpy as np
import os
lower_blue = np.array([90,90,0])
upper_blue = np.array([120,210,250])
img = cv2.imread('d:/Python/license plate/chepai/7.jpg')
n = 0.8
sp = img.shape
height = round(n*sp[0])
weight = round(n*sp[1])
new_img = cv2.resize(img,(weight,height))
cv2.imshow('new_img',new_img)
hsv = cv2.cvtColor(new_img, cv2.COLOR_BGR2HSV)
mark = cv2.inRange(hsv, lower_blue, upper_blue)
# mark = cv2.bitwise_not(mark)
评论8
最新资源