车牌识别算法流程
1、分类器(adboost方法)得到含有车牌的rect(或传统的找轮廓方法)
2、颜色阈值,筛选出正确的车牌区域
3、直方图统计,精确定位字符区域
4、字符分割
5、字符识别
本文记录基于直方图像素统计进行芯片字符分割和车牌字符分割,两种场景不同但方法相似。
☞ 芯片字符区域的提取
0 ——mask0 ,基于颜色阈值法+找轮廓实现;
mask0——mask1,全局矩阵腐蚀算法,定义一个合适大小的矩阵,遍历扫描,扫描到矩阵平均像素值小于一定值,就全部赋值0。
mask1——mask2,边界腐蚀算法,定义一个偏大的矩阵,只扫描四个边界,如果满足平均像素值大于一定值,则赋值0,然后内层扫描都同上一次操作,完成该层后该边界扫描完成。(代码在后面贴出)
mask2——result ,通过边界扫描,确定roi范围。
下面贴出两个腐蚀算法的实现:
#全局腐蚀算法,可优化为边界腐蚀
@jit
def scan_rect(img,w,h,thred):
deal_img = img.copy()
#print(deal_img.shape)
for x in range(0,deal_img.shape[1]-w):
for y in range(0,deal_img.shape[0]-h):
#sum_pixels = np.sum(deal_img[x:x+w,y:y+h])
my_mean = np.mean(deal_img[y:(y+h),x:(x+w)])
# print(deal_img[y,x],my_mean)
if my_mean < thred:
img[y:(y+h),x:(x+w)] = np.zeros(deal_img[y:(y+h),x:(x+w)].shape).copy()
return img
#边界腐蚀算法,返回腐蚀好的矩形原图(芯片区域是白色)
#矩阵扫描(大一点)
@jit
def erode_rect(rect,binary,w,thred):
h = w
flag_jump = 0
deal_i