写在前面的话: 提前声明一下,本文都是个人的一些学习过程和经验,肯定是有不当与不完善之处,欢迎指正,但不喜勿喷。这节直接利用 垂直投影法 进行 字符串分割,目前没有那么多精力去实现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')
接下来就是对所有的图片进行遍历操作并检验了…我尽量搞个混淆矩阵出来