话不多说,先上效果图:

把车牌的每一个字母和数字都完美的分开,并保存在想保存的区域。车牌区域的划分详见我的另一个博客: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 oslower_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)
# cv2.imshow("mark", mark)# 腐蚀和膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(4,5))         #定义矩形结构元素img_erode = cv2.erode(mark, kernel, iterations=1)
img_dilated = cv2.dilate(mark, kernel, iterations=3)
# cv2.imshow('erode', img_dilated)contours, hierarchy = cv2.findContours(img_dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i in range(len(contours)):area = cv2.contourArea(contours[i])if area > 4000:rect = cv2.minAreaRect(contours[i]) #提取矩形坐标box = cv2.boxPoints(rect)box = np.int0(box)  angle =abs(abs(rect[2])-45) length = max(rect[1])wideth = min(rect[1])bili = length / (wideth + 0.01)area = rect[1][0] * rect[1][1]if  area > 20000 or angle < 30:continueif bili > 3.3 or bili < 2.5 :continueprint(area)        print(bili)  print(rect[2])  # cv2.drawContours(new_img, [box], 0, (0, 0, 255), 2) if abs(rect[2]) < 45:a = rect[0][0]-0.5*rect[1][0]b = rect[0][0]+0.5*rect[1][0]c = rect[0][1]-0.5*rect[1][1]d = rect[0][1]+0.5*rect[1][1]else:a = rect[0][0]-0.5*rect[1][1]b = rect[0][0]+0.5*rect[1][1]c = rect[0][1]-0.5*rect[1][0]d = rect[0][1]+0.5*rect[1][0]# print(a,b,c,d)license_image = new_img[round(c):round(d), round(a):round(b)] n_license = 3
sp = license_image.shape
weight_license = round(n_license* sp[1])
height_license = round(n_license* sp[0])license_image = cv2.resize(license_image,(weight_license, height_license))license_image_gray = cv2.cvtColor(license_image, cv2.COLOR_BGR2GRAY)ret, license_image_erzhi = cv2.threshold(license_image_gray, 160, 255, cv2.THRESH_BINARY)cv2.imshow('img', license_image_erzhi)img_erode = cv2.erode(license_image_erzhi, kernel, iterations=1)
img_dilated = cv2.dilate(img_erode, kernel, iterations=2)
# cv2.imshow('erode', img_dilated)path = 'd:/Python/license plate/result//'if not os.path.exists(path):os.mkdir(path)location_list = []
contours, hierarchy = cv2.findContours(img_dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
count = 0for i in range(len(contours)):x, y, w, h = cv2.boundingRect(contours[i])# 在img图像画出矩形,(x, y), (x + w, y + h)是矩形坐标,(0, 255, 0)设置通道颜色,2是设置线条粗度area = w* hlength = max(w, h)wideth = min(w, h)bili = length / (wideth + 0.01)if area < 1000 or area > 10000 or bili > 3:continuelocation_list.append((x,y,w,h))count = count + 1print(count)  def takefirst(elem):return elem[0]# 指定第一个元素排序
location_list.sort(key=takefirst)
print(location_list)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)cv2.imshow('result', license_image_erzhi)
cv2.waitKey(0)

通过以上参数的调整基本上就可以提取出车牌了,当然为了识别车牌,你还可以构建相应的神经网络,进行训练识别,但是我能力有限,只能到这了。
这个对斜着的车牌效果不太好,可以通过旋转操作使车牌摆正。旋转的部分可以自己构造

车牌区域的划分详见我的另一个博客:python-opencv图像处理之基于HSV、面积、角度的车牌定位里面讲的比较详细。

python-opencv图像处理之车牌识别+区域划分+车牌提取+保存图片(2)相关推荐

  1. python识别车辆图片_python-opencv图像处理之车牌识别+区域划分+车牌提取+保存图片(...

    话不多说,先上效果图: 把车牌的每一个字母和数字都完美的分开,并保存在想保存的区域.车牌区域的划分详见我的另一个博客:python-opencv图像处理之基于HSV.面积.角度的车牌定位里面讲的比较详 ...

  2. python+opencv图像处理之边缘检测车道线识别

    python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...

  3. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  4. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  5. python+opencv图像处理之七:直方图均衡化

    python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...

  6. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  7. Python OpenCV图像处理 理论 代码

    python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...

  8. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  9. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  10. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

最新文章

  1. block之--- 基本使用
  2. js 数组修改watch_前端面试:专注Vue.js常见的问题答疑,掌握了基本上Vue就过关了...
  3. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
  4. java后台json传递,后台json传递
  5. edui 富文本编辑_React中使用UEditor百度富文本的方法
  6. 超燃!奇安信首度对外公开内部网络攻防演习纪实片
  7. 性能强悍的开源关系数据库PostgreSQL
  8. Cobbler实现自动化安装操作系统
  9. MySQL 如何利用一条语句实现类似于if-else条件语句的判断
  10. eclipse 查看jar包源代码两种方式
  11. poj2828 Buy Tickets
  12. 不再被日报月报折磨!一键生成报表模板的神器来了
  13. 31 个惊艳的数据可视化作品,让你感受 数据之美!
  14. 译:手把手教你如何写自定义babel代码转换
  15. 海思MPP模块视频缓冲池
  16. 4行代码实现微信送祝福,这个新年有点不一样
  17. Neo4j 图数据库高级应用系列 / 服务器扩展指南 APOC 8.6 - 图生成 小世界模型
  18. windows设置java项目jar包开机自启
  19. 如何更改Code::Blocks背景颜色(懒人版)
  20. leetcode/字符串交织,s1和s2字符串交织组成s3

热门文章

  1. jsoup获取图片并下载
  2. Ribbon界面开发:如何创建Ribbon样式的应用程序框架
  3. javascript语法
  4. 如何有效的阅读开源代码
  5. Excel 2013 基础视频教程上线了
  6. 程序人生之六:写在 2010 年最后一晚,我这两年的工作总结
  7. 12月10日 - 最新一大波迅雷看看白金迅雷钻石·VIP7的会员帐号来袭
  8. 一维卷积神经网络原理,卷积神经网络原理简述
  9. MAC下切换多个IP的Shell脚本
  10. ie tab chrome_将IE Tab集成添加到Google Chrome