车牌定位


图片文件由于百度网盘无法上传了,所以留言发邮件吧

写在前面的话: 这个学期有个课程是数字图像处理,老师给出了VC++的框架,剩下的也都是由自己去编写,由于C++程序繁琐,即使写完了,但框架中也有好多部分不懂,所以想着用python去实现,还是自己写出来的东西熟悉。实现了从图像中提取出 蓝色 车牌,并分割其字符串。不足之处也会在后续中说出。

如果有什么不对的地方欢迎指正,目前也是新手一个,不喜勿喷,仅是为了学习。

打开图片

使用PIL库对图片进行处理,先导入常用的库

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import os
%matplotlib inline

path = 'G:/photo/bmp_image/1.bmp'
im = Image.open(path)
im_L = im.convert('L')

我们可以看一下效果图

plt.figure(figsize=(10,8))
plt.subplot(121)
plt.imshow(im)
plt.subplot(122)
plt.imshow(im_L)

在这里插入图片描述

分离车牌

1. 获取rgb

自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图像中分离出来。供字符分割使用。

相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。因此我们将图像由RGB转为HSV。

获得原图像的r, g, b参数, 同时保存图像的大小

def get_rgb(im):
    pix = im.load()
    width = im.size[0]
    height = im.size[1]

    rgb_list = []
    for x in range(width):
        for y in range(height):
            r, g, b = pix[x, y]
            rgb_list.append((r,g,b))
    return rgb_list, width, height

2. 转换为h, s, v

此转hsv代码转载于http://outofmemory.cn/code-snippet/1002/Python-RGB-HSV-color-together-switch
这部分转换代码与VC++就不太一样,我也很郁闷
同时,附上原理如https://blog.csdn.net/revitalise/article/details/79341419

def rgb2hsv(r, g, b):
    r, g, b = r/255.0, g/255.0, b/255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    df = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        h = (60 * ((g-b)/df) + 360) % 360
    elif mx == g:
        h = (60 * ((b-r)/df) + 120) % 360
    elif mx == b:
        h = (60 * ((r-g)/df) + 240) % 360
    if mx == 0:
        s = 0
    else:
        s = df/mx
    v = mx
    return h, s, v

处理图片信息当然是要用数据去处理,即将图片转换为数组进行处理

im_array = np.array(im)
im_L_array = np.array(im_L)

# 获得rgb列表及图像的长和宽
im_rgb, width, height = get_rgb(im)
im_rgb = np.array(im_rgb).reshape(300,400,3)

3. 二值化处理

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。即将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

蓝色和其临近色的饱和度H处在一个有限的范围内,选定范围赋值为255,其余的为0,这样就将车牌区域显示了出来。

hsv_list = []
for i in range(height):
    for j in range(width):
        h1,s1,v1 = rgb2hsv(im_rgb[i,j,0], im_rgb[i,j,1], im_rgb[i,j,2])
        hsv_list.append((h1,s1,v1))
        
print(len(hsv_list))
hsv_list = np.array(hsv_list).reshape(300,400,3)

for i in range(height):
    for j in range(width):
        if(hsv_list[i,j,0]<230 and hsv_list[i,j,0]>180 and hsv_list[i,j,1]>0.6 and hsv_list[i,j,2]<250):
            im_L_array[i,j] = 255
        else:
            im_L_array[i,j]  = 0

4. 再转化为图像保存

由于reshape后矩阵发生变化,所以需要进行转置,才能显示出正确的车牌

im_L_array = im_L_array.reshape(400,300)
im_L_array = im_L_array.T
huiimg = Image.fromarray(im_L_array)
# huiimg.save('./huiimg.png')

在这里插入图片描述

接下来就对处理过的图片进行后续操作

参考链接

[1] https://blog.csdn.net/zwf888/article/details/81290911

猜你喜欢

转载自blog.csdn.net/q18421896/article/details/85340006