python图像识别 车牌_[图像处理] Python+OpenCV实现车牌区域识别
点击上方蓝色字体,关注我们
15
本篇文章主要调用OpenCV库(cv2)进行车牌区域识别,具体步骤包括:
1.灰度转换:将彩色图片转换为灰度图像,常见的R=G=B=像素平均值。
2.高斯平滑和中值滤波:去除噪声。
3.Sobel算子:提取图像边缘轮廓,X方向和Y方向平方和开跟。
4.二值化处理:图像转换为黑白两色,通常像素大于127设置为255,小于设置为0。
5.膨胀和细化:放大图像轮廓,转换为一个个区域,这些区域内包含车牌。
6.通过算法选择合适的车牌位置,通常将较小的区域过滤掉或寻找蓝色底的区域。
7.标注车牌位置,如果是花儿、人脸、牛角,可能需要特征提取和训练。
▽▽▽
一、读取图像及灰度转换#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)
#opencv默认的imread是以BGR的方式进行存储的
#而matplotlib的imshow默认则是以RGB格式展示
#所以此处我们必须对图片的通道进行转换
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)
#显示图形
titles = ['Source Image','Gray Image']
images = [lenna_img, GrayImage]
for i in xrange(2):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
cv2.imshow('Gray.bmp', GrayImage)
cv2.waitKey(0)
输出结果如下图所示:
二、高斯平滑和中值滤波去噪
这里原理推荐我以前C++图像处理的文章,如下:https://blog.csdn.net/column/details/eastmount-mfc.html
完整代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)
#opencv默认的imread是以BGR的方式进行存储的
#而matplotlib的imshow默认则是以RGB格式展示
#所以此处我们必须对图片的通道进行转换
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)
#直方图均衡化
#equ = cv2.equalizeHist(gray)
#高斯平滑
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#Gaussian = cv2.GaussianBlur(GrayImage, (9, 9),0)
#中值滤波
Median = cv2.medianBlur(Gaussian, 5)
#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image']
images = [lenna_img, GrayImage, Gaussian, Median]
for i in xrange(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
输出结果如下图所示,分别是原图、灰度图像、高斯处理和中值滤波处理。
三、Sobel算子提取轮廓和二值化处理
有时还需要加强图像中景物的边缘和轮廓,边缘和轮廓通常位于图像中灰度突出的地方,因而可以直观的想到用灰度的差分对边缘和轮廓进行提取,通常可以通过梯度算子进行提取。图像锐化的目的是提高图像的对比度,从而使图像更清晰,通过提高邻域内像素的灰度差来提高图像的对比度。本文采用Sobel算子提取边缘轮廓。
阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的部分使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。常用的包括产生二值图:当x=T时y=255(其中T是阈值)。阈值变换在生物学上的应用比较广泛,常用语细胞图像分割等。本文采用二值化处理将大于等于170像素的转换为255,而下于的转换为0,使得图像更加清晰。
完整代码如下所示:
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)
#opencv默认的imread是以BGR的方式进行存储的
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)
#直方图均衡化
#equ = cv2.equalizeHist(gray)
# 高斯平滑
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
# 中值滤波
Median = cv2.medianBlur(Gaussian, 5)
# Sobel算子 XY方向求梯度
x = cv2.Sobel(Median, cv2.CV_8U, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(Median, cv2.CV_8U, 0, 1, ksize = 3) #Y方向
absX = cv2.convertScaleAbs(x) # 转回uint8
absY = cv2.convertScaleAbs(y)
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5,0)
cv2.imshow('dilation2', Sobel)
cv2.waitKey(0)
# 二值化处理 周围像素影响
ret, Binary = cv2.threshold(Sobel, 170, 255, cv2.THRESH_BINARY)
cv2.imshow('dilation2',Binary)
cv2.waitKey(0)
#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image',
'Sobel Image', 'Binary Image']
images = [lenna_img, GrayImage, Gaussian, Median, Sobel, Binary]
for i in xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()输出结果如下所示:
四、膨胀和腐蚀处理
接下来进行膨胀和腐蚀处理,其中膨胀让轮廓突出,腐蚀去掉细节。
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)
#opencv默认的imread是以BGR的方式进行存储的
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)
#直方图均衡化
#equ = cv2.equalizeHist(gray)
#高斯平滑 去噪
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#Gaussian = cv2.GaussianBlur(GrayImage, (9, 9),0)
#中值滤波
Median = cv2.medianBlur(Gaussian, 5)
#Sobel算子 XY方向求梯度 cv2.CV_8U
x = cv2.Sobel(Median, cv2.CV_32F, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(Median, cv2.CV_32F, 0, 1, ksize = 3) #Y方向
#absX = cv2.convertScaleAbs(x) # 转回uint8
#absY = cv2.convertScaleAbs(y)
#Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
gradient = cv2.subtract(x, y)
Sobel = cv2.convertScaleAbs(gradient)
cv2.imshow('dilation2', Sobel)
cv2.waitKey(0)
#二值化处理 周围像素影响
blurred = cv2.GaussianBlur(Sobel, (9, 9),0) #再进行高斯去噪
#注意170可以替换的
ret, Binary = cv2.threshold(blurred , 90, 255, cv2.THRESH_BINARY)
cv2.imshow('dilation2', Binary)
cv2.waitKey(0)
#膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))
# 膨胀让轮廓突出
Dilation = cv2.dilate(Binary, element2, iterations = 1)
# 腐蚀去掉细节
Erosion = cv2.erode(Dilation, element1, iterations = 1)
# 再次膨胀
Dilation2 = cv2.dilate(Erosion, element2,iterations = 3)
cv2.imshow('Dilation2 ', Dilation2)
cv2.waitKey(0)
#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image',
'Sobel Image', 'Binary Image', 'Dilation Image', 'Erosion Image', 'Dilation2 Image']
images = [lenna_img, GrayImage, Gaussian,
Median, Sobel, Binary,
Dilation, Erosion, Dilation2]
for i in xrange(9):
plt.subplot(3,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
输出结果如下图所示,可以看到轮廓区域已经被提取出来,接下来开始有选择的进行获取。
五、指定算法选择车牌区域
该部分代码膨胀和腐蚀略有区别,采用closed变量实现。同时获取最理想的区域,完整代码如下所示:
#encoding:utf-8
#BY:Eastmount CSDN 2018-08-06
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
imagePath = '10.jpg'
img = cv2.imread(imagePath)
#opencv默认的imread是以BGR的方式进行存储的
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#灰度图像处理
GrayImage = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(u"读入lenna图的shape为", GrayImage.shape)
#直方图均衡化
#equ = cv2.equalizeHist(gray)
#高斯平滑 去噪
Gaussian = cv2.GaussianBlur(GrayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#Gaussian = cv2.GaussianBlur(GrayImage, (9, 9),0)
#中值滤波
Median = cv2.medianBlur(Gaussian, 5)
#Sobel算子 XY方向求梯度 cv2.CV_8U
x = cv2.Sobel(Median, cv2.CV_32F, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(Median, cv2.CV_32F, 0, 1, ksize = 3) #Y方向
#absX = cv2.convertScaleAbs(x) # 转回uint8
#absY = cv2.convertScaleAbs(y)
#Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
gradient = cv2.subtract(x, y)
Sobel = cv2.convertScaleAbs(gradient)
cv2.imshow('dilation2', Sobel)
cv2.waitKey(0)
#二值化处理 周围像素影响
blurred = cv2.GaussianBlur(Sobel, (9, 9),0) #再进行一次高斯去噪
#注意170可以替换的
ret, Binary = cv2.threshold(blurred , 170, 255, cv2.THRESH_BINARY)
cv2.imshow('dilation2', Binary)
cv2.waitKey(0)
# 膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))
# 膨胀一次,让轮廓突出
Dilation = cv2.dilate(Binary, element2, iterations = 1)
# 腐蚀一次,去掉细节
Erosion = cv2.erode(Dilation, element1, iterations = 1)
# 再次膨胀,让轮廓明显一些
Dilation2 = cv2.dilate(Erosion, element2,iterations = 3)
cv2.imshow('Dilation2 ', Dilation2)
cv2.waitKey(0)
##########################################
#建立一个椭圆核函数
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25))
#执行图像形态学, 细节直接查文档,很简单
closed = cv2.morphologyEx(Binary, cv2.MORPH_CLOSE, kernel)
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
cv2.imshow('erode dilate', closed)
cv2.waitKey(0)
##########################################
#显示图形
titles = ['Source Image','Gray Image', 'Gaussian Image', 'Median Image',
'Sobel Image', 'Binary Image', 'Dilation Image', 'Erosion Image', 'Dilation2 Image']
images = [lenna_img, GrayImage, Gaussian,
Median, Sobel, Binary,
Dilation, Erosion, closed]
for i in xrange(9):
plt.subplot(3,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
cv2.imshow('Gray', GrayImage)
cv2.waitKey(0)
"""
接下来使用Dilation2图片确定车牌的轮廓
这里opencv3返回的是三个参数
参数一:二值化图像
参数二:轮廓类型 检测的轮廓不建立等级关系
参数三:处理近似方法 例如一个矩形轮廓只需4个点来保存轮廓信息
"""
(_, cnts, _) = cv2.findContours(closed.copy(),
cv2.RETR_LIST, #RETR_TREE
cv2.CHAIN_APPROX_SIMPLE)
#画出轮廓
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
print c
#compute the rotated bounding box of the largest contour
rect = cv2.minAreaRect(c)
print 'rectt', rect
Box = np.int0(cv2.boxPoints(rect))
print 'Box', Box
#draw a bounding box arounded the detected barcode and display the image
Final_img = cv2.drawContours(img.copy(), [Box], -1, (0, 0, 255), 3)
cv2.imshow('Final_img', Final_img)
cv2.waitKey(0)
输出结果如下图所示,可以看到车牌被选中了。
END
原文:
https://blog.csdn.net/Eastmount/article/details/81461679
参考:
https://www.jianshu.com/p/fcfbd3131b84
https://blog.csdn.net/sinat_36458870/article/details/78825571
https://blog.csdn.net/sumkee911/article/details/79435983
python图像识别 车牌_[图像处理] Python+OpenCV实现车牌区域识别相关推荐
- python图像识别分类_图像分类python
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我为我的一个班级写了一个图像识别代码. 我正在对"好"和&q ...
- python图像识别马路_使用Python和OpenCV在道路上找到车道线
识别道路上的车道是所有司机的共同任务,以确保车辆在驾驶时处于车道限制之内,并减少因越过车道而与其他车辆发生碰撞的机会. 对自动驾驶汽车来说,这同样也是一项关键任务.事实证明,使用计算机视觉技术识别道路 ...
- python 图像识别游戏_基于Python的浏览器图像识别
我想实现一个软件在21点计算卡,使用一些图像识别自动化的过程.但我不知道从哪里开始. 我认为问题可以分为以下几个步骤: 1-在游戏中从浏览器中获取图像(基本上是一个Adobe Flash游戏) 2-处 ...
- python图像识别代码_用Python进行简单图像识别(验证码)
这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt ...
- python图像识别数字_使用python和tensorflow从Image中识别数字
详细信息:Ubuntu 14.04(LTS),OpenCV 2.4.13,Spyder 2.3.9(Python 2.7),Tensorflow r0.10 我想认识来自 the image使用Pyt ...
- python 图像识别分类_使用Python轻松完成垃圾分类(基于图像识别)
0 环境 Python版本:3.6.8 系统版本:macOS Mojave Python Jupyter Notebook 1 引言 七月了,大家最近一定被一项新的政策给折磨的焦头烂额,那就是垃圾分类 ...
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python图像识别步骤_利用百度智能云结合Python体验图像识别(转载来自qylruirui)
利用百度智能云结合Python体验图像识别 只要注册了百度账号就可以轻松体验百度智能云中图像识别功能的魅力! 1. 所需要的工具 一个百度账号(大家都有哈) 一个可以运行python代码的编译器(Py ...
最新文章
- Ubuntu中Atom安装与使用
- 链表问题11——两个单链表相交的系列问题(四):总结
- 极简易版专家聊天程序--JAVA练手
- 重新开始我的园子生活了
- 安装linux18双系统,Win10 安装Linux ubuntu-18.04双系统(安装指南)
- * IO流递归拷贝一个文件夹 按源文件夹格式拷贝
- linux 下安装maven
- IDEA怎么开启终端Terminal
- 年轻人开始“反算法”
- C#.NET常见问题(FAQ)-如何使用DataGridView跟Excel数据交互
- python下载numpy库_安装numpy库
- 在Redis中设置了过期时间的Key注意事项
- RubyOnRails培训大纲
- 文科生也能学会的Excel VBA 宏编程入门
- 全国每年考证时间安排
- #10064 「一本通 3.1 例 1」黑暗城堡(spfa+乘法原理)
- layui rate (评分组件)使用的一点经验分享
- EASYOPS系列|纠正下很多错误,谈下部署发布的几种思路
- 小程序 订单倒计时系列
- Rasa 3.x 学习系列-Rasa X 社区版(免费版) 更改
热门文章
- 2013计算机专业排名,2013美国本科计算机专业排名
- Keil软件的安装及破解
- 最新spark,hive,flink,kafka,hadoop,zookeeper,flume,java,maven,Apache历史版本大全下载
- gba徽章机器人_3DS徽章机器人8剧情流程攻略(持续更新)
- 生物信息学期刊2023更新版
- 一个基于nao机器人平台的高校迎新智能语音对话机器人
- MySQL基础(一位小白)
- CAPL脚本中的变量陷阱
- windows tomcat无乱码 linux下乱码,解决linux服务器tomcat乱码问题
- 【kthreaddi】记录一次被木马攻击hadoop后如何解决