搭建一个网站的服务器广州营销型网站建设公司
2026/5/21 13:33:21 网站建设 项目流程
搭建一个网站的服务器,广州营销型网站建设公司,关键词检索怎么弄,网站服务器出问题文章目录一、流程概述二、环境配置与参数设置三、命令行参数配置四、银行卡类型定义五、辅助函数定义六、模板图像预处理6.1 模板加载与初步处理6.2 轮廓提取与数字模板建立七、银行卡图像处理流程7.1 图像加载与初步调整7.2 形态学处理突出数字区域7.3 数字区域定位与提取7.4 …文章目录一、流程概述二、环境配置与参数设置三、命令行参数配置四、银行卡类型定义五、辅助函数定义六、模板图像预处理6.1 模板加载与初步处理6.2 轮廓提取与数字模板建立七、银行卡图像处理流程7.1 图像加载与初步调整7.2 形态学处理突出数字区域7.3 数字区域定位与提取7.4 数字组轮廓检测与筛选八、数字识别核心算法8.1 单个数字组处理8.2 模板匹配识别数字8.3 结果可视化九、最终结果输出一、流程概述采用经典的图像处理流程主要分为两个核心阶段模板预处理阶段预先处理标准OCR-A字体模板提取并存储每个数字的特征模板卡号识别阶段对输入的银行卡图像进行多步处理定位卡号区域分割单个数字通过模板匹配实现识别整个系统基于OpenCV库实现。二、环境配置与参数设置importnumpyasnpimportargparseimportcv2importmyutilsfromimutilsimportcontours模块作用分析numpy提供高效的数值计算和数组操作argparsePython内置库用于解析命令行参数cv2OpenCV库核心图像处理功能myutils自定义工具模块包含轮廓排序等辅助函数imutils.contours提供轮廓处理的便捷函数三、命令行参数配置# 设置参数apargparse.ArgumentParser()# 创建ArgumentParser对象用于定义和解析命令行参数ap.add_argument(-i,--image,requiredTrue,helppath to input image)ap.add_argument(-t,--template,requiredTrue,helppath to template OCR-A image)argsvars(ap.parse_args())# 将参数转换为字典格式便于访问# 使用示例# python demo47.py -i card1.png -t kahao.png参数说明-i/--image必需参数指定待识别的银行卡图像路径-t/--template必需参数指定OCR-A模板图像路径四、银行卡类型定义# 根据卡号首位数字判断银行卡类型FIRST_NUMBER{3:American Express,# 美国运通卡4:Visa,# Visa卡5:MasterCard,# 万事达卡6:Discover Card# 发现卡}这个字典基于银行卡号的行业标准首位数字3代表美国运通4代表Visa5代表万事达6代表发现卡。五、辅助函数定义defcv_show(name,img):# 图像显示函数显示图像并等待按键响应cv2.imshow(name,img)cv2.waitKey(0)这是一个简单的图像显示封装函数便于在开发过程中可视化各个处理阶段的结果。六、模板图像预处理6.1 模板加载与初步处理# 读取并显示模板图像imgcv2.imread(args[template])cv_show(img,img)# 转换为灰度图像refcv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show(ref,ref)# 二值化处理黑底白字便于轮廓检测refcv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]cv_show(ref,ref)关键步骤解析灰度转换将彩色图像转换为单通道灰度图减少计算复杂度二值化使用阈值处理将图像转换为纯黑白两色便于轮廓提取THRESH_BINARY_INV反向二值化生成黑底白字效果6.2 轮廓提取与数字模板建立# 检测轮廓只检测外轮廓_,refCnts,hierarchycv2.findContours(ref.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 在原始图像上绘制轮廓红色cv2.drawContours(img,refCnts,-1,(0,0,255),3)cv_show(refCnts,img)# 对轮廓从左到右排序refCntsmyutils.sort_contours(refCnts,methodleft-to-right)[0]digits{}# 存储数字模板的字典# 提取每个数字作为模板for(i,c)inenumerate(refCnts):# 遍历每个数字轮廓# 计算轮廓的外接矩形(x,y,w,h)cv2.boundingRect(c)# 提取数字区域并缩放到统一尺寸roiref[y:yh,x:xw]roicv2.resize(roi,(57,88))# 标准化尺寸cv_show(roi,roi)digits[i]roi# 存储模板键为数字值为模板图像技术细节cv2.findContours()在二值图像中查找轮廓RETR_EXTERNAL仅检测最外层轮廓CHAIN_APPROX_SIMPLE压缩轮廓点减少内存使用模板标准化将所有数字缩放到57×88像素确保后续匹配的准确性七、银行卡图像处理流程7.1 图像加载与初步调整# 读取待识别图像imagecv2.imread(args[image])cv_show(image,image)# 调整图像尺寸保持宽高比imagemyutils.resize(image,width300)# 转换为灰度图像graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv_show(gray,gray)宽度统一调整为300像素既保证处理速度又维持足够的分辨率。7.2 形态学处理突出数字区域# 定义形态学操作的卷积核rectKernelcv2.getStructuringElement(cv2.MORPH_RECT,(9,3))sqKernelcv2.getStructuringElement(cv2.MORPH_RECT,(5,5))# 顶帽操作突出亮色细节抑制背景tophatcv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectKernel)open_imgcv2.morphologyEx(gray,cv2.MORPH_OPEN,rectKernel)cv_show(open,open_img)cv_show(tophat,tophat)形态学操作原理顶帽操作原始图像减去开运算结果突出比背景亮的细小区域开运算先腐蚀后膨胀消除小物体平滑边界银行卡数字通常比背景亮顶帽操作能有效突出这些数字7.3 数字区域定位与提取# 第一次闭操作连接相近的数字closeXcv2.morphologyEx(tophat,cv2.MORPH_CLOSE,rectKernel)cv_show(close1,closeX)# 自适应阈值二值化threshcv2.threshold(closeX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]cv_show(thresh,thresh)# 第二次闭操作进一步连接数字区域threshcv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel)cv_show(close2,thresh)闭操作的作用通过先膨胀后腐蚀连接相邻的白色区域数字将分散的数字点连接成完整的数字组。7.4 数字组轮廓检测与筛选# 检测轮廓_,cnts,_cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 可视化所有轮廓cnts_imgimage.copy()cv2.drawContours(cnts_img,cnts,-1,(0,0,255),3)cv_show(cnts_img,cnts_img)# 筛选符合条件的轮廓银行卡号区域locs[]forcincnts:(x,y,w,h)cv2.boundingRect(c)# 获取外接矩形arw/float(h)# 宽高比# 筛选条件宽高比和尺寸范围if2.5ar4.0:# 银行卡号区域的典型宽高比if(40w55)and(10h20):# 尺寸范围locs.append((x,y,w,h))# 按x坐标排序从左到右locssorted(locs,keylambdax:x[0])筛选逻辑宽高比2.5-4.0匹配银行卡号区域的长条形特征宽度40-55像素高度10-20像素匹配标准尺寸八、数字识别核心算法8.1 单个数字组处理output[]# 存储最终识别结果# 遍历每个数字组通常一组4个数字for(gx,gy,gw,gh)inlocs:groupOutput[]# 存储当前组的识别结果# 提取数字组区域添加5像素边界groupgray[gy-5:gygh5,gx-5:gxgw5]cv_show(group,group)# 对数字组进行二值化groupcv2.threshold(group,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]cv_show(group,group)# 检测组内每个数字的轮廓_,digitCnts,_cv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)digitCntsmyutils.sort_contours(digitCnts,methodleft-to-right)[0]8.2 模板匹配识别数字# 识别组内每个数字forcindigitCnts:# 提取单个数字区域(x,y,w,h)cv2.boundingRect(c)roigroup[y:yh,x:xw]roicv2.resize(roi,(57,88))# 缩放到模板相同尺寸cv_show(roi,roi)# 模板匹配计算与每个模板的相似度scores[]for(digit,digitROI)indigits.items():# 使用相关系数匹配法resultcv2.matchTemplate(roi,digitROI,cv2.TM_CCOEFF)(_,score,_,_)cv2.minMaxLoc(result)scores.append(score)# 选择最高得分的数字groupOutput.append(str(np.argmax(scores)))模板匹配原理cv2.matchTemplate()在输入图像中搜索与模板匹配的区域TM_CCOEFF相关系数匹配方法对光照变化鲁棒np.argmax(scores)返回最高得分的索引即识别出的数字8.3 结果可视化# 绘制数字组矩形框红色cv2.rectangle(image,(gx-5,gy-5),(gxgw5,gygh5),(0,0,255),1)# 在矩形上方显示识别结果红色cv2.putText(image,.join(groupOutput),(gx,gy-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2)# 添加到总结果output.extend(groupOutput)九、最终结果输出# 输出银行卡类型和完整卡号print(Credit Card Type: {}.format(FIRST_NUMBER.get(output[0],Unknown)))print(Credit Card #: {}.format(.join(output)))# 显示最终处理结果cv2.imshow(Image,image)cv2.waitKey(0)cv2.destroyAllWindows()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询