




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
公式(4.4.2)4.4.2暗通道处理在恶劣天气车牌图像中会出现由于雾天导致车牌不能被准确识别的情况出现为了应对这种情况我们使用了暗通道处理方式来针对雾天的车牌图像进行去噪。在了解暗通道处理的原理之前,会发现在一些无雾图像中,图像中每一个局部区域都很有可能有至少一个颜色通道会有很低的值或者黑色的东西。由于雾在视觉上是呈现灰白色的,因此一旦图像受到雾的影响,那么这些本来应该表现出正常颜色的东西就会变得灰白。所以车牌图像需要经过暗通道处理来消除雾对原本车牌图像的影响,以免造成车牌无法准确识别的情况出现。4.4.3中值滤波处理在对雨、雪天气车牌图像进行去噪过程中,中值滤波方法能够有效地针对雨、雪天气车牌图像中由于天气原因产生的椒盐噪声进行去噪。中值滤波是非线性的图像处理方法,中值滤波法可以在对图像进行去噪的同时对图像边界的信息进行保留。中值滤波就是选一个含有奇数点的窗口,将这个窗口在图像上进行有顺序的扫描,之后把窗口中所含的像素点按灰度级进行一定顺序排列,取位于排列中间的灰度值来作为该扫描窗口的灰度值。4.5车牌识别算法设计(1)车牌分割算法因为我国车牌的固定方法是通过铆钉将车牌古固定车辆上,且因为车牌定位中的边界噪声和由于恶劣天气产生和的噪声等问题会降低识别的成功率。本次车牌识别算法先将车牌图像针对相应的恶劣天气进行图像去噪,在对车牌进行灰度化处理,之后经过车牌的粗定位和静定位定位到车牌在图像中位置,再进行字符分割和字符识别确定车牌号码。(2)车牌字符分割算法设计在本次恶劣天气下的车牌识别系统中,图像经过了粗定位和精定位确定车牌图像位置之后会进行车牌的方向校正,经方向校正的车牌图像定位后,保证车辆图像是否倾斜,然后二值化和去框架,通过垂直投影的字符分割之后可以输出单个车牌字符,然后字符进行识别的步骤。图4-5显示了车牌字符分割算法流程图。图4-5字符分割流程图4.6Python平台下车牌字符识别算法设计在车牌字符图像的字符提取和识别中,需要对字符图像进行预处理,去除冗余信息和干扰信息。预处理包括切割。图4-6裁剪前的车牌字符图4-7裁剪后的车牌字符在对字符图像进行预处理之后,才可以对处理后的字符图像进行特征提取和识别操作。4.7车牌识别系统的实现4.7.1系统主界面系统进入到系统中,可以选择图片来进行识别。图4-7-1系统主页面4.7.2车牌识别本功能是本系统研究的重点,通过读取相册图片,通过图像处理算法来识别出车牌号,并且可以将车牌去去噪处理,可以识别出雨、雪、雾等恶劣天气的影响下的车牌。车牌粗定位处理功能实现:通过训练找出车牌的大概位置,为车牌精定位做好准备。实现代码:##该函数是初步的框出车牌的大概位置属于粗定位出一个保险的包含车牌的大小defcomputeSafeRegion(shape,bounding_rect):top=bounding_rect[1]#ybottom=bounding_rect[1]+bounding_rect[3]#y+hleft=bounding_rect[0]#xright=bounding_rect[0]+bounding_rect[2]#x+wmin_top=0max_bottom=shape[0]min_left=0max_right=shape[1]#print"computeSateRegioninputshape",shapeiftop<min_top:top=min_top#print"taptop0"ifleft<min_left:left=min_left#print"tapleft0"ifbottom>max_bottom:bottom=max_bottom#print"tapmax_bottommax"ifright>max_right:right=max_right#print"tapmax_rightmax"#print"corr",left,top,right,bottomreturn[left,top,right-left,bottom-top]#框出车牌识别的区域defcropped_from_image(image,rect):x,y,w,h=computeSafeRegion(image.shape,rect)returnimage[y:y+h,x:x+w]#detectPlateRough是返回图像中所有车牌的边框在图片中的bbox返回的是一个表示车牌区域坐标边框的list#返回图片中所有识别出来的车牌边框bboxdefdetectPlateRough(image_gray,resize_h=720,en_scale=1.08,top_bottom_padding_rate=0.05):print(image_gray.shape)#top_bottom_padding_rate:表示要裁剪掉图片的上下部占比iftop_bottom_padding_rate>0.2:print("error:top_bottom_padding_rate>0.2:",top_bottom_padding_rate)exit(1)#resize_h:重新设定的图像大小,此处保持大小不变height=image_gray.shape[0]padding=int(height*top_bottom_padding_rate)scale=image_gray.shape[1]/float(image_gray.shape[0])image=cv2.resize(image_gray,(int(scale*resize_h),resize_h))#裁剪掉top_bottom_padding_rate比例的垂直部分image_color_cropped=image[padding:resize_h-padding,0:image_gray.shape[1]]#裁剪之后的图片进行灰度化处理image_gray=cv2.cvtColor(image_color_cropped,cv2.COLOR_RGB2GRAY)#根据前面的cv2.CascadeClassifier()物体检测模型(3),输入image_gray灰度图像,#边框可识别的最小size,最大size,输出得到车牌在图像中的offset,也就是边框#左上角坐标(x,y)以及边框高度(h)和宽度(w)watches=watch_cascade.detectMultiScale(image_gray,en_scale,2,minSize=(36,9),maxSize=(36*40,9*40))#对得到的车牌边框的bbox进行扩大(此刻得到的车牌可能因为车牌倾斜等原因导致显示不完整),#先对宽度左右各扩大0.14倍,高度上下各扩大0.6倍cropped_images=[]for(x,y,w,h)inwatches:cropped_origin=cropped_from_image(image_color_cropped,(int(x),int(y),int(w),int(h)))x-=w*0.14w+=w*0.28y-=h*0.6h+=h*1.1;#按扩大之后的大小进行裁剪cropped=cropped_from_image(image_color_cropped,(int(x),int(y),int(w),int(h)))cropped_images.append([cropped,[x,y+padding,w,h],cropped_origin])returncropped_images图4-7-2车牌识别识别车牌颜色功能实现:可以识别蓝牌、单层黄牌、绿色-新能源车牌、白色-大使车牌、黑色-港澳车牌。plateType=[u"蓝牌",u"单层黄牌",u"新能源车牌",u"白色",u"黑色-港澳"]defGetmodel_tensorflow(nb_classes):#nb_classes=len(charset)img_rows,img_cols=9,34#numberofconvolutionalfilterstousenb_filters=32#sizeofpoolingareaformaxpoolingnb_pool=2#convolutionkernelsizenb_conv=3#x=np.load('x.npy')#y=np_utils.to_categorical(range(3062)*45*5*2,nb_classes)#weight=((type_class-np.arange(type_class))/type_class+1)**3#weight=dict(zip(range(3063),weight/weight.mean()))#调整权重,高频字优先model=Sequential()model.add(Conv2D(16,(5,5),input_shape=(img_rows,img_cols,3)))model.add(Activation('relu'))model.add(MaxPool2D(pool_size=(nb_pool,nb_pool)))model.add(Flatten())model.add(Dense(64))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(Activation('softmax'))pile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])returnmodel#将图片输入到模型进行测试predict,根据车牌颜色判断类型,#深色背景白色字体返回0,类似浅色背景深色字体的返回大于零的类型model=Getmodel_tensorflow(5)model.load_weights("./model/plate_type.h5")model.save("./model/plate_type.h5")defSimplePredict(image):image=cv2.resize(image,(34,9))#将原来车牌图像resize大小:34*9image=image.astype(np.float)/255#将原来灰度图颜色通道[0,255]转化为float类型[0,1]#将原来灰度图颜色通道[0,255]转化为float类型[0,1]res=np.array(model.predict(np.array([image]))[0])#将原来灰度图颜色通道[0,255]转化为float类型[0,1]returnres.argmax()boundaries=[([100,80,0],[240,220,110]),#yellow([0,40,50],[110,180,250]),#blue([0,60,0],[60,160,70]),#green]color_attr=["黄牌","蓝牌",'绿牌','白牌','黑牌']threhold_green=13threhold_blue=13threhold_yellow1=50threhold_yellow2=70#plt.figure()#plt.axis("off")#plt.imshow(image)#plt.show()#使用枚举类鉴定车牌颜色defjudge_color(color):r=color[0]g=color[1]b=color[2]ifg-r>=threhold_greenandg-b>=threhold_green:return2ifb-r>=threhold_blueandb-g>=threhold_blue:return1ifr-b>threhold_yellow2andg-b>threhold_yellow2:return0ifr>200andb>200andg>200:return3ifr<50andb<50andg<50:return4return-1defjudge_plate_color(img):image=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)image=image.reshape((image.shape[0]*image.shape[1],3))clt=KMeans(n_clusters=2)clt.fit(image)hist=centroid_histogram(clt)index=np.argmax(hist)#printclt.cluster_centers_[index]#color_index=search_boundaries(clt.cluster_centers_[index])color_index=judge_color(clt.cluster_centers_[index])ifcolor_index==-1:ifindex==0:secound_index=1else:secound_index=0color_index=judge_color(clt.cluster_centers_[secound_index])ifcolor_index==-1:printclt.cluster_centers_bar=plot_colors(hist,clt.cluster_centers_)#showourcolorbartplt.figure()plt.axis("off")plt.imshow(bar)plt.show()ifcolor_index!=-1:returncolor_attr[color_index],clt.cluster_centers_[index]else:returnNone,clt.cluster_centers_[index]车牌字符识别的实现:deffastdecode(y_pred):results=""confidence=0.0table_pred=y_pred.reshape(-1,len(chars)+1)res=table_pred.argmax(axis=1)fori,oneinenumerate(res):ifone<len(chars)and(i==0or(one!=res[i-1])):results+=chars[one]confidence+=table_pred[i][one]confidence/=len(results)returnresults,confidence#对于每个车牌区域的for循环中,经过fineMappingVertical处理后输入到recognizeOne函数,进行ocr识别defrecognizeOne(src):#x_tempx=cv2.imread(src)x_tempx=src#x_tempx=cv2.bitwise_not(x_tempx)x_temp=cv2.resize(x_tempx,(160,40))x_temp=x_temp.transpose(1,0,2)t0=time.time()y_pred=pred_model.predict(np.array([x_temp]))y_pred=y_pred[:,2:,:]#plt.imshow(y_pred.reshape(16,66))#plt.show()##cv2.imshow("x_temp",x_tempx)#cv2.waitKey(0)returnfastdecode(y_pred)defctc_lambda_func(args):y_pred,labels,input_length,label_length=argsy_pred=y_pred[:,2:,:]returnK.ctc_batch_cost(labels,y_pred,input_length,label_length)defconstruct_model(model_path):width,height,n_len,n_class=164,48,7,len(chars)+1#输入层为164*48*3的tensor,类别有len(chars)+1个rnn_size=256input_tensor=Input((None,40,3))x=input_tensorbase_conv=32foriinrange(3):#一共做了三次卷积池化x=Conv2D(base_conv*(2**(i)),(3,3),padding="same")(x)#卷积层x=BatchNormalization()(x)#统一量纲防止网络失衡x=Activation('relu')(x)#采用RELU激活函数x=MaxPooling2D(pool_size=(2,2))(x)#池化层x=Conv2D(256,(5,5))(x)#卷积层,图像的的空域卷积x=BatchNormalization()(x)x=Activation('relu')(x))#激活函数是relux=Conv2D(1024,(1,1))(x)x=BatchNormalization()(x)x=Activation('relu')(x)x=Conv2D(len(e2e.chars)+1,(1,1))(x)x=Activation('softmax')(x)base_model=Model(inputs=input_tensor,outputs=x)base_model.load_weights(model_path)returnbase_model寻找车牌左右边界以及垂直边缘检测的实现:#寻找车牌左右边界deffind_edge(image):sum_i=image.sum(axis=0)sum_i=sum_i.astype(np.float)sum_i/=image.shape[0]*255#printsum_istart=0;end=image.shape[1]-1fori,oneinenumerate(sum_i):ifone>0.4:start=i;ifstart-3<0:start=0else:start-=3break;fori,oneinenumerate(sum_i[::-1]):ifone>0.4:end=end-i;ifend+4>image.shape[1]-1:end=image.shape[1]-1else:end+=4breakreturnstart,end#垂直边缘检测defverticalEdgeDetection(image):image_sobel=cv2.Sobel(image.copy(),cv2.CV_8U,1,0)#image=auto_canny(image_sobel)#img_sobel,CV_8U,1,0,3,1,0,BORDER_DEFAULT#canny_image=auto_canny(image)flag,thres=cv2.threshold(image_sobel,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY)print(flag)flag,thres=cv2.threshold(image_sobel,int(flag*0.7),255,cv2.THRESH_BINARY)#thres=simpleThres(image_sobel)kernal=np.ones(shape=(3,15))thres=cv2.morphologyEx(thres,cv2.MORPH_CLOSE,kernal)returnthres#确定粗略的左右边界defhorizontalSegmentation(image):thres=verticalEdgeDetection(image)#thres=thres*imagehead,tail=find_edge(thres)#printhead,tail#cv2.imshow("edge",thres)tail=tail+5iftail>135:tail=135image=image[0:35,head:tail]image=cv2.resize(image,(int(136),int(36)))returnimage第五章系统测试5.1测试的主要内容本次实验使用的是黑盒测试法黑盒测试与白盒测试正好相反,白盒测试就是把系统看作一个可以看到的内部结构的盒子,痛苦哦白盒测试我们先定义系统的运行结构和逻辑,然后通过指令验证系统是否能达到我们相应的预期结果,而黑盒测试就是把该系统看成一个黑色的不能看到内部结构的盒子,默认我们并不知道该系统的实际运行逻辑和组织架构,在所有系统功能都能完整的使用的前提下,验证其功能是否能达到预期和正常运作的需求分析,输入的内容和所输出的内容是否相匹配。系统采用的测试用例如下表,表5-1所示:表5-1系统测试用例表用例编码1描述恶劣天气车牌识别系统预计输出屏幕展现主要测试技术黑盒测试测试结果描述测试结果良好,定位误差值在许可范围内执行步骤检查点检查依据(功能需求编号)期望输出结果选择功能1、选择图片1功能正常正常识别2、车牌识别2功能正常正常5.2测试结果通过以上的系统测试的结果,发现系统的运行结果满足满足设计要求,能够准确识别恶劣天气下的车牌图片并准确输出相应的车牌号。如果车牌能够被准确识别,它将跳转到相应的界面,否则将失败并提示。虽然由于实验的原因无法进一步去修改和优化一些问题,和继续丰富系统的内容,并坚持追求使系统更加完美。但在未来的工作和学习中,我会以此为参照,努力使之后的设计变得更加周全和完美。第六章总结与展望在本次的恶劣天气下的车牌自动识别系统的设计实验中,我知道了本次实验没有我之前所想象的那么简单。能造成这种想法是因为自己对这方面的知识还不够了解。当我真正的了解这方面的知识的时候才意识到原先自己的想法太过简单了。想要达成自己的实验结果并且清楚地介绍项目不是一件很简单的事情。设计这个程序首先要去分析它的用户需求和使用环境,能给社会带来什么好处,之后再去设计一个大体的框架,例如本程序所使用的算法和功能结构,包括每一个结构是怎样运作的,每个结构都有什么功能等等。同时学会了在开发时要做到预先规划好总体的框架并却在编写代码时候要做到命名规范,适当的添加注释,条理清晰且全面,尽量减少模块之间的耦合,功能之间要区分清楚等。当实现这些之后需要测试这些结构是否可以运行,就像参加了一个完完整整的项目一样。在这个过程中我深感自己的能力有待提高和开发一个应用的不容易。去学习一个新的知识并且加以理解和运用带给我了很多不一样的体验,也是我成长了许多。同时在设计的过程中让我学会了如何去查找和使用一些资源和访问相关的数据,并且通过这些数据的实验结果去建立和支持自己的观点。这些都是在本次实验过程中我学到的东西。同时,在查找文献,数据的手机和外文资料翻译时候得到了他人的帮助,如果没有他们的帮助我的程序也许也不会像现在一样一帆风顺,这让我了解到,与其自己去苦心琢磨却很难有进展的时候或许去寻求老师和同学的帮助会让事情变得更有效率,与其闭门造车不如去寻求老师和同学的帮助。在翻译外国文献的时候会发现自己对于一些专业的知识理解不够深刻同时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医用设备运输合同范本
- 叉车临时用工合同范本
- 和店面解约合同范本
- 公寓酒水配送合同范本
- 吊装车租用合同范本
- 供销商品合同范本
- 五星级酒店安保合同范例
- 厨房家电预售合同范本
- 书购货合同范本
- 发电玻璃租赁合同范本
- 2.2 生态脆弱区的综合治理 课件 【知识精研】高二地理人教版(2019)选择性必修2
- 餐厅服务人员话术培训
- 远程医疗创业计划书
- 初中生心理健康教育讲座课件
- 广东省广州市白云区2023-2024学年八年级上学期期末英语试题(答案)
- 洞库安全隐患
- 2024-2025年第一学期小学德育工作总结:点亮德育灯塔引领小学生全面成长的逐梦之旅
- 2024解析:第二章声现象-基础练(解析版)
- 整体法兰强度校核计算表(设计:zxg)
- 《供配电技术》课件第1章
- 建筑垃圾清理及运输方案
评论
0/150
提交评论