数字图像处理与机器视觉:Visual C++与Matlab实现(第2版) PDF 完整版

  • 更新时间:
  • 8054人关注
  • 点击下载

给大家带来的一篇关于数字图像相关的电子书资源,介绍了关于数字图像处理、机器视觉、Visual、C++、Matlab方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小232 MB,张铮,徐超,任淑编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.6分。我们还整理了当当、亚马逊、豆瓣等平台对此电子书和资源的评价,一共2条,一起来看下吧。

资源详情相关推荐
数字图像处理与机器视觉:Visual C++与Matlab实现(第2版)
  • 出版社:人民邮电出版社
  • 作者:张铮,徐超,任淑
  • 大小:232 MB
  • 类别:数字图像
  • 热度:168
  • 机器视觉技术
  • 数字图像处理与机器视觉:Visual C++与Matlab实现(第2版)
  • Halcon机器视觉函数库中文速查手册
  • 图像处理、分析与机器视觉
  • 读者评价

    网友NO.28130
    许妙珍
    Matlab引擎采用客户和服务器计算模式。在运行中,Visual C++的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,Matlab引擎提供了下列几个函数: engOpen:启动Matlab引擎 engClose:关闭Matlab引擎 engGetArray:从Matlab引擎中获得一个Matlab矩阵,用于数据交换 engPutArray:从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换 engEvalString:执行一个Matlab命令 engOutputBuffer:创建一个用于存储Matlab文本输出的字符缓冲区
    网友NO.34227
    庄梅花
    Matlab引擎(Matlab engine)提供了一组 Matlab API 函数,用户不必关心这个Matlab引擎是如何实现的,只需要调用这些函数即可。正是通过这些 API 函数,实现了应用程序进程之间的传递数据,从而达到两者之间的良好结合。

    书籍介绍

    这本书真的很不错,虽然没有图像恢复和压缩编码的部分,但是就其理论的详实,文字的简练易懂都是难能可贵的。而且书中的关于图像识别确实有一定的深度!

    内容涉及数字图像处理和识别技术的方方面面,包括图像的点运算、几何变换、空域和频域滤波、小波变换、图像复原、彩色图像处理、形态学处理、图像分割、图像压缩以及图像特征提取等;同时对机器视觉进行了前导性的探究,重点介绍了3种目前在工程技术领域非常流行的分类技术——人工神经网络(ANN)、支持向量机(SVM)和AdaBoost,并在配套给出的识别案例中直击光学字符识别(OCR)、人脸识别和性别分类等热点问题。

    还不错的关于数字图像和视觉方面的书。我本人还是很喜欢言简意赅的书。什么知识都弄的很难懂,说明作者水平也很一般。但中国人出书又有个特点,就是错误太多。希望作者能多修改。

    工业界人士写的一本理论和工程结合的一本书。适合直接上手用的,无论是matlab代码还是C++的代码。短、平、快直入主题。前面图像处理部分还是不错的。后面机器学习部分,本来是理论是很强的章节,在作者的文笔下写的也算是通俗,能懂其原理。当然,真正要理解这些(ML)的理论,那每一章都可以找几本书来看。总的来说,这本书是实践为王的代表之一。

    内容介绍

    《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》将理论知识、科学研究和工程实践有机结合起来,内容涉及数字图像处理和识别技术的方方面面,包括图像的点运算、几何变换、空域和频域滤波、小波变换、图像复原、彩色图像处理、形态学处理、图像分割、图像压缩以及图像特征提取等;同时对机器视觉进行了前导性的探究,重点介绍了3种目前在工程技术领域非常流行的分类技术——人工神经网络(ANN)、支持向量机(SVM)和AdaBoost,并在配套给出的识别案例中直击光学字符识别(OCR)、人脸识别和性别分类等热点问题。

    《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》结构紧凑,内容深入浅出,讲解图文并茂,适合于计算机、通信和自动化等相关专业的本科生、研究生,以及工作在图像处理和识别领域一线的广大工程技术人员阅读参考。

    内容节选

    C++如何调用matlab函数

    本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第一种方法,调用引擎,engOpen、engSetVisible、engClose

    engEvalString(m_pEngine, "x1 = 0.01 : 0.01 : 10 * pi"); 
    engEvalString(m_pEngine, "x2 = -10 * pi : 0.01 : -0.01"); 
    engEvalString(m_pEngine, "y1 = sin(x1)./x1"); 
    engEvalString(m_pEngine, "y2 = sin(x2)./x2"); 
    engEvalString(m_pEngine, "plot([x2 x1], [y2 y1])"); 

    在台式机上可以运行,但是到了笔记本上engOpen返回false,经过研究发现有可能是管理员权限的问题,

    项目右键-属性-链接器-清单文件-uac执行级别选择requireAdministrator,重新编译运行果然正确了,先记录下来。

    目录

    • 第0章初识数字图像处理与机器视觉
    • 0.1数字图像
    • 0.1.1什么是数字图像
    • 0.1.2数字图像的显示
    • 0.1.3数字图像的分类
    • 0.1.4数字图像的实质
    • 0.1.5数字图像的表示
    • 0.1.6图像的空间和灰度级分辨率
    • 0.2数字图像处理与机器视觉
    • 0.2.1从图像处理到图像识别
    • 0.2.2什么是机器视觉
    • 0.2.3数字图像处理和识别的应用实例
    • 0.3数字图像处理的预备知识
    • 0.3.1邻接性、连通性、区域和边界
    • 0.3.2距离度量的几种方法 第0章初识数字图像处理与机器视觉
    • 0.1数字图像
    • 0.1.1什么是数字图像
    • 0.1.2数字图像的显示
    • 0.1.3数字图像的分类
    • 0.1.4数字图像的实质
    • 0.1.5数字图像的表示
    • 0.1.6图像的空间和灰度级分辨率
    • 0.2数字图像处理与机器视觉
    • 0.2.1从图像处理到图像识别
    • 0.2.2什么是机器视觉
    • 0.2.3数字图像处理和识别的应用实例
    • 0.3数字图像处理的预备知识
    • 0.3.1邻接性、连通性、区域和边界
    • 0.3.2距离度量的几种方法
    • 0.3.3基本的图像操作
    • dy 章MATLAB数字图像处理编程基础
    • 1.1MATLABR2011a简介
    • 1.1.1MATLAB软件环境
    • 1.1.2文件操作
    • 1.1.3在线帮助的使用
    • 1.1.4变量的使用
    • 1.1.5矩阵的使用
    • 1.1.6细胞数组(CellArray)和结构体(Structure)
    • 1.1.7关系运算与逻辑运算
    • 1.1.8常用图像处理数学函数
    • 1.1.9MATLAB程序流程控制
    • 1.1.10M文件编写
    • 1.1.11MATLAB函数编写
    • 1.2MATLAB图像类型及其存储方式
    • 1.3MATLAB的图像转换
    • 1.4读取和写入图像文件
    • 1.5图像的显示
    • 第2章VisualC++图像处理编程基础
    • 2.1位图文件及其C++操作
    • 2.1.1设备无关位图
    • 2.1.2BMP图像文件数据结构
    • 2.2认识CImg类
    • 2.2.1主要成员函数列表
    • 2.2.2公有成员
    • 2.3CImg类基础操作
    • 2.3.1加载和写入图像
    • 2.3.2获得图像基本信息
    • 2.3.3检验有效性
    • 2.3.4按像素操作
    • 2.3.5改变图像大小
    • 2.3.6重载的运算符
    • 2.3.7在屏幕上绘制位图图像
    • 2.3.8新建图像
    • 2.3.9图像类型的判断与转化
    • 2.4DIPDemo工程
    • 2.4.1DIPDemo主界面
    • 2.4.2图像操作和处理类——CImg和CImgProcess
    • 2.4.3文档类——CDIPDemoDoc
    • 2.4.4视图类——CDIPDemoView
    • 2.5CImg应用示例
    • 2.5.1打开图像
    • 2.5.2清空图像
    • 2.5.3像素初始化方法
    • 2.5.4保存图像
    • 第3章图像的点运算
    • 3.1灰度直方图
    • 3.1.1理论基础
    • 3.1.2MATLAB实现
    • 3.1.3VisualC++实现
    • 3.2灰度的线性变换
    • 3.2.1理论基础
    • 3.2.2MATLAB程序的实现
    • 3.2.3VisualC++实现
    • 3.3灰度对数变换
    • 3.3.1理论基础
    • 3.3.2MATLAB实现
    • 3.3.3VisualC++实现
    • 3.4伽玛变换
    • 3.4.1理论基础
    • 3.4.2MATLAB编程实现
    • 3.4.3VisualC++实现
    • 3.5灰度阈值变换
    • 3.5.1理论基础
    • 3.5.2MATLAB编程实现
    • 3.5.3VisualC++实现
    • 3.6分段线性变换
    • 3.6.1理论基础
    • 3.6.2MATLAB编程实现
    • 3.6.3VisualC++编程实现
    • 3.7直方图均衡化
    • 3.7.1理论基础
    • 3.7.2MATLAB编程实现
    • 3.7.3VisualC++实现
    • 3.8直方图规定化(匹配)
    • 3.8.1理论基础
    • 3.8.2MATLAB编程实现
    • 3.8.3VisualC++实现
    • 第4章图像的几何变换
    • 4.1解决几何变换的一般思路
    • 4.2图像平移
    • 4.2.1图像平移的变换公式
    • 4.2.2图像平移的实现
    • 4.3图像镜像
    • 4.3.1图像镜像的变换公式
    • 4.3.2图像镜像的实现
    • 4.4图像转置
    • 4.4.1图像转置的变换公式
    • 4.4.2图像转置的实现
    • 4.5图像缩放
    • 4.5.1图像缩放的变换公式
    • 4.5.2图像缩放的实现
    • 4.6图像旋转
    • 4.6.1以原点为中心的图像旋转
    • 4.6.2以任意点为中心的图像旋转
    • 4.6.3图像旋转的实现
    • 4.7插值算法
    • 4.7.1 近邻插值
    • 4.7.2双线性插值
    • 4.7.3高阶插值
    • 4.8图像配准简介
    • 4.8.1图像配准
    • 4.8.2人脸图像配准的MATLAB实现
    • 4.9VisualC++高级应用实例——汽车牌照的投影失真校正
    • 4.9.1系统分析与设计
    • 4.9.2系统实现
    • 4.9.3功能测试
    • 第5章空间域图像增强
    • 5.1图像增强基础
    • 5.2空间域滤波
    • 5.3图像平滑
    • 5.3.1平均模板及其实现
    • 5.3.2高斯平滑及其实现
    • 5.3.3通用平滑滤波的VisualC++实现
    • 5.3.4自适应平滑滤波
    • 5.4中值滤波
    • 5.4.1性能比较
    • 5.4.2一种改进的中值滤波策略
    • 5.4.3中值滤波的工作原理
    • 5.5图像锐化
    • 5.5.1理论基础
    • 5.5.2基于一阶导数的图像增强——梯度算子
    • 5.5.3基于二阶微分的图像增强——拉普拉斯算子
    • 5.5.4基于一阶与二阶导数的锐化算子的比较
    • 5.5.5高提升滤波及其实现
    • 5.5.6高斯-拉普拉斯变换(LaplacianofaGaussian,LoG)
    • 第6章频率域图像增强
    • 6.1频率域滤波——与空间域滤波殊途同归
    • 6.2傅里叶变换基础知识
    • 6.2.1傅里叶级数
    • 6.2.2傅里叶变换
    • 6.2.3幅度谱、相位谱和功率谱
    • 6.2.4傅里叶变换的实质——基的转换
    • 6.3快速傅里叶变换及实现
    • 6.3.1FFT变换的 要性
    • 6.3.2常见的FFT算法
    • 6.3.3按时间抽取的基-2FFT算法
    • 6.3.4离散反傅里叶变换的快速算法
    • 6.3.5N维快速傅里叶变换
    • 6.3.6MATLAB实现
    • 6.3.7VisualC++实现
    • 6.4频域滤波基础
    • 6.4.1频域滤波与空域滤波的关系
    • 6.4.2频域滤波的基本步骤
    • 6.4.3频域滤波的MATLAB实现
    • 6.4.4频域滤波的VisualC++实现
    • 6.5频率域低通滤波器
    • 6.5.1理想低通滤波器及其实现
    • 6.5.2高斯低通滤波器及其实现
    • 6.6频率域高通滤波器
    • 6.6.1高斯高通滤波器及其实现
    • 6.6.2频域拉普拉斯滤波器及其实现
    • 6.7MATLAB综合案例——利用频域滤波消除周期噪声
    • 6.7.1频域带阻滤波器
    • 6.7.2带阻滤波器消除周期噪声
    • 6.8频域滤波器与空域滤波器之间的内在联系
    • 附录
    • 第7章小波变换
    • 7.1多分辨率分析
    • 7.1.1多分辨率框架
    • 7.1.2分解与重构的实现
    • 7.1.3图像处理中分解与重构的实现
    • 7.2Gabor多分辨率分析
    • 7.3常见小波分析
    • 7.3.1Haar小波
    • 7.3.2Daubechies小波
    • 7.4高维小波
    • 第8章图像复原
    • 8.1图像复原的理论模型
    • 8.1.1图像复原的基本概念
    • 8.1.2图像复原的一般模型
    • 8.2噪声模型
    • 8.2.1噪声种类
    • 8.2.2MATLAB实现
    • 8.2.3VisualC++实现
    • 8.3空间滤波
    • 8.3.1空域滤波原理
    • 8.3.2MATLAB实现
    • 8.3.3VisualC++实现
    • 8.4逆滤波复原
    • 8.4.1逆滤波原理
    • 8.4.2MATLAB实现
    • 8.4.3VisualC++实现
    • 8.5维纳滤波复原
    • 8.5.1维纳滤波原理
    • 8.5.2MATLAB实现
    • 8.5.3VisualC++实现
    • 8.6有约束 小二乘复原
    • 8.7Lucky-Richardson复原
    • 8.8盲去卷积图像复原
    • 8.9MATLAB图像复原综合案例——去除照片的运动模糊
    • 第9章彩色图像处理
    • 9.1彩色基础
    • 9.2彩色模型
    • 9.2.1RGB模型
    • 9.2.2CMY、CMYK模型
    • 9.2.3HSI模型
    • 9.2.4HSV模型
    • 9.2.5YUV模型
    • 9.2.6YIQ模型
    • 9.2.7Lab模型简介
    • 9.3全彩色图像处理基础
    • 9.3.1彩色补偿及其MATLAB实现
    • 9.3.2彩色平衡及其MATLAB实现
    • dy 0章图像压缩
    • 10.1图像压缩理论
    • 10.1.1图像冗余
    • 10.1.2香农定理
    • 10.1.3保真度评价
    • 10.2DCT变换与量化
    • 10.2.1DCT变换原理
    • 10.2.2量化
    • 10.2.3DCT变换和量化的VisualC++实现
    • 10.3预测编码
    • 10.4霍夫曼编码
    • 10.4.1霍夫曼编码原理
    • 10.4.2霍夫曼编码的VisualC++实现
    • 10.5算术编码
    • 10.5.1算术编码原理
    • 10.5.2算术编码的VisualC++实现
    • 10.6游程编码
    • 10.7JPEG和JPEG2000压缩标准
    • 10.8VisualC++综合案例——类似JPEG的图像压缩
    • dy 1章形态学图像处理
    • 11.1预备知识
    • 11.2二值图像中的基本形态学运算
    • 11.2.1腐蚀及其实现
    • 11.2.2膨胀及其实现
    • 11.2.3开运算及其实现
    • 11.2.4闭运算及其实现
    • 11.3二值图像中的形态学应用
    • 11.3.1击中与击不中变换及其实现
    • 11.3.2边界提取与跟踪及其实现
    • 11.3.3区域填充及其VisualC++实现
    • 11.3.4连通分量提取及其实现
    • 11.3.5细化算法及其VisualC++实现
    • 11.3.6像素化算法及其VisualC++实现
    • 11.3.7凸壳及其VisualC++实现
    • 11.3.8bwmorph()函数
    • 11.4灰度图像中的基本形态学运算
    • 11.4.1灰度膨胀及其实现
    • 11.4.2灰度腐蚀及其实现
    • 11.4.3灰度开、闭运算及其实现
    • 11.4.4顶帽变换( -hat)及其实现
    • 小结
    • dy 2章图像分割
    • 12.1图像分割概述
    • 12.2边缘检测
    • 12.2.1边缘检测概述
    • 12.2.2常用的边缘检测算子
    • 12.2.3MATLAB实现
    • 12.2.4VisualC++实现
    • 12.3霍夫变换
    • 12.3.1直线检测
    • 12.3.2曲线检测
    • 12.3.3任意形状的检测
    • 12.3.4Hough变换直线检测的MATLAB实现
    • 12.3.5Hough变换直线检测的VisualC++实现
    • 12.4阈值分割
    • 12.4.1阈值分割方法
    • 12.4.2MATLAB实现
    • 12.4.3VisualC++实现
    • 12.5区域分割
    • 12.5.1区域生长及其实现
    • 12.5.2区域分裂与合并及其MATLAB实现
    • 12.6小结
    • dy 3章特征提取
    • 13.1图像特征概述
    • 13.2基本统计特征
    • 13.2.1简单的区域描绘子及其MATLAB实现
    • 13.2.2直方图及其统计特征
    • 13.2.3灰度共现矩阵及其VisualC++实现
    • 13.3特征降维
    • 13.3.1维度灾难
    • 13.3.2特征选择简介
    • 13.3.3主成分分析
    • 13.3.4快速PCA及其实现
    • 13.4综合案例——基于PCA的人脸特征抽取
    • 13.4.1数据集简介
    • 13.4.2生成样本矩阵
    • 13.4.3主成分分析
    • 13.4.4主成分脸可视化分析
    • 13.4.5基于主分量的人脸重建
    • 13.5局部二进制模式
    • 13.5.1基本LBP
    • 13.5.2圆形邻域的LBPPR算子
    • 13.5.3统一化LBP算子——UniformLBP及其MATLAB实现
    • 13.5.4MB-LBP及其MATLAB实现
    • 13.5.5图像分区及其MATLAB实现
    • dy 4章图像识别初步
    • 14.1模式识别概述
    • 14.2模式识别方法分类
    • 14.3 小距离分类器和模板匹配
    • 14.3.1 小距离分类器及其MATLAB实现
    • 14.3.2基于相关的模板匹配
    • 14.3.3相关匹配的计算效率
    • dy 5章人工神经网络
    • 15.1人工神经网络简介
    • 15.1.1仿生学动机
    • 15.1.2人工神经网络的应用实例
    • 15.2人工神经网络的理论基础
    • 15.2.1训练线性单元的梯度下降算法
    • 15.2.2多层人工神经网络
    • 15.2.3Sigmoid单元
    • 15.2.4反向传播(BackPropagation,BP)算法
    • 15.2.5训练中的问题
    • 15.3基于ANN的数字字符识别系统DigitRec——分析与设计
    • 15.3.1任务描述
    • 15.3.2数据集简介
    • 15.3.3设计要点
    • 15.4基于ANN的数字字符识别系统——DigitRec的实现
    • 15.4.1构建神经元结构——SNeuron
    • 15.4.2构建神经网络网络层——SNeuronLayer
    • 15.4.3神经网络信息头——NeuralNet_Header
    • 15.4.4神经网络类——CNeuralNet
    • 15.4.5神经网络的训练数据类——CNeuralData
    • 15.4.6误差跟踪类——CValueTrack
    • 15.4.7训练对话框类——CTrainDlg
    • 15.4.8测试对话框类——CTestDlg
    • 15.5基于ANN的数字字符识别系统——DigitRec的测试
    • 15.5.1训练
    • 15.5.2测试
    • 15.6改进的DigitRec
    • 15.6.1数字字符图像的预处理类——COCRImageProcess
    • 15.6.2输入图像的预处理——实现
    • 15.6.3输入图像的预处理——测试
    • 15.7神经网络参数对训练和识别的影响
    • 15.7.1隐藏层单元数目的影响
    • 15.7.2学习率的影响
    • 15.7.3训练时代数目的影响
    • dy 6章支持向量机
    • 16.1支持向量机的分类思想
    • 16.2支持向量机的理论基础
    • 16.2.1线性可分情况下的SVM
    • 16.2.2非线性可分情况下的C-SVM
    • 16.2.3需要核函数映射情况下的SVM
    • 16.2.4推广到多类问题
    • 16.3SVM的MATLAB实现
    • 16.3.1训练——svmtrain
    • 16.3.2分类——svmclassify
    • 16.3.3应用实例
    • 16.4综合案例——基于PCA和SVM的人脸识别系统
    • 16.4.1人脸识别简介
    • 16.4.2前期处理
    • 16.4.3数据规格化
    • 16.4.4核函数的选择
    • 16.4.5参数选择
    • 16.4.6构建多类SVM分类器
    • 16.4.7实验结果
    • 16.5SVM在线资源
    • 16.5.1MATLAB的SVM工具箱
    • 16.5.2LibSVM的简介
    • dy 7章AdaBoost
    • 17.1AdaBoost分类思想
    • 17.2AdaBoost理论基础
    • 17.3构建AdaBoost的MATLAB工具箱
    • 17.4MATLAB综合案例——基于AdaBoost的面部图像男女性别分类
    • 17.4.1关于数据集
    • 17.4.2数据的预处理
    • 17.4.3算法流程实现
    • 参考文献
    精选笔记:[机器视觉]使用python自动识别验证码详解

    12小时8分钟前回答

    前言

    CAPTCHA全称Completely Automated Public Turing Test to Tell Computers and Humans Apart,即全自动区分人机的图灵测试。这也是验证码诞生的主要任务。但是随着近年来大数据运算和机器视觉的发展,用机器视觉识别图像已经变得非常容易,过去用于区分人机的验证码也开始变得不再安全。

    接下来就让我们从零开始,深入图像处理和算法构建,来看看使用机器视觉来识别过时的验证码( 如下所示 )究竟可以有多简单。

    [机器视觉]使用python自动识别验证码详解

    载入需要的程序包 & 设置全局变量

    import requests
    import time
    from io import BytesIO
    from PIL import Image
    import os
    import numpy as np
    
    # 获取验证码的网址
    CAPT_URL = "http://xxxxxxxxxxxx.cn/servlet/ImageServlet"
    
    # 验证码的保存路径
    CAPT_PATH = "capt/"
    if not os.path.exists(CAPT_PATH):
      os.mkdir(CAPT_PATH)
    
    # 将验证码转为灰度图时用到的"lookup table"
    THRESHOLD = 165
    LUT = [0]*THRESHOLD + [1]*(256 - THRESHOLD)
    

    从网站获取验证码

    capt_fetch()方法非常简单,我们直接从网站获取验证码,将其转换为Image对象,等待被训练和测试等环节调用。

    def capt_fetch():
      """
      从网站获取验证码,将验证码转为Image对象
    
      :require requests: import requests
      :require time: import time
      :require BytesIO: from io import BytesIO
      :require Image: from PIL import Image
    
      :param:
      :return capt: 一个Image对象
      """
      # 从网站获取验证码
      capt_raw = requests.get(CAPT_URL)
    
      # 将二进制的验证码图片写入IO流
      f = BytesIO(capt_raw.content)
    
      # 将验证码转换为Image对象
      capt = Image.open(f)
    
      return capt
    

    保存验证码到本地

    1. 一个强大的机器学习模型,是离不开强大的训练集作支持的。这里我们也必须先有一个预先打好标签(预分类)的验证码图片集,才能开始训练模型。
    2. capt_download()方法就是我们用来建立训练图像集的方法。它会调用capt_fetch()方法,将获得的Image对象展示给用户,等待用户输入验证码中的字符,然后将图片命名为用户输入的字符存储起来。
    3. 当然,为了避免文件名重复(比如获取到了两张字符完全相同的验证码),capt_download()方法将系统时间也加入到了文件名中。
    def capt_download():
      """
      将Image类型的验证码对象保存到本地
    
      :require Image: from PIL import Image
      :require os: import os
    
      :require capt_fetch(): 从nbsc网站获取验证码
      :require CAPT_PATH: 验证码保存路径
    
      :param:
      :return: 
      """
      capt = capt_fetch()
      capt.show()
    
      text = raw_input("请输入验证码中的字符:")
      suffix = str(int(time.time() * 1e3))
    
      capt.save(CAPT_PATH + text + "_" + suffix + ".jpg")
    

     图像预处理

    1. capt_process()方法会先将验证码转为灰度图,然后再根据全局变量中定义的LUT将灰度图转化为黑白图片。并按照验证码中四个字符所在的位置进行切割。
    2. 从彩色图片到灰度图,再到黑白图,看似验证码中的信息损失了很多,实际上这样做的目的是为了使字符的特征更加明显。
    3. 其实我们最终得到的黑白图像会有一些噪点存在,这主要是由于前景色与背景色不存在严格的区分度,我们可以使用滤波器过滤掉这些噪点,但少量的噪点会被训练模型当作误差处理,并不影响我们分类。至于过滤噪点的方法,我会专门写一篇帖子。
    def capt_process(capt):
      """
      图像预处理:将验证码图片转为二值型图片,按字符切割
    
      :require Image: from PIL import Image
      :require LUT: A lookup table, 包含256个值
    
      :param capt: 验证码Image对象
      :return capt_per_char_list: 一个数组包含四个元素,每个元素是一张包含单个字符的二值型图片
      """
      capt_gray = capt.convert("L")
      capt_bw = capt_gray.point(LUT, "1")
    
      capt_per_char_list = []
      for i in range(4):
        x = 5 + i * 15
        y = 2
        capt_per_char = capt_bw.crop((x, y, x + 15, y + 18))
        capt_per_char_list.append(capt_per_char)
    
      return capt_per_char_list
    

    图像预处理的效果如下:

    [机器视觉]使用python自动识别验证码详解

    原始图像

    [机器视觉]使用python自动识别验证码详解

    灰度图

    [机器视觉]使用python自动识别验证码详解

    黑白图

    [机器视觉]使用python自动识别验证码详解

    按字符切分后的黑白图像

    由于字符宽窄有差异,这里我们按字符切分后,有些字符会多出来一部分,有些字符会丢失一部分。比如7多了一笔看起来像个三角形,M少了一竖看起来像N。但只要符号之间有区分度,依然能够准确分类。

    提取图像中的特征值

    1. 到了这一步,我们得到的图像都是由单个字符组成的黑白图片(0为黑色像素点,1为白色像素点)。此时,如果我们把图片转为数组,就会得到一个由0,1组成的矩阵,其长宽恰与图片的大小相同, 每一个数字代表一个像素点。
    2. 接下来我们需要考虑如何提取能够区分不同字符的特征值。我们可以直接用图像中的每一个像素点作为一个特征值,也可以汇总图像中共有多少黑色像素点(当然,这样每张图片只能提取一个特征值),还可以按区域汇总图像中的像素点,比如先将图片四等分,汇总四张“子图片”中的像素点,如果觉得特征不够多,还可以继续下分,直至精确到每一个像素点。
    3. 为了使代码更加简洁,我们这里直接汇总、分行列汇总了图像像素点的个数,共提取了1张图片 + 15列 + 18行 ==> 34个特征值。至于按区域汇总的方法,还是等我们有空了单独写一篇帖子。
    def capt_inference(capt_per_char):
      """
      提取图像特征
    
      :require numpy: import numpy as np
    
      :param capt_per_char: 由单个字符组成的二值型图片
      :return char_features:一个数组,包含 capt_per_char中字符的特征
      """
      char_array = np.array(capt_per_char)
    
      total_pixels = np.sum(char_array)
      cols_pixels = np.sum(char_array, 0)
      rows_pixels = np.sum(char_array, 1)
    
      char_features = np.append(cols_pixels, rows_pixels)
      char_features = np.append(total_pixels, char_features)
    
      return char_features.tolist()
    

    生成训练集

    这里我们会将预分类的每张验证码分别读入内存,从它们的图像中提取特征值,从它们的名称中提取验证码所对应的文字(标签),并将特征值与标签分别汇总成列表,注意train_labels中的每个元素是与train_table中的每一行相对应的。

    def train():
      """
      将预分类的验证码图片集转化为字符特征训练集
    
      :require Image: from PIL import Image
      :require os: import os
    
      :require capt_process(): 图像预处理
      :require capt_inference(): 提取图像特征
    
      :param:
      :return train_table: 验证码字符特征训练集
      :return train_labels: 验证码字符预分类结果
      """
      files = os.listdir(CAPT_PATH)
    
      train_table = []
      train_labels = []
    
      for f in files:
        train_labels += list(f.split("_")[0])
    
        capt = Image.open(CAPT_PATH + f)
        capt_per_char_list = capt_process(capt)
        for capt_per_char in capt_per_char_list:
          char_features = capt_inference(capt_per_char)
          train_table.append(char_features)
    
      return train_table, train_labels
    

    定义分类模型

    1. 只要我们提取的特征值具有足够的区分度(能够区分不同字符),理论上我们可以使用任何机器学习的模型建立特征值与标签的相关。
    2. 我尝试过使用knn,svm,Decision Tree,ANN等各种主流机器学习模型对提取的训练数据进行分类,尽管不同模型表现各异,但识别准确率都可以很轻松的达到90%以上。
    3. 这里我们不打算使用复杂的第三方模型完成学习过程,所以我们在这里自己写了一个分类模型。模型实现的nnc算法是knn的一种,通过比对未知分类的一组特征值测试集与那一组已知分类的特征值训练集最接近,判定测试集的分类情况应该和与其最接近的训练集的分类情况训练集标签相同。
    4. 当然,我们也可以稍加改造直接实现knn算法,找到3组、5组或k组与未知分类的特征向量最接近的训练集中的特征向量,并通过票选与其对应的标签,预测未知分类的特征向量在大概率上应该属于哪一类。
    def nnc(train_table, test_vec, train_labels):
      """
      Nearest Neighbour Classification(近邻分类法),
      根据已知特征矩阵的分类情况,预测未分类的特征向量所属类别
    
      :require numpy: import numpy as np
    
      :param train_table: 预分类的特征矩阵
      :param test_vec: 特征向量, 长度必须与矩阵的列数相等
      :param labels: 特征矩阵的类别向量
      :return : 预测特征向量所属的类别 
      """
    
      dist_mat = np.square(np.subtract(train_table, test_vec))
      dist_vec = np.sum(dist_mat, axis = 1)
      pos = np.argmin(dist_vec)
    
      return train_labels[pos]
    

     测试模型分类效果

    最后,我们需要测试我们的理论是否有效,通过调用test()方法,我们会先从网站获取验证码图像,对图像进行处理、特征提取,然后调用nnc()方法对提取到的四组特征值做近邻分类,分别得到验证码中的四个字符。最后将验证码图像和识别到的字符传出,方便我们比对识别结果。

    def test():
      """
      测试模型分类效果
    
      :require Image: from PIL import Image
    
      :require capt_fetch(): 从nbsc网站获取验证码
      :require capt_process(): 图像预处理
      :require capt_inference(): 提取图像特征
      :train_table, train_labels: train_table, train_labels = train()
    
      :param:
      :return capt: 验证码图片
      :return test_labels: 验证码识别结果
      """
    
      test_labels = []
    
      capt = capt_fetch()
      capt_per_char_list = capt_process(capt)
      for capt_per_char in capt_per_char_list:
        char_features = capt_inference(capt_per_char)
        label = nnc(train_table, char_features, train_labels)
        test_labels.append(label)
    
      test_labels = "".join(test_labels)
    
      return capt, test_labels
    

    训练数据,识别验证码

    1. 方法具备,接下来就是我们实践的环节了。
    2. 首先,我们需要建立一个机器学习库,即一个预分类的验证码图片集。这里我们仅仅获取了120张验证码作为训练集,相比tensorflow动辄成千上万次的迭代,我们建立模型所需的样本量非常之少。当然,这也要感谢我们使用的nnc算法并不需要十分庞大的训练集支持,才使得我们能够节省很多预分类时人工识别验证码的精力。
    3. 接下来,我们会调用train()方法生成训练集和训练集标签,这两个数组会被test()方法用到,但我们把这两个数组存储在全局变量里,所以不需要特意传递给test()方法。
    # 下载120张图片到本地
    for i in range(120):
      capt_download()
    
    # 模型的训练与测试
    train_table, train_labels = train()
    test_capt, test_labels = test()

    最后我们调用test()方法验证我们的理论是否成立,识别效果如下:

    获取到的验证码

    [机器视觉]使用python自动识别验证码详解

    识别结果

    [机器视觉]使用python自动识别验证码详解

    结语

    至此,我们通过机器视觉识别验证码的任务算是完成了。至于正确率,大概每10张验证码,40各字符中会预测失误一个字符。这已经比较接近我们人类的识别准确率了,当然,我们还可以通过建立起更庞大的学习库,使用knn或更复杂的模型,使用卷积核处理图片等方式,使识别准确率更高。

    当然,我们这里所用的方法,只适用于识别比较简单的验证码。对于更加复杂的验证码(如下图),以上方法是不起作用的,但这并不代表这样的验证码不能通过机器视觉进行识别。

    [机器视觉]使用python自动识别验证码详解

    我们已经看到,随着机器视觉的发展,通过传统的验证码来区分人机已经越来越难了。当然,为了网络的安全性,我们也可使用更复杂的验证码,或者新型的验证方式,比如拖动滑块、短信验证、扫码登陆等。

    以上所述是小编给大家介绍的python自动识别验证码详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

    资源下载

    相关声明:

    《数字图像处理与机器视觉:Visual C++与Matlab实现(第2版) 》PDF 完整版下载资源由用户 钱明辉 于 2019-02-28 11:48:15 分享至百度网盘。仅供想学习数字图像的网友交流使用,专题参考:MATLABVisual C++机器视觉数字图像处理,数字图像,

    相关资源

    • 图像处理、分析与机器视觉

      图像处理、分析与机器视觉

      本书是英文第4版的中文翻译,大约有五分之一的内容更新。主要更新的内容包括:增加了一些最新的算法,增加了习题部分,重写了部分内容。更为具体的内容更新请参考作者序。 本书是在第

      大小:289.4 MB图像处理

      立即下载
    • 机器视觉

      机器视觉

      《机器视觉》 从逆问题的角度出发,提出了一整套关于机器视觉的研究方法,其核心是:机器视觉应该基于对成像过程的深刻理解!作为作者在麻省理工学院(MIT)所讲授的机器视觉课程的指

      大小:98.2 MB机器视觉

      立即下载
    • 机器人学、机器视觉与控制:MATLAB算法基础

      机器人学、机器视觉与控制:MATLAB算法基础

      机器人学、机器视觉与控制――MATLAB算法基础 是关于机器人学和机器视觉的实用参考书, 第一部分基础知识(第2章和第3章)介绍机器人及其操作对象的位置和姿态描述,以及机器人路径和运

      大小:126.3 MB机器人

      立即下载

    学习笔记

    18小时40分钟前回答

    python数字图像处理之骨架提取与分水岭算法

    这篇文章主要介绍了python数字图像处理之骨架提取与分水岭算法,现在分享给大家,也给大家做个参考。一起过来看看吧 骨架提取与分水岭算法也属于形态学处理范畴,都放在morphology子模块内。 1、骨架提取 骨架提取,也叫二值图像细化。这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示。 morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize()函数和medial_axis()函数。我们先来看Skeletonize()函数。 格式为: skimage.morphology. skeletonize ( image ) 输入和输出都是一幅二值图像。 例1: from skimage import morphology,drawimport numpy as npimport matplotlib.pyplot as plt#创建一个二值图……

    23小时35分钟前回答

    python数字图像处理之高级形态学处理

    这篇文章主要介绍了python数字图像处理之高级形态学处理,现在分享给大家,也给大家做个参考。一起过来看看吧 形态学处理,除了最基本的膨胀、腐蚀、开/闭运算、黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等。 1、凸包 凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含在内。 函数为: skimage.morphology.convex_hull_image(image) 输入为二值图像,输出一个逻辑二值图像。在凸包内的点为True, 否则为False 例: import matplotlib.pyplot as pltfrom skimage import data,color,morphology#生成二值测试图像img=color.rgb2gray(data.horse())img=(img0.5)*1chull = morphology.convex_hull_image(img)#绘制……

    13小时13分钟前回答

    python数字图像处理之高级滤波代码详解

    本文提供许多的滤波方法,这些方法放在filters.rank子模块内。 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定。 1、autolevel 这个词在photoshop里面翻译成自动色阶,用局部直方图来对图片进行滤波分级。 该滤波器局部地拉伸灰度像素值的直方图,以覆盖整个像素值范围。 格式:skimage.filters.rank.autolevel(image, selem) selem表示结构化元素,用于设定滤波器。 from skimage import data,colorimport matplotlib.pyplot as pltfrom skimage.morphology import diskimport skimage.filters.rank as sfrimg =color.rgb2gray(data.lena())auto =sfr.autolevel(img, disk(5)) #半径为5的圆形滤波器plt.figure('filters',figsize=(8,8))plt.subplot(121)plt.title('……