您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
regionprops_regionprops
车牌,图像,字符regionprops_regionprops
发布时间:2020-12-06加入收藏来源:互联网点击:
很多朋友想了解关于regionprops的一些资料信息,下面是小编整理的与regionprops相关的内容分享给大家,一起来看看吧。
在本教程中,我将带你使用Python来开发一个利用机器学习技术的车牌识别系统(License Plate Recognition)。
我们要做什么?车牌识别系统使用光学字符识别(OCR)技术来读取车牌上的字符。 换句话说,车牌识别系统以车辆图像作为输入并输出车牌中的字符。 如果你是一个卧底或侦探,就能想象这会对你的工作有多宝贵了: 你可以利用车辆拍照来提取一辆汽车的几乎所有必要信息。
机器学习和车牌识别有什么关系?实际上,开发车牌识别系统不一定要使用机器学习技术。 例如,你也可以使用模板匹配、特征提取等非机器学习专有的技术。 但是,机器学习使我们可以通过训练来提高识别系统的准确。 我们将使用机器学习来进行字符识别,即将字符的图像映射到其实际字符,例如A、B等。
这个教程适合我吗?如果你想用电影里摩根middot;弗里曼的声音来构建你自己的JARVIS,那就适合你。 好的,这太夸张了。 实际上,这个教程只是向你展示如何将图像处理和机器学习应用于解决现实生活中的问题。 你将会了解到Python、图像处理、机器学习的一些概念。 我会尽可能地解释这些概念,你也可以进一步研究以更好地理解它们。如果想立刻就练习,我推荐你使用汇智网的[Python机器学习在线运行环境](http://www.hubwiz.com/python-ml.html?affid=vat)。
现在开始吧LPR有时也被称为自动车牌识别(ALPR),主要包括三个处理阶段:
牌照检测:这是第一个、可能也是最重要的阶段。 这个阶段的任务是确定车牌的位置,输入是车辆图像,输出是车牌区域的图像。
字符分割:这个阶段的任务是将车牌区域图像上的字符分割成单独的图像。
字符识别:这个阶段的任务是将之前分割的字符图像识别为具体的字符。 在这个阶段我们将使用机器学习。
理论够多了,现在可以开始编码了吗?当然,让我们先准备下工作环境。 首先需要创建一个虚拟工作环境。 这可以简化项目依赖和包的管理。 你可以使用virtualenv包创建一个虚拟环境:
# install virtualenv if you don't have the package alreadypip install virtualenvmkdir license-plate-recognitioncd license-plate-recognitionvirtualenv lprsource lpr/bin/activate现在,在你的项目目录下,应该有一个名为lpr的文件夹了。
然后我们来安装第一个软件包scikit-image 。 这是一个用于图像处理的Python包。 要安装它,只需运行如下命令:
pip install scikit-image这个软件包的关键依赖项包括:scipy (科学计算), numpy (多维数组操作)和matplotlib (绘制图形和显示图像)。 另一个重要的软件包是Pillow, 一个python图像库。
车牌检测(牌照定位)这是第一阶段,目标是确定车辆图像中的车牌位置。 为了做到这一点,首先需要读取图像文件并将其转换为灰度图像。 在灰度图像中,每个像素的值都在0和255之间。然后,我们需要将其转换为二值图像,即像素值要么黑要么白,只有两种可能的值。
运行下面的代码,将显示两个图像:一个灰度、一个黑白:
from skimage.io import imreadfrom skimage.filters import threshold_otsuimport matplotlib.pyplot as pltcar_image = imread("car.jpg", as_grey=True)# it should be a 2 dimensional arrayprint(car_image.shape)# the next line is not compulsory however, a grey scale pixel# in skimage ranges between 0 1. multiplying it with 255# will make it range between 0 255 (something we can relate better withgray_car_image = car_image * 255fig, (ax1, ax2) = plt.subplots(1, 2)ax1.imshow(gray_car_image, cmap="gray")threshold_value = threshold_otsu(gray_car_image)binary_car_image = gray_car_image threshold_valueax2.imshow(binary_car_image, cmap="gray")plt.show()运行结果:
我们使用连通分量分析 (Connected Component Analysis)算法来识别图像中的所有连通区域。 你也可以尝试其他方法如边缘检测和形态学处理。 CCA帮助我们对前景中的连通区域进行分组和标注。 如果两个像素具有相同的值并且彼此相邻,则认为它们是连通的:
from skimage import measurefrom skimage.measure import regionpropsimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport localization# this gets all the connected regions and groups them togetherlabel_image = measure.label(localization.binary_car_image)fig, (ax1) = plt.subplots(1)ax1.imshow(localization.gray_car_image, cmap="gray");# regionprops creates a list of properties of all the labelled regionsfor region in regionprops(label_image): if region.area 50: #if the region is so small then it's likely not a license plate continue # the bounding box coordinates minRow, minCol, maxRow, maxCol = region.bbox rectBorder = patches.Rectangle((minCol, minRow), maxCol-minCol, maxRow-minRow, edgecolor="red", linewidth=2, fill=False) ax1.add_patch(rectBorder) # let's draw a red rectangle over those regionsplt.show()我们需要导入之前的文件,以便访问其中的值。 measure.label方法用于映射并标注二值图像中所有的连通区域。 在标注好的图像上调用regionprops方法将返回所有连通区域(及其属,如面积、边界框、标签等)的列表。我们使用patches.Rectangle方法在所有被映射的区域上绘制矩形。
从结果图像中,我们可以看到有一些不包含车牌的连通区域也被圈出来了。 为了消除这些区域,我们需要使用车牌的一些典型特征来进行过滤:
车牌是矩形的。
车牌的宽度大于高度。
车牌区域的宽度与整个图像的比例在15%和40%之间。
车牌区域的高度与整个图像的比例在8%和20%之间。
如果这些特征与你要处理的车牌不匹配,那你就调整这些特征,不要犹豫,不要手软!
代码如下:
from skimage import measurefrom skimage.measure import regionpropsimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport localization# this gets all the connected regions and groups them togetherlabel_image = measure.label(localization.binary_car_image)# getting the maximum width, height and minimum width and height that a license plate can beplate_dimensions = (0.08*label_image.shape[0], 0.2*label_image.shape[0], 0.15*label_image.shape[1], 0.4*label_image.shape[1])min_height, max_height, min_width, max_width = plate_dimensionsplate_objects_cordinates = []plate_like_objects = []fig, (ax1) = plt.subplots(1)ax1.imshow(localization.gray_car_image, cmap="gray");# regionprops creates a list of properties of all the labelled regionsfor region in regionprops(label_image): if region.area 50: #if the region is so small then it's likely not a license plate continue # the bounding box coordinates min_row, min_col, max_row, max_col = region.bbox region_height = max_row - min_row region_width = max_col - min_col # ensuring that the region identified satisfies the condition of a typical license plate if region_height = min_height and region_height = max_height and region_width = min_width and region_width = max_width and region_width region_height: plate_like_objects.append(localization.binary_car_image[min_row:max_row, min_col:max_col]) plate_objects_cordinates.append((min_row, min_col, max_row, max_col)) rectBorder = patches.Rectangle((min_col, min_row), max_col-min_col, max_row-min_row, edgecolor="red", linewidth=2, fill=False) ax1.add_patch(rectBorder) # let's draw a red rectangle over those regionsplt.show()上一篇:(组词檐)-组词鸯
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |