车牌定位(三)

写在前面的话: 提前声明一下,本文都是个人的一些学习过程和经验,肯定是有不当与不完善之处,欢迎指正,但不喜勿喷。这节直接利用 垂直投影法 进行 字符串分割,目前没有那么多精力去实现hough变换车牌矫正等精细操作,而且本人也能力有限,先慢慢积攒经验。

字符串分割

显示灰度图片

对灰度图片的信息进行处理

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

imL = Image.open('./car.png')
imL_arr = np.array(imL)
h, w = imL_arr.shape
print(imL_arr.shape)

(25, 90)

看一眼大小,不过显示图片更为直接嘛

plt.imshow(imL)

统计像素点

写个函数,按列遍历,统计出每一列的像素点个数

def get_all_mess(im_arr,width,height):
    tmp = np.zeros((width))
    # 按列进行遍历,即统计w
    for i in range(width):
        for j in range(height):
            if(im_arr[j, i] == 0):
                tmp[i] += 1
    return tmp

matrix = get_all_mess(imL_arr, w, h)
matrix

来看一下结果

array([ 3., 1., 9., 16., 14., 8., 9., 19., 19., 9., 5., 1., 1.,
3., 19., 19., 13., 9., 9., 14., 18., 20., 17., 10., 2., 1.,
3., 3., 1., 2., 2., 8., 11., 15., 14., 12., 12., 13., 14.,
11., 7., 1., 1., 2., 3., 3., 7., 11., 14., 15., 10., 8.,
5., 1., 3., 4., 8., 11., 12., 11., 10., 13., 14., 11., 7.,
2., 2., 4., 7., 7., 13., 16., 17., 14., 10., 8., 5., 2.,
9., 17., 19., 13., 10., 9., 10., 10., 11., 10., 10., 15.])

发现什么也看不出来,那就转换为图呗!

plt.plot(range(w), matrix)
这样就直观多了嘛,那么我们可以看到有很多个波峰和波谷,就是对应的白色和黑色相间的差异,我们设个阈值,分开就好了

划分

def vertical(threads, s):
    '''
    s: 存储像素个数的列表
    threads: 阈值,根据图像获得
    '''
    for i in range(len(s)):
        if s[i]>threads:
            s[i] = 20
        else:
            s[i] = 0
    return s

mess = vertical(2.5, matrix)
plt.plot(range(w), mess)
这样是不是更好提取了?接下来就是分割啦

分割

这部分代码也是经过好多次调试,而且可能会出现漏掉或多出的现象,这是我到目前为止改的最后一个版本。基本原理就是前一个值是最小值,后一个值是最大值,则为转折点,记录下来就行了,看图像发现最后有一段都是最大值,那么也得提取出来。

先解释一下: 排序的原因是为之后显示分割出来的图片是按顺序来的

def get_cared(s):
    cared = []
    x_li = []
    x = y = 0
    for i in range(len(s)-1):
        if (s[i] == 20)and(s[i-1]==0):
            x = i
            x_li.append(x)
        if (s[i] == 20)and(s[i+1]==0):
            y = i
        if(x and x<y):
            cared.append((x,y))
    cared.append((x_li[-1],len(s)-1))
    return cared
c = sorted(c, key=lambda x:x[0])

这部分代码我还得完善,因为情况太多,不一定能适应所有的灰度图,后续会更…

显示图片

先显示原图做个对比

rgb = Image.open('./ca.png')
rgb_arr = np.array(rgb)

plt.imshow(rgb)
接下来就是分割后的图像
fig, ax = plt.subplots(figsize=(8,4),ncols=len(c), nrows=1)
n = 0
for i in c:
    box = (i[0], 0, i[1] , h)
    region = rgb.crop(box)
    ax[n].imshow(region)
    n += 1
#     region.save('./' + str(i) + '.png')
如果想保存的话就加上最后一句就ok了。

接下来就是对所有的图片进行遍历操作并检验了…我尽量搞个混淆矩阵出来

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值