图像_图像分割 - CSDN
精华内容
参与话题
  • 先后就读于华中科技大学、中国科学院,先后就职于奇虎360AI研究院,陌陌深度学习实验室,6年计算机视觉从业经验,拥有丰富的传统图像算法和深度学习图像项目经验,著有畅销书《深度学习之图像识别:核心技术与案例...
  • 如何学好图像处理——从小白到大神?

    万次阅读 多人点赞 2020-04-17 02:28:38
    什么是数字图像处理?历史、以及它所研究的内容。 说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理研究的历史相当悠久;横向来说,数字图像处理研究的话题相当广泛。 ...

    什么是数字图像处理?历史、以及它所研究的内容。

     

    说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理研究的历史相当悠久;横向来说,数字图像处理研究的话题相当广泛。

    数字图像处理的历史可以追溯到近百年以前,大约在1920年的时候,图像首次通过海底电缆从英国伦敦传送到美国纽约。图像处理的首次应用是为了改善伦敦和纽约之间海底电缆发送的图片质量,那时就应用了图像编码,被编码后的图像通过海底电缆传送至目的地,再通过特殊设备进行输出。这是一次历史性的进步,传送一幅图片的时间从原来的一个多星期减少到了3小时。

    1950年,美国的麻省理工学院制造出了第一台配有图形显示器的电子计算机——旋风I号(Whirlwind I)。旋风I号的显示器使用一个类似于示波器的阴极射线管(Cathode Ray Tube,CRT)来显示一些简单的图形。1958年美国Calcomp公司研制出了滚筒式绘图仪,GerBer公司把数控机床发展成为平板式绘图仪。在这一时期,电子计算机都主要应用于科学计算,而为这些计算机配置的图形设备也仅仅是作为一种简单的输出设备。

    随着计算机技术的进步,数字图像处理技术也得到了很大的发展。1962年,当时还在麻省理工学院攻读博士学位的伊凡·苏泽兰(Ivan Sutherland)成功开发了具有划时代意义的“画板”(Sketchpad)程式。而这正是有史以来第一个交互式绘图系统,同时这也是交互式电脑绘图的开端。从此计算机和图形图像被更加紧密地联系到了一起。鉴于伊凡·苏泽兰为计算机图形学创立所做出的杰出贡献,他于1988年被授予计算机领域最高奖——图灵奖。

    1964年,美国加利福尼亚的喷气推进实验室用计算机对“旅行者七号”太空船发回的大批月球照片进行处理,以校正航天器上摄影机中各种类型的图像畸变,收到了明显的效果。在后来的宇航空间技术中,数字图像处理技术都发挥了巨大的作用。

    到了20世纪60年代末期,数字图像处理已经形成了比较完善的学科体系,这套理论在20世纪70年代发展得十分迅速,并开始应用于医学影像和天文学等领域。1972年,美国物理学家阿伦·马克利奥德·柯麦科(Allan MacLeodCormack)和英国电机工程师戈弗雷·纽博尔德·豪恩斯弗尔德(Godfrey Newbold Housfield)发明了轴向断层术,并将其用于头颅诊断。世界第一台X射线计算机轴向断层摄影装置由EMI公司研制成功,这也就是人们通常所说的CT(Computer Tomograph)。CT可通过一些算法用感知到的数据去重建通过物体的“切片”图像。这些图像组成了物体内部的再现图像,也就是根据人的头部截面的投影,经计算机处理来进行图像重建。鉴于CT对于医学诊断技术的发展所起到的巨大推动作用,柯麦科和豪恩斯弗尔德于1979年获得了诺贝尔生理或医学奖。

    随后在2003年,诺贝尔生理或医学奖的殊荣再次授予了两位在医疗影像设备研究方面做出杰出贡献的科学家——美国化学家保罗·劳特伯尔(Paul Lauterbur)和英国物理学家彼得·曼斯菲尔(Peter Mansfield)。两位获奖者在利用磁共振成像(Magnetic Resonance Imaging,MRI)显示不同结构方面分别取得了开创性成就。瑞典卡罗林斯卡医学院称,这两位科学家在MRI领域的开创性工作,代表了医学诊疗和研究的重大突破。而事实上,核磁共振的成功同样也离不开数字图像处理方面的发展。即使在今天,诸如MRI图像降噪等问题依然是数字图像处理领域的热门研究方向。

    说到数字图像的发展历程,还有一项至关重要的成果不得不提,那就是电荷耦合元件(Charge-coupled Device,CCD)。CCD最初是由美国贝尔实验室的科学家维拉德·波义耳(Willard Sterling Boyle)和乔治·史密斯(George Elwood Smith)于1969年发明的。CCD的作用就像胶片一样,它能够把光学影像转化为数字信号。今天人们所广泛使用的数码照相机、数码摄影机和扫描仪都是以CCD为基础发展而来的。换句话说,我们现在所研究的数字图像主要也都是通过CCD设备获取的。由于波义耳和史密斯在CCD研发上所做出的巨大贡献,他们两人共同荣获了2009年度的诺贝尔物理学奖。

    数字图像处理在今天是非常热门的技术之一,生活中无处不存在着它的影子,可以说它是一种每时每刻都在改变着人类生活的技术。但长久以来,很多人对数字图像处理存在着较大的曲解,人们总是不自觉地将图像处理和Photoshop联系在一起。大名鼎鼎的Photoshop无疑是当前使用最为广泛的图像处理工具。类似的软件还有Corel公司生产的CorelDRAW等软件。

    尽管Photoshop是一款非常优秀的图像处理软件,但它的存在并不代表数字图像处理的全部理论与方法。它所具有的功能仅仅是数字图像处理中的一部分。总的来说,数字图像处理研究的内容主要包括如下几个方面:

    • 1)图像获取和输出
    • 2)图像编码和压缩
    • 3)图像增强与复原
    • 4)图像的频域变换
    • 5)图像的信息安全
    • 6)图像的区域分割
    • 7)图像目标的识别
    • 8)图像的几何变换

    但图像处理的研究内容,又不仅限于上述内容!所以说图像处理的研究话题是相当宽泛的。那现在图像处理都应用在哪些领域呢?或许我们可能熟知的例子有(当然,你应该还能举出更多例子):

    • 1)一些专业图像处理软件:Photoshop、CorelDRAW……
    • 2)一些手机APP应用:美图秀秀、玩图……
    • 3)一些医学图像处理应用:MRI、彩超图像处理……
    • 4)一些制造业上的应用:元器件检测、瑕疵检测……
    • 5)一些摄像头、相机上的应用:夜间照片的质量改善……
    • 6)一些电影工业上是应用:换背景、电影特技……

     

    什么样的人会去学(或者需要学)图像处理?

     

    1)如果你是我上述那些应用领域的从业者,你当然需要掌握图像方面的理论和技术;2)相关专业的研究人员、大专院校的博士生、研究生。

    所谓相关专业又是指什么呢?这个答案也可能相当宽泛,例如(但不仅限于此):Computer Science, Software Engineering, Electronic Engineering, Biomedical Engineering, Automation, Control, Applied Mathematics……

     

    如何学好图像处理——我的一些箴言

     

    1)对于初级入门者

     

    一个扎实的基础和对于图像处理理论的完整的、系统的整体认识对于后续的深入研究和实践应用具有非常非常重要的意义。

    我经常喜欢拿武侠小说《天龙八部》中的一段情节来向读者说明此中的道理,相信读者对这部曾经被多次搬上银幕的金庸作品已经耳熟能详了。书中讲到有个名叫鸠摩智的番僧一心想练就绝世武学,而且他也算是个相当勤奋的人了。但是,他错就错在太过于急功近利,甚至使用道家的小无相功来催动少林绝技。看上去威力无比,而且可以在短时间内“速成”,但实则后患无穷。最终鸠摩智走火入魔,前功尽废,方才大彻大悟。这个故事其实就告诉我们打牢基础是非常重要的,特别是要取得更长足的发展,就更是要对基本原理刨根问底,力求甚解,从而做到庖丁解牛,游刃有余。

    一些看似高深的算法往往是许多基础算法的组合提升。例如,令很多人望而却步的SIFT特征构建过程中,就用到了图像金字塔、直方图、高斯滤波这些非常非常基础的内容。但是,它所涉及的基础技术显然有好几个,如果缺乏对图像处理理论的系统认识,你可能会感觉事倍功半。因为所有的地方好像都是沟沟坎坎。

    关于课程——

    在这个阶段其实对于数学的要求并不高,你甚至可以从一些感性的角度去形象化的理解图像处理中很多内容(但不包括频域处理方面的内容)。具体到学习的建议,如果有条件(例如你还在高校里读书)你最好能选一门图像处理方面的课程,系统地完整的地去学习一下。这显然是入门的最好办法。如此一来,在建立一个完整的、系统的认知上相当有帮助。如果你没办法在学校里上一门这样的课,网上的一些公开课也可以试试。但现在中文MOOC上还没有这方面的优质课程推荐。英文的课程则有很多,例如美国加州伦斯勒理工学院Rich教授的数字图像处理公开课——https://www.youtube.com/channel/UCaiJlKxXamoODQtlx486qJA?spfreload=10。

    关于教材——

    显然,只听课其实还不太够,如果能一并读一本书就最好了。其实不用参考很多书,只要一本,你能从头读到尾就很好了。如果你没有条件去上一门课,那读一本来完整的自学一下就更有必要了。这个阶段,去网上到处找博客、看帖子是不行的。因为你特别需要在这个阶段对这门学问建立一个系统的完整的知识体系。东一块、西一块的胡拼乱凑无疑是坑你自己,你的知识体系就像一个气泡,可能看起来很大,但是又脆弱的不堪一击。

    现在很多学校采用冈萨雷斯的《数字图像处理》一书作为教材。这是一本非常非常经典的著作。但是我必须要提醒读者:

    1)这是一本专门为Electronic Engineering专业学生所写的书。它需要有信号与系统、数字信号处理这两门课作为基础。如果你没有这两门课的基础,你读这本书要么是看热闹,要么就是看不懂。

    下面是冈书中的一张插图。对于EE的学生来说,这当然不是问题。但是如果没有我说的那两门课的基础,其实你很难把握其中的精髓。H和h,一个大小一个小写,冈书中有的地方用H,有的地方用h,这都是有很深刻用意的。原作者并没有特别说明它们二者的区别,因为他已经默认你应该知道二者是不同的。事实上,它们一个表示频域信号,一个表示时域信号,这也导致有时候运算是卷积,有时候运算是乘法(当然这跟卷积定理有关)。所以我并不太建议那些没有这方面基础的学生在自学的时候读这本书。

     

    2)冈萨雷斯教授的《数字图像处理》第一版是在1977年出版的,到现在已经快40年了;现在国内广泛使用的第二版是2002年出版的(第三版是2007年但是其实二者差异并不大),到现在也有20年左右的时间了。事实上,冈萨雷斯教授退休也有快30年了。所以这本书的内容已经偏于陈旧。数字图像处理这个领域的发展绝对是日新月异,突飞猛进的。特别在最近二三十年里,很多新思路,新方法不断涌现。如果你看了我前面推荐的Rich教授的公开课(这也是当前美国大学正在教学的内容),你一下子就会发现,原来我们的教育还停留在改革开放之前外国的水平上。这其实特别可怕。所以我觉得冈萨雷斯教授的《数字图像处理》作为学习过程中的一个补充还是不错的,但是如果把它作为主参考,那真的就是:国外都洋枪洋炮了,我们还在大刀长矛。

     

    那么现在问题来了,对于图像处理学习者而言到底看什么书好呢?我的意见是你可以选择下面两本书中的任何一本《数字图像处理原理与实践(Matlab版)》,以及《数字图像处理:技术详解与Visual C++实践》,当然选择的标准之一就是到底你更擅长使用MATLAB还是C++。

       

     

     

     

    2)对于中级水平者

     

    纸上得来终觉浅,绝知此事要躬行。对于一个具有一定基础的,想更进一步的中级水平的人来说,这个阶段最重要的就是增强动手实践的能力。

    还是说《天龙八部》里面的一个角色——口述武功、叹为观止的王语嫣。王语嫣的脑袋里都是武功秘籍,但问题是她从来都没练过一招一式。结果是,然并卵。所以光说不练肯定不灵啊。特别是,如果你将来想从事这个行业,结果一点代码都不会写,那几乎是不可想象的。学习阶段,最常被用来进行算法开发的工具是Matlab和OpenCV。你可以把这两个东西都理解为一个相当完善的库。当然,在工业中C++用得更多,所以Matlab的应用还是很有限的。前面我们讲到,图像处理研究内容其实包括:图像的获取和编解码,但使用Matlab和OpenCV就会掩盖这部分内容的细节。你当然永远不会知道,JPEG文件到底是如何被解码的。

    如果你的应用永远都不会涉及这些话题,那么你一直用Matlab和OpenCV当然无所谓。例如你的研究领域是SIFT、SURF这种特征匹配,可以不必理会编解码方面的内容。但是如果你的研究话题是降噪或者压缩,可能你就绕不开这些内容。最开始学的时候,如果能把这部分内容也自己写写,可能会加深你的理解。以后做高级应用开发时,再调用那些库。所以具体用什么,要不要自己写,是要视你所处的阶段和自己的实际情况而定的。以我个人的经验,在我自学的时候,我就动手写了Magic House,我觉得这个过程为我奠定了一个非常夯实的基础,对于我后续的深入研究很有帮助。

     

    下面这个文中,我给出了一些这方面的资源,代码多多,很值得参考学习:图像处理与机器视觉网络资源收罗

    http://blog.csdn.net/baimafujinji/article/details/32332079

     

    3)对于高级进阶者

     

    到了这个程度的读者,编程实现之类的基本功应该不在话下。但是要往深,往高去学习、研究和开发图像处理应用,你最需要的内容就变成了数学。这个是拦在很多处于这个阶段的人面前的一大难题。如果你的专业是应用数学,当然你不会感觉有问题。但如果是其他专业背景的人就会越发感觉痛苦。

    如果你的图像处理是不涉及机器学习内容的,例如用Poisson方程来做图像融合,那你就要有PDE数值解方面的知识;如果你要研究KAZE特征,你就必须要知道AOS方面的内容。如果你研究TV降噪,你又要知道泛函分析中的BV空间内容……这些词你可能很多都没听过。总的来说,这块需要的内容包括:复变函数、泛函分析、偏微分方程、变分法、数学物理方法……

    如果你要涉足机器视觉方法的内容,一些机器学习和数据挖掘方法的内容就不可或缺。而这部分内容同样需要很强大的数学基础,例如最大似然方法、梯度下降法、欧拉-拉格朗日方程、最小二乘估计、凸函数与詹森不等式……

    当然,走到这一步,你也已经脱胎换骨,从小白到大神啦!路漫漫其修远兮,吾将上下而求索。

     

    (全文完)

     

     

    展开全文
  • MATLAB图像处理

    万人学习 2018-10-22 21:38:06
    全面系统的学习MATLAB在图像处理中的应用
  • 图像分类

    万次阅读 2018-09-13 15:29:00
    图像物体分类与检测算法综述 转自《计算机学报》 目录 图像物体分类与检测算法综述 目录 图像物体分类与检测概述 物体分类与检测的难点与挑战 物体分类与检测数据库 物体分类与检测发展历程 ...

    图像物体分类与检测算法综述

    转自《计算机学报》

    目录

    图像物体分类与检测是计算机视觉研究中的两个重要的基本问题,也是图像分割物体跟踪行为分析等其他高层视觉任务的基础。
    本文从物体分类与检测问题的基本定义出发,首先从实例、类别、语义三个层次对物体分类与检测研究中存在的困难与挑战进行了阐述。
    接下来,本文以物体检测和分类方面的典型数据库和国际视觉竞赛PASCAL VOC为主线对近年来物体分类与检测的发展脉络进行了梳理与总结,指出表达学习结构学习分别对于物体分类与检测的作用。
    最后本文对物体分类与检测的发展方向进行了思考和讨论,探讨了这一领域下一步研究的方向。

    关键词 物体分类 物体检测 计算机视觉 特征表达 结构学习


    图像物体分类与检测概述

    物体分类与检测是计算机视觉、模式识别与机器学习领域非常活跃的研究方向。物体分类与检测在很多领域得到广泛应用,包括安防领域人脸识别行人检测智能视频分析行人跟踪等,交通领域交通场景物体识别车辆计数逆行检测车牌检测与识别,以及互联网领域的基于内容的图像检索相册自动归类等。

    可以说,物体分类与检测已经应用于人们日常生活的方方面面,计算机自动分类与检测技术也在一定程度了减轻了人的负担,改变了人类生活方式。计算机视觉理论的奠基者,英国神经生理学家马尔认为,视觉要解决的问题可归结为“What is Where”,即什么东西在什么地方,即计算机视觉的研究中,物体分类和检测是最基本的研究问题之一。

    如图 1 所示,给定一张图片,物体分类要回答的问题是这张图片中是否包含某类物体(比如牛);物体检测要回答的问题则是物体出现在图中的什么地方,即需要给出物体的外接矩形框,如图 1(b)所示。

    物体分类与检测的研究,是整个计算机视觉研究的基石,是解决跟踪、分割、场景理解等其他复杂视觉问题的基础。欲对实际复杂场景进行自动分析与理解,首先就需要确定图像中存在什么物体(分类问题),或者是确定图像中什么位置存在什么物体(检测问题)。鉴于物体分类与检测在计算机视觉领域的重要地位,研究鲁棒、准确的物体分类与检测算法,无疑有着重要的理论意义和实际意义。

    这里写图片描述


    本文从物体分类与检测问题的基本定义出发,首先从实例、类别、语义三个层次对物体分类与检测研究中存在的困难与挑战进行了阐述。接下来,本文以物体检测和分类方面的主流数据库和国际视觉竞赛 PASCAL VOC 竞赛为主线对近年来物体分类与检测算法的发展脉络进行了梳理与总结,指出物体分类与检测算法的主流方法:基于表达学习和结构学习。在此基础上,本文对物体分类与检测算法的发展方向进行了思考和讨论,指出了物体检测和物体分类的有机统一,探讨了下一步研究的方向。

    物体分类与检测的难点与挑战

    物体分类与检测是视觉研究中的基本问题,也是一个非常具有挑战性的问题。物体分类与检测的难点与挑战在本文中分为三个层次:实例层次类别层次语义层次,如图 2 所示。

    这里写图片描述

    实例层次:
    针对单个物体实例而言,通常由于图像采集过程中光照条件、拍摄视角、距离的不同,物体自身的非刚体形变以及其他物体的部分遮挡使得物体实例的表观特征产生很大的变化,给视觉识别算法带来了极大的困难。

    类别层次:
    困难与挑战通常来自三个方面,首先是类内差大,也即属于同一类的物体表观特征差别比较大,其原因有前面提到的各种实例层次的变化,但这里更强调的是类内不同实例的差别,例如图 3(a)所示,同样是椅子,外观却是千差万别,而从语义上来讲,有“坐”的功能的器具都可以称椅子;其次是类间模糊性,即不同类的物体实例具有一定的相似性,如图 3(b)所示,左边的是一只狼,右边的是一只哈士奇,但我们从外观上却很难分开二者;再次是背景的干扰,在实际场景下,物体不可能出现在一个非常干净的背景下,往往相反,背景可能是非常复杂的、对我们感兴趣的物体存在干扰的,这使得识别问题的难度大大加大。
    本文从物体分类与检测问题的基本定义出发,首先从实例、类别、语义三个层次对物体分类与检测研究中存在的困难与挑战进行了阐述。
    接下来,本文以物体检测和分类方面的主流数据库和国际视觉竞赛 PASCAL VOC 竞赛为主线对近年来物体分类与检测算法的发展脉络进行了梳理与总结,指出物体分类与检测算法的主流方法基于表达学习和结构学习。在此基础上,本文对物体分类与检测算法的发展方向进行了思考和讨论,指出了物体检测和物体分类的有机统一,探讨了下一步研究的方向。

    语义层次:
    困难与挑战与图像的视觉语义相关,这个层次的困难往往非常难以处理,特别是对现在的计算机视觉理论水平而言。一个典型的问题称为多重稳定性。如图所示,图 3(c)左边既可以看成是两个面对面的人,也可以看成是一个燃烧的蜡烛;右边则同时可以解释为兔子或者小鸭。同样的图像,不同的解释,这既与人的观察视角、关注点等物理条件有关,也与人的性格、经历等有关,而这恰恰是视觉识别系统难以很好处理的部分。

    这里写图片描述

    这里写图片描述

    物体分类与检测数据库

    数据是视觉识别研究中最重要的因素之一,通常我们更多关注于模型、算法本身,事实上,数据在视觉任务的作用正越来越明显,大数据时代的到来,也使得研究人员开始更加重视数据。在数据足够多的情况下,我们甚至可以使用最简单的模型、算法,比如最近邻分类朴素贝叶斯分类器都能得到很好的效果。鉴于数据对算法的重要性,我们将在本节对视觉研究中物体分类与检测方面的主流数据进行概述,从中也可以一窥目标分类、检测的发展。在介绍不同数据库时,将主要从数据库图像数目、类别数目、每类样本数目、图像大小、分类检测任务难度等方面进行阐述,如表 3 中所示。
    早期物体分类研究集中于一些较为简单的特定任务,如 OCR、形状分类等。OCR 中数字手写识别是一个得到广泛研究的课题,相关数据库中最著名的是 MNIST数据库。MNIST 是一个数字手写识别领域的标准评测数据集,数据库大小是60000,一共包含 10 类阿拉伯数字,每类提供 5000张图像进行训练,1000 张进行测试。MNIST 的图像大小为 28×28,即 784 维,所有图像手写数字,存在较大的形变。形状分类是另一个比较重要的物体分类初期的研究领域,相关数据库有 ETHZ Shape ClassesMPEG-7等。其中 ETHZ ShapeClasses 包含 6 类具有较大差别的形状类别:苹果、商标、瓶子、长颈鹿、杯子、天鹅,整个数据库包含 255 张测试图像。

    CIFAR-10&CIFAR-100 数 据 库 是 Tiny images的两个子集,分别包含了 10 类和 100 类物体类别。这两个数据库的图像尺寸都是 32×32,而且是彩色图像。CIFAR-10 包含 6 万的图像,其中 5 万用于模型训练,1 万用于测试,每一类物体有 5000 张图像用于训练,1000 张图像用于测试。

    CIFAR-100 与 CIFAR-10 组成类似,不同是包含了更多的类别:20 个大类,大类又细分为 100 个小类别,每类包含 600 张图像。CIFAR-10 和 CIFAR-100数据库尺寸较小,但是数据规模相对较大,非常适合复杂模型特别是深度学习模型训练,因而成为深度学习领域主流的物体识别评测数据集。

    Caltech-101是第一个规模较大的一般物体识别标准数据库,除背景类别外,它一共包含了 101类物体,共 9146 张图像,每类中图像数目从 40 到800 不等,图像尺寸也达到 300 左右。Caltech-101是以物体为中心构建的数据库,每张图像基本只包含一个物体实例,且居于图像中间位置,物体尺寸相对图像尺寸比例较大,且变化相对实际场景来说不大,比较容易识别。Caltech-101 每类的图像数目
    差别较大,有些类别只有很少的训练图像,也约束了 可以使 用的训 练集大小 。

    Caltech 256 与Caltech-101 类似,区别是物体类别从 101 类增加到了 256 类,每类包含至少 80 张图像。图像类别的增加,也使得 Caltech-256 上的识别任务更加困难,使其成为检验算法性能与扩展性的新基准。15Scenes 是由 Svetlana Lazebnik 在 FeiFei Li 的13 Scenes 数据库的基础上加入了两个新的场景构成的,一共有 15 个自然场景,4485 张图像,每类大概包含 200 到 400 张图像,图像分辨率约为300 × 250。15 Scenes 数据库主要用于场景分类评测,由于物体分类与场景分类在模型与算法上差别不大,该数据库也在图像分类问题上得到广泛的使用。

    PASCAL VOC 从 2005 年到 2012 年每年发布关于分类、检测、分割等任务的数据库,并在相应数据库上举行了算法竞赛,极大地推动了视觉研究的发展进步。最初 2005 年 PASCAL VOC 数据库只包含人、自行车、摩托车、汽车 4 类,2006 年类别数目增加到 10 类,2007 年开始类别数目固定为 20 类,以后每年只增加部分样本。PASCAL VOC数据库中物体类别均为日常生活常见的物体,如交通工具、室内家具、人、动物等。PASCAL VOC 2007数据库共包含 9963 张图片,图片来源包括 Filker等互联网站点以及其它数据库,每类大概包含96-2008 张图像,均为一般尺寸的自然图像。PASCAL VOC 数据库与 Caltech-101 相比,虽然类别数更少,但由于图像中物体变化极大,每张图像可能包含多个不同类别物体实例,且物体尺度变化很大,因而分类与检测难度都非常大。该数据库的提出,对物体分类与检测的算法提出了极大的挑战,也催生了大批优秀的理论与算法,将物体识别研究推向了一个新的高度。

    随着分类与检测算法的进步,很多算法在以上提到的相关数据库上性能都接近饱和,同时随着大数据时代的到来,硬件技术的发展,也使得在更大规 模 的 数 据 库 进 行 研 究 和 评 测 成 为 必 然 。

    ImageNet是由 FeiFei Li 主持构建的大规模图像数据库,图像类别按照 WordNet 构建,全库截至2013 年共有 1400 万张图像,2.2 万个类别,平均每类包含 1000 张图像。这是目前视觉识别领域最大的有标注的自然图像分辨率的数据集,尽管图像本身基本还是以目标为中心构建的,但是海量的数据和海量的图像类别,使得该数据库上的分类任务依然极具挑战性。除此之外,ImageNet 还构建了一个包含 1000 类物体 120 万图像的子集,并以此作为ImageNet 大尺度视觉识别竞赛的数据平台,逐渐成为物体分类算法评测的标准数据集。

    SUN 数据库的构建是希望给研究人员提供一个覆盖较大场景、位置、人物变化的数据库,库中的场景名是从 WordNet 中的所有场景名称中得来。SUN 数据库包含两个评测集,一个是场景识别数据集,称为 SUN-397,共包含 397 类场景,每类至少包含 100 张图片,总共有 108,754 张图像。另一个评测集为物体检测数据集,称为 SUN2012,包含 16,873 张图像。Tiny images是一个图像规模更大的数据库,共包含 7900 万张 32×32 图像,图像类别数目有 7.5 万,尽管图像分辨率较低,但还是具有较高的区分度,而其绝无仅有的数据规模,使其成为大规模分类、检索算法的研究基础。我们通过分析表 1 可以看到,物体分类的发展过程中,数据库的构建大概可以分为 3 个阶段,经历了一个从简单到复杂,从特殊到一般,从小规模到大规模的跨越。

    早期的手写数字识别 MNIST,形状分类 MPEG-7 等都是研究特定问题中图像分类,之后研究人员开始进行更广泛的一般目标分类与检 测 的 研 究 , 典 型 的 数 据 库 包 括 15 场 景 ,Caltech-101/256, PASCAL VOC 2007 等;随着词包模型等算法的发展与成熟,更大规模的物体分类与检测研究得到了广泛的关注,这一阶段的典型数据库包括 SUN 数据库、ImageNet 以及 Tiny 等。
    近年来,数据库构建中的科学性也受到越来越多的关注,Torralba 等人对数据库的 Bias、泛化性能、价值等问题进行了深入的讨论,提出排除数据库构建过程中的选择偏好,拍摄偏好,负样本集偏好是构造更加接近真实视觉世界的视觉数据库中的关键问题。伴随着视觉处理理论的进步,视觉识别逐渐开始处理更加真实场景的视觉问题,因而对视觉数据库的泛化性、规模等也提出了新的要求和挑战。
    我们也可以发现,物体类别越多,导致类间差越小,分类与检测任务越困难,图像数目、图像尺寸的大小,则直接对算法的可扩展性提出了更高的要求,如何在有限时间内高效地处理海量数据、进行准确的目标分类与检测成为当前研究的热点

    这里写图片描述

    物体分类与检测发展历程

    图像物体识别的研究已经有五十多年的历史。各类理论和算法层出不穷,在这部分,我们对物体分类与检测的发展脉络进行了简单梳理,并将其中里程碑式的工作进行综述。特别的,我们以国际视觉竞赛 PASCAL VOC竞赛为主线对物体分类与检测算法近年来的主要进展进行综述,这个系列的竞赛对物体分类检测的发展影响深远,其工作也代表了当时的最高水平

    物体分类 任务要求回答一张图像中是否包含某种物体,对图像进行特征描述是物体分类的主要研究内容。一般说来,物体分类算法通过手工特征或者特征学习方法对整个图像进行全局描述,然后使用分类器判断是否存在某类物体。

    物体检测 任务则更为复杂,它需要回答一张图像中在什么位置存在一个什么物体,因而除特征表达外,物体结构是物体检测任务不同于物体分类的最重要之处。总的来说,近年来物体分类方法多侧重于学习特征表达,典型的包括词包模型(Bag-of-Words)、深度学习模型;物体检测方法则侧重于结构学习,以形变部件模型为代表。

    这里我们首先以典型的分类检测模型来阐述其一般方法和过程,之后以 PASCAL VOC(包含 ImageNet)竞赛历年来的最好成绩来介绍物体分类和物体检测算法的发展,包括物体分类中的词包模型、深度学习模型以及物体检测中的结构学习模型,并分别对各个部分进行阐述。

    4.1 基于词包模型的物体分类

    从表 2 我们可以发现,词包模型是 VOC 竞赛中物体分类算法的基本框架,几乎所有的参赛算法都是基于词包模型。我们将从底层特征特征编码空间约束分类器设计模型融合几个方面来展开阐述。

    词包模型(Bag-of-Words)最初产生于自然语言处理领域,通过建模文档中单词出现的频率来对文档进行描述与表达。Csurka 等人于 2004 年首次将词包的概念引入计算机视觉领域, 由此开始大量的研究工作集中于词包模型的研究,并逐渐形成了由下面四部分组成的标准目标分类框架:

    1. 底层特征提取

    底层特征是物体分类与检测框架中的第一步,底层特征提取方式有两种:一种是基于兴趣点检测另一种是采用密集提取的方式

    兴趣点检测算法通过某种准则选择具有明确定义的、局部纹理特征比较明显的像素点、边缘、角点、区块等,并且通常能够获得一定的几何不变性,从而可以在较小的开销下得到更有意义的表达,最常用的兴趣点检测算子有 Harris 角点检测子、FAST(Features from Accelerated Segment Test) 算子LoG (Laplacian of Gaussian)DoG (Difference ofGaussian)等。近年来物体分类领域使用更多的则是密集提取的方式,从图像中按固定的步长、尺度提取出大量的局部特征描述,大量的局部描述尽管具有更高的冗余度,但信息更加丰富,后面再使用词包模型进行有效表达后通常可以得到比兴趣点检测 更 好 的 性 能 。
    常 用 的 局 部 特 征 包 括 SIFT(Scale-invariant feature transform,尺度不变特征转换)HOG(Histogram of Oriented Gradient, 方向梯度直方图)LBP(Local Binary Pattern, 局部二值模式) 等。从表 2 可以看出,历年最好的物体分类算法都采用了多种特征采样方式上密集提取与兴趣点检测相结合,底层特征描述也采用了多种特征描述子,这样做的好处是,在底层特征提取阶段,通过提取到大量的冗余特征,最大限度的对图像进行底层描述,防止丢失过多的有用信息,这些底层描述中的冗余信息主要靠后面的特征编码和特征汇聚得到抽象和简并。事实上,近年来得到广泛关注的深度学习理论中一个重要的观点就是手工设计的底层特征描述子作为视觉信息处理的第一步,往往会过早的丢失有用的信息,直接从图像像素学习到任务相关的特征描述是比手工特征更为有效的手段。

    2.特征编码

    密集提取的底层特征中包含了大量的冗余与噪声,为提高特征表达的鲁棒性,需要使用一种特征变换算法对底层特征进行编码,从而获得更具区分性、更加鲁棒的特征表达,这一步对物体识别的性能具有至关重要的作用,因而大量的研究工作都集中在寻找更加强大的特征编码方法,重要的特征编码算法包括向量量化编码、核词典编码、稀疏编码、局部线性约束编码、显著性编码、Fisher 向量编码、超向量编码等。最简单的特征编码是向量量化编码,它的出现甚至比词包模型的提出还要早。向量量化编码是通过一种量化的思想,使用一个较小的特征集合(视觉词典)来对底层特征进行描述,达到特征压缩的目的。向量量化编码只在最近的视觉单词上响应为 1,因而又称为硬量化编码、硬投票编码,这意味着向量量化编码只能对局部特征进行很粗糙的重构。但向量量化编码思想简单、直观,也比较容易高效实现,因而从 2005 年第一届PASCAL VOC 竞赛以来,就得到了广泛的使用
    在实际图像中,图像局部特征常常存在一定的模糊性,即一个局部特征可能和多个视觉单词差别很小,这个时候若使用向量量化编码将只利用距离最近的视觉单词,而忽略了其他相似性很高的视觉单词。为了克服这种 模糊性问题,Gemert 等提出了软量化编码(又称核视觉词典编码)算法,局部特征不再使用一个视觉单词描述,而是由距离最近的 K 个视觉单词加权后进行描述,有效解决了视觉单词的模糊性问题,提高了物体识别的精度。稀疏表达理论近年来在视觉研究领域得到了大量的关注,研究人员最初在生理实验中发现细胞在绝大部分时间内是处于不活动状态,也即在时间轴上细胞的激活信号是稀疏的。稀疏编码通过最小二乘重构加入稀疏约束来实现在一个过完备基上响应的稀疏性
    ℓ 约束是最直接的稀疏约束,但通常很难进行优化,近年来更多使用的是 ℓ 约束,可以更加有效地进行迭代优化,得到稀疏表达。2009 年杨建超等人 将稀疏编码应用到物体分类领域,替代了之前的向量量化编码和软量化编码,得到一个高维的高度稀疏的特征表达,大大提高了特征表达的线性可分性, 仅仅使用线性分类器就得到了当时最好的物体分类结果,将物体分类的研究推向了一个新的高度上。稀疏编码在物体分类上的成功也不难理解,对于一个很大的特征集合(视觉词典),一个物体通常只和其中很少的特征有关,例如,自行车通常和表达车轮、车把等部分的视觉单词密切相关,与飞机机翼、电视机屏幕等关系很小,而行人则通常在头、四肢等对应的视觉单词上有强响应。稀疏编码存在一个问题,即相似的局部特征可能经过稀疏编码后在不同的视觉单词上产生响应,这种变换的不连续性必然会产生编码后特征的不匹配,影响特征的区分性能。
    局部线性约束编码的提出就是为了解决这一问题,它通过加入局部线性约束,在一个局部流形上对底层特征进行编码重构,这样既可以保证得到的特征编码不会有稀疏编码存在的不连续问题,也保持了稀疏编码的特征稀疏性。局部线性约束编码中,局部性是局部线性约束编码中的一个核心思想,通过引入局部性,一定程度上改善了特征编码过程的连续性问题,即距离相近的局部特征在经过编码之后应该依然能够落在一个局部流形上。
    局部线性约束编码可以得到稀疏的特征表达,与稀疏编码不同之处就在于稀疏编码无法保证相近的局部特征编码之后落在相近的局部流形。从表 2 可以看出,2009 年的分类竞赛冠军采用了混合高斯模型聚类和局部坐标编码(局部线性约束编码是其简化版本),仅仅使用线性分类器就取得了非常好的性能。不同于稀疏编码和局部线性约束编码,显著性编码引入了视觉显著性的概念,如果一个局部特征到最近和次近的视觉单词的距离差别很小,则认为这个局部特征是不“显著的”,从而编码后的响应也很小。显著性编码通过这样很简单的编码操作,在 Caltech 101/256, PASCAL VOC 2007 等数据库上取得了非常好的结果,而且由于是解析的结果,编码速度也比稀疏编码快很多。黄等人发现显著性表达配合最大值汇聚在特征编码中有重要的作用,并认为这正是稀疏编码、局部约束线性编码等之所以在图像分类任务上取得成功的原因。
    超向量编码,Fisher 向量编码是近年提出的性能最好的特征编码方法,其基本思想有相似之处,都可以认为是编码局部特征和视觉单词的差。 Fisher 向量编码同时融合了产生式模型和判别式模型的能力,与传统的基于重构的特征编码方法不同,它记录了局部特征与视觉单词之间的一阶差分和二阶差分。超向量编码则直接使用局部特征与最近的视觉单词的差来替换之前简单的硬投票。这种特征编码方式得到的特征向量表达通常是传统基于重构编码方法的M 倍(这里 M 是局部特征的维度)。尽管特征维度要高出很多,超向量编码和 Fisher 向量编码在PASCAL VOC、ImageNet 等极具挑战性、大尺度数据库上获得了最好的性能,并在图像标注、图像分类、图像检索等领域得到应用。
    2011 年 ImageNet分类竞赛冠军采用了超向量编码,2012 年 VOC 竞赛冠军则是采用了向量量化编码和 Fisher 向量编码。

    3.特征汇聚

    空间特征汇聚是特征编码后进行的特征集整合操作,通过对编码后的特征,每一维都取其最大值或者平均值,得到一个紧致的特征向量作为图像的特征表达。这一步得到的图像表达可以获得一定的特征不变性,同时也避免了使用特征集进行图像表达的高额代价。最大值汇聚在绝大部分情况下的性能要优于平均值汇聚,也在物体分类中使用最为广泛。由于图像通常具有极强的空间结构约束,空间金字塔匹配 (Spatial Pyramid Matching, SPM)提出将图像均匀分块,然后每个区块里面单独做特征汇聚操作并将所有特征向量拼接起来作为图像最终的特征表达。空间金字塔匹配的想法非常直观,是金字塔匹配核 (Pyramid Matching Kernel, PMK) 的图像空间对偶,它操作简单而且性能提升明显,因而在当前基于词包模型的图像分类框架中成为标准步骤。实际使用中,在Caltech 101/256 等数据库上通常使用 1×1, 2×2, 4×4的空间分块,因而特征维度是全局汇聚得到的特征向量的 21 倍,在 PASCAL VOC 数据库上,则采用1×1,2×2,3×1 的分块,因而最终特征表达的维度是全局汇聚的8倍。

    4.使用支持向量机等分类器进行分类

    从图像提取到特征表达之后,一张图像可以使用一个固定维度的向量进行描述,接下来就是学习一个分类器对图像进行分类。这个时候可以选择的分类器就很多了,常用的分类器有支持向量机K 近邻神经网络随机森林等。基于最大化边界的支持向量机是使用最为广泛的分类器之一,在图像分类任务上性能很好,特别是使用了核方法的支持向量机。杨建超等人提出了 ScSPM 方法,通过学习过完备的稀疏特征,可以在高维特征空间提高特征的线性可分性,使用线性支持向量机就得到了当时最好的分类结果,大大降低了训练分类器的时间和空间消耗。随着物体分类研究的发展,使用的视觉单词大小不断增大,得到的图像表达维度也不断增加,达到了几十万的量级。这样高的数据维度,相比几万量级的数据样本,都与传统的模式分类问题有了很大的不同。随着处理的数据规模不断增大,基于在线学习的线性分类器成为首选,得到了广泛的关注与应用。

    4.2 深度学习模型

    深度学习模型是另一类物体识别算法,其基本思想是通过有监督或者无监督的方式学习层次化的特征表达,来对物体进行从底层到高层的描述 。 主 流 的 深 度 学 习 模 型 包 括 自 动 编 码 器(Auto-encoder)受限波尔兹曼机(Restricted Boltzmann Machine, RBM)深度信念网络(Deep Belief Nets, DBN)卷积神经网络(Convolutional Neural Netowrks, CNN)生物启发式模型等。

    自动编码器(Auto-encoder)是上世纪 80 年代提出的一种特殊的神经网络结构,并且在数据降维、特征提取等方面得到广泛应用。自动编码器由编码器和解码器组成,编码器将数据输入变换到隐藏层表达,解码器则负责从隐藏层恢复原始输入。隐藏层单元数目通常少于数据输入维度,起着类似“瓶颈”的作用,保持数据中最重要的信息,从而实现数据降维与特征编码。自动编码器是基于特征重构的无监督特征学习单元,加入不同的约束,可以 得 到 不 同 的 变 化 , 包 括 去 噪 自 动 编 码 器(Denoising Autoencoders)、 稀疏 自动编 码器(Sparse Autoencoders)等,在数字手写识别、图像分类等任务上取得了非常好的结果。

    受限玻尔兹曼机是一种无向二分图模型,是一种典型的基于能量的模型(Enery-based Models,EBM)。之所以称为“受限”,是指在可视层和隐藏层之间有连接,而在可视层内部和隐藏层内部不存在连接。受限玻尔兹曼机的这种特殊结构,使得它具有很好的条件独立性,即给定隐藏层单元,可视层单元之间是独立的,反之亦然。这个特性使得它可以实现同时对一层内的单元进行并行 Gibbs 采样。受限玻尔兹曼机通常采用对比散度(Contrastive Divergence,CD算法进行模型学习。受限玻尔兹曼机作为一种无监督的单层特征学习单元,类似于前面提到的特征编码算法,事实上加了稀疏约束的受限玻尔兹曼机可以学到类似稀疏编码那样的Gabor 滤波器模式。

    深度信念网络(DBN)是一种层次化的无向图模型。DBN 的基本单元是 RBM(Restricted Boltzmann Machine),首先先以原始输入为可视层,训练一个单层的RBM,然后固定第一层 RBM 权重,以 RBM 隐藏层单元的响应作为新的可视层,训练下一层的 RBM,以此类推。通过这种贪婪式的无监督训练,可以使整个 DBN 模型得到一个比较好的初始值,然后可以加入标签信息,通过产生式或者判别式方式,对整个网络进行有监督的精调,进一步改善网络性能。DBN 的多层结构,使得它能够学习得到层次化的特征表达,实现自动特征抽象,而无监督预训练过程则极大改善了深度神经网络在数据量不够时严重的局部极值问题。Hinton 等人通过这种方式,成功将其应用于手写数字识别、语音识别、基于内容检索等领域。

    卷积神经网络(CNN)最早出现在上世纪80 年代,最初应用于数字手写识别,取得了一定的成功。然而,由于受硬件的约束,卷积神经网络的高强度计算消耗使得它很难应用到实际尺寸的目标识别任务上。Wisel 和 Hubel 在猫视觉系统研究工作的基础上提出了简单、复杂细胞理论,设计卷积神经网络(CNN)最早出现在上世纪80 年代,最初应用于数字手写识别,取得了一定的成功。然而,由于受硬件的约束,卷积神经网络的高强度计算消耗使得它很难应用到实际尺寸的目标识别任务上。Wisel 和 Hubel 在猫视觉系统研究工作的基础上提出了简单、复杂细胞理论,设计这里我们将最为流行的词包模型与卷积神经网络模型进行对比,发现两者其实是极为相似的。在词包模型中,对底层特征进行特征编码的过程,实际上近似等价于卷积神经网络中的卷积层,而汇聚层所进行的操作也与词包模型中的汇聚操作一样。不同之处在于,词包模型实际上相当于只包含了一个卷积层和一个汇聚层,且模型采用无监督方式进行特征表达学习,而卷积神经网络则包含了更多层的简单、复杂细胞,可以进行更为复杂的特征变换,并且其学习过程是有监督过程,滤波器权重可以根据数据与任务不断进行调整,从而学习到更有意义的特征表达。从这个角度来看,卷积神经网络具有更为强大的特征表达能力,它在图像识别任
    务中的出色性能就很容易解释了。

    下面我们将以 PASCAL VOC 竞赛ImageNet竞赛为主线,来对物体分类的发展进行梳理和分析。2005 年第一届 PASCAL VOC 竞赛数据库包含了 4 类物体:摩托车、自行车、人、汽车, 训练集加验证集一共包含 684 张图像,测试集包含 689 张图像,数据规模相对较小。从方法上来说,词包模型开始在物体分类任务上得到应用,但也存在很多其他的方法,如基于检测的物体分类、自组织网络等。从竞赛结果来看,采用“兴趣点检测-SIFT 底层特征描述-向量量化编码直方图-支持向量机”得到了最好的物体分类性能。对数线性模型和logistic 回归的性能要略差于支持向量机,这也说明了基于最大化边缘准则的支持向量机具有较强的鲁棒性,可以更好得处理物体的尺度、视角、形变等变化。
    2006 年玛丽王后学院的张等人使用词包模型获得了 PASCAL VOC 物体分类竞赛冠军。与以前不同,在底层特征提取上,他们采用了更多的兴趣点检测算法,包括 Harris-Laplace 角点检测和Laplacian 块检测。除此以外,他们还使用了基于固定网格的密集特征提取方式,在多个尺度上进行特征提取。底层特征描述除使用尺度不变的 SIFT 特征外,还使用了 SPIN image 特征。
    词包模型是一个无序的全局直方图描述,没有考虑底层特征的空间信息,张等人采用了 Lazebnik 提出的空间金字塔匹配方法,采用 1×1, 2×2, 3×1 的分块,因而最终特征表达的维度是全局汇聚的 8 倍。另一个与之前不同的地方在于,他们使用了一个两级的支持向量机来进行特征分类,第一级采用卡方核 SVM对空间金字塔匹配得到的各个词包特征表达进行分类,第二级则采用 RBF 核 SVM 对第一级的结果进行再分类。通过采用两级的 SVM 分类,可以将不同的 SPM 通道结果融合起来,起到一定的通道选择作用。2007 年来自 INRIA 的 Marcin Marszałek 等人获得物体分类冠军,他们所用的方法也是词包模型,基本流程与 2006 年的冠军方法类似。不同在于,他们在底层特征描述上使用了更多的底层特征描述子,包括 SIFT, SIFT-hue, PAS edgel histogram等,通过多特征方式最大可能保留图像信息,并通过特征编码和 SVM 分类方式发掘有用信息成为物体分类研究者的共识。另一个重要的改进是提出了扩展的多通道高斯核,采用学习线性距离组合的方式确定不同 SPM 通道的权重, 并利用遗传算法进行优化。
    2008 年阿姆斯特丹大学和萨里大学组成的队伍获得了冠军,其基本方法依然是词包模型。
    有三个比较重要的不同之处,首先是他们提出了彩色描述子来增强模型的光照不变性与判别能力;其次是使用软量化编码替代了向量量化编码,由于在实际图像中,图像局部特征常常存在一定的模糊性,即一个局部特征可能和多个视觉单词相似性差别很小,这个时候使用向量量化编码就只使用了距离最近的视觉单词,而忽略了其他同样很相似的视觉单词。为了克服这种模糊性问题,Gemert提出了软量化编码(又称核视觉词典编码)算法,有效解决了视觉模糊性问题,提高了物体识别的精度。另外,他们还采用谱回归核判别分析得到了比支持向量机更好的分类性能。2009 年物体分类研究更加成熟,冠军队伍不再专注于多底层特征、多分类器融合,而是采用了密集提取的单 SIFT 特征,并使用线性分类器进行模式分类。他们的研究中心放在了特征编码上,采用了混合高斯模型 (Gaussian Mixture Model,GMM)和局部坐标编码(Local Coordinate Coding,LCC)两种特征编码方法对底层 SIFT 特征描述子进行编码,得到了高度非线性的、局部的图像特征表达,通过提高特征的不变性、判别性来改进性能。另外,物体检测结果的融合,也进一步提升了物体分类的识别性能。局部坐标编码提出的“局部性”概念,对物体分类中的特征表达具有重要的意义 , 之 后 出 现 的 局 部 线 性 约 束 编 码(Locality-constrained linear coding,LLC)也是基于局部性的思想,得到了“局部的”、“稀疏的”特征表达,在物体分类任务上取得了很好的结果。
    2010 年冠军依旧以词包模型为基础,并且融合了物体分割与检测算法。一方面通过多底层特征、向量量化编码和空间金字塔匹配得到图像的词包模型描述,另一方面,通过使 Mean shift、过分割、基于图的分割等过分割算法,得到Patch 级的词包特征表达。这两种表达作为视觉特征表达,与检测结果以多核学习的方式进行融合。
    在分类器方面,除使用了 SVM 核回归外,还提出了基于排他上下文的 Lasso 预测算法。所谓排他上下文是指一个排他标签集合中至多只能出现一种类别。排他标签集合的构建使用 Graph Shift 方法,并采用最小重构误差加稀疏约束也即 Lasso 进行预测。排他上下文作为一种不同于一般共生关系的上下文,高置信度预测可以大大抑制同一排他标签集中其他类别的置信度,改善分类性能。
    2011 年冠军延续了 2010 年冠军的基本框架。来自阿姆斯特丹大学的队伍从最显著窗口对于物体分类任务的作用出发,在词包模型基础上进行了新的探索。他们发现单独包含物体的图像区域可以得到比整个图像更好的性能,一旦物体位置确定,上下文信息的作用就很小了。在物体存在较大变化的情况下,部件通常比全局更具有判别性,而在拥挤情况下,成群集合通常要比单个物体更加容易识别。基于此,他们提出了包含物体部件,整个物体,物体集合的最显著窗口框架。检测模型训练使用人工标注窗口,预测使用选择性搜索定位。词包模型和最显著窗口算法融合得到最终的分类结果。
    2012 年冠军延续了 2010 年以来的算法框架,在词包模型表达方面,使用了向量量化编码、局部约束线性编码、Fisher 向量编码替代原来的单一向量量化编码。这里有两个比较重要的改进,一个是广义层次化匹配算法。考虑到传统的空间金字塔匹配算法在物体对齐的假设下才有意义,而这在实际任务中几乎不能满足,为解决这个问题,他们使用 Side 信息得到物体置信图,采用层次化的方式对局部特征进行汇聚,从而得到更好的特征匹配。另一个重要的改进是子类挖掘算法,其提出的主要目的是改进类间模糊与类内分散的问题。
    基本步骤是:
    1)计算样本类内相似度;
    2)计算类间模糊性;
    3)使用 Graph Shift 算法来检测密集子图;
    4)子图向子类的映射。

    这里写图片描述

    相比 PASCAL VOC 竞赛, ImageNet 竞赛的图像数据规模更大,类别数更多,对传统的图像分类、检测算法都是一个大的挑战。下面将近年 ImageNet竞赛的主流算法也做一个简要介绍。2010 年冠军由美国 NEC 研究院和 UIUC 获得,其方法基于词包模型,底层特征采用了密集提取的HOG 和 LBP 特征,特征编码算法使用了局部坐标编码和超向量编码,并且采用了空间金字塔匹配。最终图像的分类采用了基于平均随机梯度下降的大尺度 SVM。相比 PASCAL 竞赛算法,这里的算法更多采用了在计算上极为高效的底层特征和编码算法,分类器及其优化也专门针对大规模数据进行了设计,最终获得了 71.8%的 top 5 分类精度。
    2011 年冠军是施乐欧洲研究中心,其基本方法仍旧是基于词包模型,主要改进在三个方面:
    特征编码方法采用 Fisher 向量编码,可以引入更多的高阶统计信息,得到更具判别性的表达;使用乘积量化(Product Quantization,PQ) 算法进行特征压缩;分类器使用基于随机梯度下降的线性支持向量机
    2012 年加拿大多伦多大学的 Hinton 教授及其学生 Krizhevsky 利用 GPU 在 ImageNet 竞赛上获得了前所未有的成功,他们训练了一个参数规模非常大的卷积神经网络,并通过大量数据生成dropout 来抑制模型的过拟合,在大规模图像分类任务上获得了非常好的效果,取得了第一名的成绩,top 5 分类精度达到了 84.7%,比第二名使用 Fisher向量编码算法要高大约 10 个百分点,充分显示了深度学习模型的表达能力。
    对比 PASCAL 竞赛,ImageNet 竞赛中使用的算法更加简单高效,因而也更加接近实用。在大规模图像识别场景下,传统图像识别的很多算法和技术面临极大的挑战,包括高计算强度,高内存消耗等,多特征、非线性分类器等这些在 PASCAL 竞赛中广为使用的算法和策略无法在 ImageNet 这样规模的数据库上高效实现。在性能和效率的权衡中,逐渐被更为简单高效的算法(单特征、特征压缩、线性分类器等)替代。大数据时代的来临,更激发了数据驱动的深度学习模型的发展,实现了更高效的特征提取与图像分类,将图像分类的发展推向一个新的高度
    这里写图片描述

    4.3 物体检测

    PASCAL VOC 竞赛从 2005 年第一届开始就引入了物体检测任务竞赛,主要任务是给定测试图片预测其中包含的物体类别与外接矩形框。物体检测任务与物体分类任务最重要的不同在于,物体结构信息在物体检测中起着至关重要的作用,而物体分类则更多考虑的是物体或者图像的全局表达。物体检测的输入是包含物体的窗口,而物体分类则是整个图像,就给定窗口而言,物体分类和物体检测在特征提取、特征编码、分类器设计方面很大程度是相通的,如表 3 所示。根据获得窗口位置策略的不同,物体检测方法大致可分为滑动窗口和广义霍夫变换两类方法。滑动窗口方法比较简单,它是通过使用训练好的模板在输入图像的多个尺度上进行滑动扫描,通过确定最大响应位置找到目标物体的外接窗口。广义霍夫投票方法则是通过在参数空间进行累加,根据局部极值获得物体位置的方法,可以用于任意形状的检测和一般物体检测任务。滑动窗口方法由于其简单和有效性,在历年的 PASCAL VOC 竞 赛 中 得 到 了 广 泛 的 使 用 。 特 别 是HOG(Histograms of Oriented Gradients)模型、形变部件模型的出现和发展,使得滑动窗口模型成为主流物体检测方法。
    与物体分类问题不同,物体检测问题从数学上是研究输入图像 X 与输出物体窗口 Y 之间的关系,这里 Y 的取值不再是一个实数,而是一组“结构化”数据,指定了物体的外接窗口和类别,是一个典型的结构化学习问题。结构化支持向量机(Structrual SVM, SSVM) 基于最大化边缘准则,将普通支持向量机推广到能够处理结构化输出,有效扩展了支持向量机的应用范围,可以处理语法树、图等更一般的数据结构,在自然语言处理、机器学习、模式识别、计算机视觉等领域受到越来越多的关注。隐 变 量 支 持 向 量 机 (Latent SVM, LSVM) 是Pedro Felzenszwalb 等人在 2007 年提出用于处理物体检测问题,其基本思想是将物体位置作为隐变量放入支持向量机的目标函数中进行优化,以判别式方法得到最优的物体位置。弱标签结构化支持向量机(weak-label Structrual SVM,WL-SSVM)是一种更加一般的结构化学习框架,它的提出主要是为了处理标签空间和输出空间不一致的问题,对于多个输出符合一个标签的情况,每个样本标签都被认为是“ 弱 标 签 ”。 SSVM 和 LSVM 都 可 以 看 做 是WL-SSVM 的特例,WL-SSVM 通过一定的约简可以转化为一般的 SSVM 和 LSVM。条件随机场(Conditional Random Field, CRF)作为经典的结构化学习算法,在物体检测任务上也得到一定的关注。Schnitzspan 等人将形变部件模型与结构化学习结合,提出了一种隐条件随机场模型(latent CRFs),通过将物体部件标签建模为隐藏节点并且采用 EM算法来进行学习,该算法突破了传统 CRF 需手动给定拓扑结构的缺点,能够自动学习到更为灵活的结构,自动发掘视觉语义上有意义的部件表达。张等提出了基于数据驱动的自动结构建模与学习来从训练数据中学习最为合适的拓扑结构。由于一般化的结构学习是一个 NP 难问题,张提出了混合结构学习方案,将结构约束分成一个弱结构项和强结构项。弱结构项由传统的树状结构模型得到,而强结构项则主要依靠条件随机场以数据驱动方式自动学习得到。

    下面我们将以历年 PASCAL VOC 物体检测竞赛来探讨物体检测的方法演变与发展。

    2005 年物体检测竞赛有 5 支队伍参加,采用的方法呈现多样化,Darmstadt 使用了广义霍夫变换,通过兴趣点检测和直方图特征描述方式进行特征表达,并通过广义 Hough 投票来推断物体尺度与位置,该方法在他们参加的几类中都得到了最好的性能。INRIA 的 Dalal 则采用了滑动窗口模型,底层特征使用了基于 SIFT 的描述,分类器使用支持向量机,通过采用在位置和尺度空间进行穷尽搜索,来确定物体在图像中的尺度和位置,该方法在汽车类别上取得了比广义 Hough 变换更好的性能,但在人、自行车等非刚体类别上性能并不好。
    2006 年最佳物体检测算法是 Dalal 和 Triggs 提出的HOG(Histograms of Oriented Gradients)模型。他们的工作主要集中于鲁棒图像特征描述研究,提出了物体检测领域中具有重要位置的 HOG 特征。HOG 是梯度方向直方图特征,通过将图像划分成小的 Cell,在每个 Cell 内部进行梯度方向统计得到直方图描述。与 SIFT 特征相比,HOG 特征不具有尺度不变性,但计算速度要快得多。整体检测框架依然是滑动窗口策略为基础,并且使用线性分类器进行分类。这个模型本质上是一个全局刚性模板模型,需要对整个物体进行全局匹配,对物体形变不能很好地匹配处理。
    2007 年 Pedro Felzenszwalb 等人提出了物体检测领域里程碑式的工作:形变部件模型(Deformable Part-based Model),并以此取得了 2007 年 PASCAL VOC 物体检测竞赛的冠军。底层特征采用了Dalal 和 Triggs 提出的 HOG 特征,但与 Dalal 等人的全局刚体模板模型不同的是,形变部件模型由一个根模型和若干可形变部件组成。另一个重要的改进是提出了隐支持向量机模型,通过隐变量来建模物体部件的空间配置,并使用判别式方法进行训练优化。形变部件模型奠定了当今物体检测算法研究的基础,也成为后续 PASCAL VOC 竞赛物体检测任务的基础框架。
    2008 年物体检测冠军同样采用了滑动窗口方式。特征表达利用了 HOG 特征和基于密集提取SIFT 的词包模型表达。训练过程对前、后、左、右分别训练独立的模型,并使用线性分类器和卡方核SVM 进行分类。测试过程采用了两阶段算法,第一阶段通过滑动窗口方式利用分类器得到大量可能出现物体的位置,第二阶段基于 HOG 和 SIFT 特征对前面一阶段得到的检测进行打分,最后使用非极大抑制算法去除错误检测窗口,并融合分类结果得到最终检测结果。这里分类信息可以看成是一种上下文信息,这个也是物体检测研究的一个重要内容。
    2009 年除了形变部件模型以外,牛津大学视觉几何研究组在滑动窗口框架下,基于多核学习将灰度 PHOW、颜色 PHOW、PHOC、对称 PHOG、SSIM、视觉词典等多种特征进行融合,取得了与形变部件模型相近的效果,获得共同检测冠军。多核学习是进行多特征、多模型融合的重要策略,可以自动学习多个核矩阵的权重,从而得到最佳的模型融合效果。考虑到滑动窗口搜索的效率问题,提出了
    类似级联 Adaboost 方式的多级分类器结构。第一级分类器采用线性 SVM 分类器以滑动窗口或者跳跃窗口方式快速对图像窗口进行粗分类;第二级采用拟线性 SVM,利用卡方核进行进一步细分类;第三级采用更强的非线性卡方-RBF 分类器,这一步准确度更高但比前面步骤计算代价更大,由于前面两级已经快速滤除大部分备选窗口,这一级可以专注于更难的样本分类。
    2010 年中国科学院自动化研究所模式识别国家重点实验室获得了物体检测冠军,其方法是以形变部件模型为基础,对底层 HOG 特征进行了改进,提出了 Boosted HOG-LBP 特征,利用Gentle Boost 选择出一部分 LBP 特征与 HOG 特征融合,使得物体检测结果产生显著提升。另一个重要改进是采用了多种形状上下文,包括空间上下文、全局上下文、类间上下文。空间上下文由包含了窗口位置尺度信息的 6 维向量构成,全局上下文包括 20 维的物体分类分数和 20 维的最大窗口分数,其中分类方法采用了黄等人提出的显著性编码、词典关系算法计算词包模型表达。类间上下文用于建模相邻物体之间的弱空间关系,分别由20 维的窗口附近最强的 HOG 特征分数和 LBP 特征分数构成。最终得到 87 维的特征,使用 RBF SVM进行上下文学习。该方法在 VOC2010 数据库上取得了 6 项第一,5 项第二,平均精度达到了 36.8%。
    2011 年物体检测冠军依然是中国科学院自动化研究所模式识别国家重点实验室,算法上与2010 年不同之处是针对形变部件模型提出了一种数据分解算法,并引入了空间混合建模和上下文学习。
    2012 年阿姆斯特丹大学获得物体检测冠军,其方法主要创新在于选择性搜索、混合特征编码、新的颜色描述子、再训练过程。图像中物体本身构成一种层次结构,通常很难在一个尺度上检测所有物体,因而对图像块进行层次化组织,在每个层次上进行选择搜索,可以有效提升检测的召回率。考虑到经典的向量量化编码使用小的特征空间分块能够捕获更多图像细节,而丢失了分块内部的细节,而超向量编码和 Fisher 向量量化编码等差异编码方法则可以很好的描述分块内部细节,更大空间分块可以描述更大范围的图像细节,综合这两种编码模式,提出了混合特征编码算法,将两种编码的优点融合到一起。

    5 对物体分类与检测的思考

    物体分类与检测的研究在以 PASCAL VOC 竞赛为平台的理论和算法研究上已经取得了一系列的进展,分类模型建立了以词包模型和深度学习模型为基础的体系框架检测模型则以可形变模型为核心发展出多种方法。在分析目前物体分类和检测算法的基础上,本文接下来对物体分类和检测算法的统一性和差异性进行了讨论,并探讨了物体分类与检测算法发展的方向。

    5.1 物体检测和物体分类的统一性

    – 物体检测可以取代物体分类?

    物体检测的任务是解决物体所在的位置问题,物体分类的任务是判断物体的种类,从直观上而言,物体检测的隐含信息包括了物体的类别信息,也就是需要事先知道需要定位的物体的类别信息,比如需要检测人,那么就需要先验的给出人的标注信息,以此来判断人的位置,从这个角度而言,物体检测似乎包括了物体分类的步骤,也就是物体检测就能够回答“什么物体在什么地方”,但这里有一个误区,其中的“什么物体”是先验给出的,也就是在训练过程中标注出的,并不一定是真实的结果。在模型区分性比较强的情况下,也就是物体检测能给出准确的结果的情况下,物体检测在一定程度上可以回答“什么物体在什么地方”,但在真实的世界中,很多情况下模版不能唯一的反映出物体类别的唯一性,只能给出“可能有什么物体在什么地方”,此时物体分类的介入就很有必要了。由此可见,物体检测是不能替代物体分类的。

    – 物体检测和物体分类之间的差异性和互补性

    以 PASCAL VOC 竞赛为例,从模型的角度而言,物体检测主要采用的是可变的部件模型, 更多的关注局部特征,物体分类中主要的模型是词包模型,从两者的处理流程来看,他们利用的信息是不同的,物体检测更多的是利用了物体自身的信息,也就是局部信息,物体分类更多的是利用了图像的信息,也就是全局的信息。他们各有优劣,局部信息考虑了更多的物体结构信息,这使得物体检测和分类的准确性更高,但同时也带来物体分类的鲁棒性不强的问题;全局信息考虑了更多的是图像的全局统计信息,尤其是图像的语义信息,这使得能考虑更多的信息来进行判断,但信息量的增加可能带来准确度的提高,也可能由于冗余降低分类的性能,但是从统计意义而言,其鲁棒性是能够得到一定的提高的。由此可见,物体检测和物体分类之间存在着较大的差异性,同时也就说明存在着比较大的互补性。

    5.2 物体分类与检测的发展方向

    物体分类任务要确定图像中是否包含物体,全局表达更关键物体检测任务则要确定图像中物体的位置和尺度,物体结构更为关键。因此,物体分类检测的研究也主要有两种思路:

    专注于学习结构,即结构化学习。观察变量与其他变量构成结构化的图模型,通过学习得到各个变量之间的关系,结构包括有向图模型(贝叶斯网络)、无向图模型(马尔科夫网络)。结构化学习通常变量具有显式的物理意义,变量之间的连接也具有较强的因果关系,解释性较好。

    专注于学习层次化表达,即深度学习。深度学习从人脑的层次化视觉处理和函数表达理论出发,采用层次化特征表达的思想来进行特征从底层到高层语义的提取。深度学习专注于表达的学习,也即更注重一个输入得到的相应输出,对中间的特征变换缺少自然的解释,更像一个黑盒系统。
    两条思路各有侧重,但并不是说是互相独立的。在这两条发展线路的基础上,建立更为统一的物体识别框架,同时处理物体分类与检测任务,也是一个重要的研究课题。如何利用物体检测和物体分类之间的互补性去构建统一的物体识别框架是计算机视觉和视觉认知领域的研究热点,也是视觉认知计算模型研究的重点之一。

    5.3 结构化学习存在的难点与挑战

    模型表达问题。对于一个特定问题,选择什么样的模型,如有向图模型、无向图模型,模型如何进行参数化,都是值得研究的。

    模型学习问题。在给定模型表达后,如何从给定数据中学习模型的参数,是结构化学习中的一个核心问题。目前通常有基于概率的学习方法,如最大似然估计、最大后验估计等,也有基于最小化损失函数的方法。不同的方法,在学习的效率,准确性上都具有差异,研究快速有效的学习算法,具有特别重要的价值。

    模型推断问题。给定学习好的模型,进行快速、准确的模型推断是至关重要的。目前经典的方法包括消息传播算法、变分推断算法、采样算法等。不同方法在速度、准确度上各有差异。研究大规模图模型,实现人类视觉系统快速识别人脸那样的快速准确推断,是一个重要研究方向。

    5.4 层次化学习 (深度学习) 存在的难点与挑战

    在大数据时代,海量的图像、视频数据绝大多数是没有标签的,大量进行标注也是不现实的。从大量的没有标签的图像数据中自动挖掘知识,无疑有着重要的意义。Google Brain 计划也验证了数据驱动的自主学习的可行性与有效性。但目前深度学习还存在一些难点和挑战。

    •解释性差。层次化表达在视觉皮层理论和函数论等方面具有其理论依据,然而,在实际应用中,学习到的模型通常没有很好的解释性。第一层网络可以通过可视化的方式进行直接查看,在大多数视觉数据中,第一层学习到的是类似 Gabor的滤波器,可以实现基本的边缘检测。然而,对于更高层的特征,通常很难直观的查看其学习到的是什么。研究有效的高层特征解释方式,无疑对于深度学习的发展具有非常重要的意义。

    •模型复杂度高,优化困难。神经网络的容量没有上限,表达能力非常强,这是它的一个重要的优点。另一方面也对模型的优化造成了非常大的困难。网络越复杂,模型的能量面越高低崎岖,到处是极小点。研究模型初始化方式、优化算法,对于提高神经网络的判别能力,是深度学习的一个重要研究内容。

    • 计算强度高。目前虽然每层是高度并行化的前馈网络,但是计算强度还是比较高,需要采用GPU 等硬件来完成。对于一个刺激信号,人脑中绝大多数细胞是处于不活动状态,只有相关的细胞才会有活动,这是一种非常经济的响应形式。而对于深度学习,输入一个视觉信号,所有的神经元都会进行计算,人为加的一些稀疏约束只是会使某些神经元输出为 0,但不代表该神经元“处于不活动”状态。这方面是将来建立庞大学习网络时实现实时推理的一个可行思路。

    • 模型缺少结构约束。深度学习模型通常只对网络的“ 输入–输出”进行建模,却缺少必要的结构先验的约束。例如,对人脸关键点可以采用卷积神经网络进行回归,网络学习到的是一种隐式的“输入–输出”结构,却完全没有加入显式的结构先验,包括预测输出的位置点处的表观特征。这个问题的直接后果就是单个网络尽管可以做到任意的复杂度,却无法得到很高的精度,很多检测错误看起来是非常简单的:本来应该落在具有明显特征的嘴角处,却落在了嘴角旁边的脸部区域。为了克服这个问题,就需要采用从粗到细,从全局到局部的策略,级联多个网络来不断纠正网络预测。在大数据时代,海量视频数据所带来的纷繁复杂的易变性(variability)将给传统的特征学习方法带来巨大挑战。而深度学习模型天然的强大数据表达能力,无疑将会对大数据背景下的整个视觉的研究产生极大的影响,也必然会将图像物体检测、分类的研究推向新的高度。当然,目前深度学习模型还存在着解释性差、模型复杂度高,优化困难、计算强度高等诸多问题,这些都需要研究者们进一步的思考。例如,将显式结构先验嵌入深度学习模型中,可以有效降低网络参数空间的规模,减少局部极值的问题,从而可以更加有效地解决检测、分割等任务。

    6.结论

    物体分类与检测在计算机视觉研究中具有重要的理论意义和实际应用价值,同时目前也存在诸多困难与挑战。本文以计算机视觉目标识别竞赛PASCAL VOC 为主线,对物体分类与检测历年最佳算法的发展进行了详尽的阐述,强调了表达学习和结构学习分别在物体分类和物体检测中的重要意义。以此为基础,本文还讨论了物体分类与检测的统一性与差异性,对物体分类与检测的发展方向进一步思考,从基于深度学习的表达学习和结构学习两个方向进行了分析与展望。

    (完)

    文档下载地址:中国知网
    http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CJFQ&dbname=CJFD2014&filename=JSJX201406001&v=MjkzMjhZK1p1Rnlyblc3M0pMejdCZHJHNEg5WE1xWTlGWllSOGVYMUx1eFlTN0RoMVQzcVRyV00xRnJDVVJMMmY=



    展开全文
  • Python图像处理PIL各模块详细介绍

    万次阅读 多人点赞 2018-01-23 09:13:30
    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。 open类 Image.open(file) ⇒ image Image.open(file, mode) ⇒ image...

    Image模块

    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如opensaveconvershow…等功能。

    open类

    Image.open(file) ⇒ image
    Image.open(file, mode) ⇒ image

    要从文件加载图像,使用 open() 函数, 在 Image 模块:

        @zhangziju
        from PIL import Image             ##调用库
        im = Image.open("E:\mywife.jpg")  ##文件存在的路径
        im.show()                         

    我老婆

    需要知道的是在win的环境下im.show的方式为win自带的图像显示应用。打开并确认给定的图像文件。这个是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从文件读取(调用load()方法将强行加载图像数据)。如果变量mode被设置,那必须是“r”。用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。文件对象必须实现read(),seek()和tell()方法,并且以二进制模式打开。

    Save类

    im.save(outfile,options…)
    im.save(outfile, format, options…)

    若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。关键字options为文件编写器提供一些额外的指令。如果编写器不能识别某个选项,它将忽略它。用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,且其以二进制模式打开。如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im)
    im.save("E:\mywife.png")     ## 将"E:\mywife.jpg"保存为"E:\mywife.png"
    im = Image.open("E:\mywife.png")  ##打开新的png图片
    print(im.format, im.size, im.mode)

    这里写图片描述
    如下图,在指定路径下可看到新保存的png格式的图片。
    新的png图片

    format类

    im.format ⇒ string or None

    这个属性标识了图像来源,如果图像不是从文件读取它的值就是None。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.format) ## 打印出格式信息
    im.show()

    如下图可以看到其format为”JPEG”。

    format

    Mode类

    im.mode ⇒ string

    图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的nodes描述:

    modes 描述
    1 1位像素,黑和白,存成8位的像素
    L 8位像素,黑白
    P 8位像素,使用调色板映射到任何其他模式
    RGB 3× 8位像素,真彩
    RGBA 4×8位像素,真彩+透明通道
    CMYK 4×8位像素,颜色隔离
    YCbCr 3×8位像素,彩色视频格式
    I 32位整型像素
    F 32位浮点型像素
    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.mode) ## 打印出模式信息
    im.show()

    如下图为图片的mode为“RGB”模式。

    mode

    convert类

    im.convert(mode)⇒ image

    将当前图像转换为其他模式,并且返回新的图像。当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。当从一个颜色图像转换为黑白图像时,PIL库使用ITU-R601-2 luma转换公式:

    L = R * 299/1000 + G * 587/1000 + B * 114/1000

    当转换为2位图像(模式“1”)时,源图像首先被转换为黑白图像。结果数据中大于127的值被设置为白色,其他的设置为黑色;这样图像会出现抖动。如果要使用其他阈值,更改阈值127,可以使用方法point()。为了去掉图像抖动现象,可以使用dither选项。

    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    new_im.show()

    如下,将图像转换为“P”模式。

    这里写图片描述
    对比原始图像。

    这里写图片描述

    im.convert(“P”,**options) ⇒ image

    这个与第一个方法定义一样,但是当“RGB”图像转换为8位调色板图像时能更好的处理。可供选择的选项为:

    Dither=. 控制颜色抖动。默认是FLOYDSTEINBERG,与邻近的像素一起承担错误。不使能该功能,则赋值为NONE。

    Palette=. 控制调色板的产生。默认是WEB,这是标准的216色的“web palette”。要使用优化的调色板,则赋值为ADAPTIVE。

    Colors=. 当选项palette为ADAPTIVE时,控制用于调色板的颜色数目。默认是最大值,即256种颜色

    im.convert(mode,matrix) ⇒ image

    使用转换矩阵将一个“RGB”图像转换为“L”或者“RGB”图像。变量matrix为4或者16元组。

    
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.mode)
    rgb2xyz = (0.412453,0.357580, 0.180423, 0,
               0.212671,0.715160, 0.072169, 0,
               0.019334,0.119193, 0.950227, 0 )
    new_im = im.convert("L", rgb2xyz)
    print(new_im.mode)
    new_im.show()

    这里写图片描述
    转换后效果

    这里写图片描述

    Size类

    im.size ⇒ (width, height)

    图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size) ## 打印出尺寸信息
    im.show()

    如下图所示为图片的尺寸信息,750*560。

    这里写图片描述

    Palette类

    im.palette ⇒ palette or None

    颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。
    如下为对非“P”模式下的图像进行palette信息显示。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.palette)

    易知,返回值为空,none

    这里写图片描述
    对图像进行convert操作,转换成“P”模式

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    print(new_im.palette)

    则返回值为ImagePalette类的实例。如下:

    这里写图片描述

    Info类

    im.info ⇒ dictionary

    存储图像相关数据的字典。文件句柄使用该字典传递从文件中读取的各种非图像信息。大多数方法在返回新的图像时都会忽略这个字典;因为字典中的键并非标准化的,对于一个方法,它不能知道自己的操作如何影响这个字典。如果用户需要这些信息,需要在方法open()返回时保存这个字典。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.info)

    这里写图片描述

    new类

    Image.new(mode,size) ⇒ image
    Image.new(mode, size,color) ⇒ image

    使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。在版本1.1.4及其之后,用户也可以用颜色的名称,比如给变量color赋值为“red”。如果没有对变量color赋值,图像内容将会被全部赋值为0(为黑色)。如果变量color是空,图像将不会被初始化,即图像的内容全为0。这对向该图像复制或绘制某些内容是有用的。

    如下为将图像设置为128x128大小的红色图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128), "#FF0000")
    n_im.show()

    显示效果如下:

    这里写图片描述
    如下图像为128x128大小的黑色图像,因为变量color不赋值的话,图像内容被设置为0,即黑色。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128))
    n_im.show()

    黑
    图像为128x128大小的绿色图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128),"green")
    n_im.show()

    这里写图片描述

    Copy类

    im.copy() ⇒ image

    拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。

    
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im_copy = im.copy()

    图像im_copy和im完全一样。

    Crop类

    im.crop(box) ⇒ image

    从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,截取一个100*100(像素为单位)的图像,为方便理解,如下为示意图box(b1,a1,b2,a2)。作图软件为Visio2016。这是一个懒操作。对源图像的改变可能或者可能不体现在裁减下来的图像中。为了获取一个分离的拷贝,对裁剪的拷贝调用方法load()。

    box区域示意图

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box = (300, 100, 700, 700)              ##确定拷贝区域大小
    region = im.crop(box)                   ##将im表示的图片对象拷贝到region中,大小为box
    region.show()

    如下图为box截取的图像区域显示。

    box区域图

    Paste类

    im.paste(image,box)

    将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box=[0,0,100,100]
    im_crop = im.crop(box)
    print(im_crop.size,im_crop.mode)
    im.paste(im_crop, (100,100))             ##(100,100,0,0)
    im.paste(im_crop, (400,400,500,500))
    im.show()

    如下图为paste操作:

    这里写图片描述

    Filter类

    im.filter(filter) ⇒ image

    返回一个使用给定滤波器处理过的图像的拷贝。具体参考图像滤波在ImageFilter 模块的应用,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。

    @zhangziju
    from PIL import Image
    from PIL import ImageFilter                         ## 调取ImageFilter
    imgF = Image.open("E:\mywife.jpg")
    bluF = imgF.filter(ImageFilter.BLUR)                ##均值滤波
    conF = imgF.filter(ImageFilter.CONTOUR)             ##找轮廓
    edgeF = imgF.filter(ImageFilter.FIND_EDGES)         ##边缘检测
    imgF.show()
    bluF.show()
    conF.show()
    edgeF.show()

    滤波处理下的gakki~

    滤波

    Blend类

    Image.blend(image1,image2, alpha) ⇒ image

    使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。

    合成公式为:out = image1 (1.0 - alpha) + image2 alpha

    若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值无限制。

    @zhangziju
    from PIL import Image
    im1 = Image.open("E:\mywife.jpg")
    im2 = Image.open("E:\mywife2.jpg")
    print(im1.mode,im1.size)
    print(im2.mode,im2.size)
    im = Image.blend(im1, im2, 0.2)
    im.show()

    需保证两张图像的模式和大小是一致的,如下为显示im1和im2的具体信息。

    这里写图片描述
    im1和im2按照第一张80%的透明度,第二张20%的透明度,合成为一张。
    这里写图片描述

    Split

    im.split() ⇒ sequence

    返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。

    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r,g,b = im.split()
    print(r.mode)
    print(r.size)
    print(im.size)

    这里写图片描述

    Composite类

    Image.composite(image1,image2, mask) ⇒ image

    复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。

    @zhangziju
    from PIL import Image
    im1 = Image.open("E:\mywife.jpg")
    im2 = Image.open("E:\mywife2.jpg")
    r,g,b = im1.split()             ##分离出r,g,b
    print(b.mode)
    print(im1.mode,im1.size)
    print(im2.mode,im2.size)
    im = Image.composite(im1,im2,b)
    im.show()

    b.mode为”L”,两图尺寸一致。

    这里写图片描述
    最终效果

    这里写图片描述

    Eval类

    Image.eval(image,function) ⇒ image

    使用变量function对应的函数(该函数应该有一个参数)处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    def fun01(x):
        return x*0.3
    def fun02(y):
        return y*2.0
    im1_eval = Image.eval(im, fun01)
    im2_eval = Image.eval(im, fun02)
    im1_eval.show()
    im2_eval.show()
    

    在函数fun01和fun02下的图像显示。

    这里写图片描述

    Merge类

    Image.merge(mode,bands) ⇒ image

    合并类使用一些单通道图像,创建一个新的图像。变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
    变量mode与变量bands的关系:

    len(ImageMode.getmode(mode).bands)= len(bands)

    @zhangziju
    from PIL import Image
    im1 = Image.open("E:\mywife.jpg")
    im2 = Image.open("E:\mywife2.jpg")
    r1,g1,b1 = im1.split()
    r2,g2,b2 = im2.split()
    print(r1.mode,r1.size,g1.mode,g1.size)
    print(r2.mode,r2.size,g2.mode,g2.size)
    new_im=[r1,g2,b2]
    print(len(new_im))
    im_merge = Image.merge("RGB",new_im)
    im_merge.show()

    打印信息显示

    这里写图片描述
    merge操作

    这里写图片描述

    Draft类

    im.draft(mode,size)

    配置图像文件加载器,使得返回一个与给定的模式和尺寸尽可能匹配的图像的版本。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size,im.mode)
    new_im = im.draft("L", (200,200))
    print(new_im.size,new_im.mode)
    new_im.show()

    关键信息显示

    这里写图片描述
    转换效果

    这里写图片描述

    Getbands类

    im.getbands()⇒ tuple of strings

    返回包括每个通道名称的元组。例如,对于RGB图像将返回(“R”,“G”,“B”)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getbands())
    

    这里写图片描述

    Getbbox类

    im.getbbox() ⇒ 4-tuple or None

    计算图像非零区域的包围盒。这个包围盒是一个4元组,定义了左、上、右和下像素坐标。如果图像是空的,这个方法将返回空。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getbbox())

    这里写图片描述

    Getdata类

    im.getdata() ⇒ sequence

    以包含像素值的sequence对象形式返回图像的内容。这个sequence对象是扁平的,以便第一行的值直接跟在第零行的值后面,等等。这个方法返回的sequence对象是PIL内部数据类型,它只支持某些sequence操作,包括迭代和基础sequence访问。使用list(im.getdata()),将它转换为普通的sequence。Sequence对象的每一个元素对应一个像素点的R、G和B三个值。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    sequ = im.getdata()
    sequ0 = list(sequ)
    print(sequ0[0])
    print(sequ0[1])
    print(sequ0[2])

    可视化显示sequence0里面的数据。

    这里写图片描述
    打印显示结果,与前面对比。

    这里写图片描述

    Getextrema类

    im.getextrema() ⇒ 2-tuple

    返回一个2元组,包括该图像中的最小和最大值。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getextrema())

    该方法返回了R/G/B三个通道的最小和最大值的2元组。

    这里写图片描述

    Getpixel类

    im.getpixel(xy) ⇒ value or tuple

    返回给定位置的像素值。如果图像为多通道,则返回一个元组。该方法执行比较慢;如果用户需要使用python处理图像中较大部分数据,可以使用像素访问对象(见load),或者方法getdata()。

    @zahngziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getpixel((0,0)))
    print(im.getpixel((4,0)))
    r,g,b = im.split()
    print(b.getpixel((11,8)))   

    这里写图片描述

    Histogram类

    im.histogram()⇒ list

    返回一个图像的直方图。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来(例如,“RGB”图像的直方图有768个值)。二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    imhis = im.histogram()
    print(len(imhis))
    print(imhis[0])
    print(imhis[150])
    print(imhis[300])

    这里写图片描述

    im.histogram(mask)⇒ list

    返回图像中模板图像非零地方的直方图。模板图像与处理图像的尺寸必须相同,并且要么是二值图像(模式为“1”),要么为灰度图像(模式为“L”)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r,g,b = im.split()
    imhis = im.histogram()
    print(r.mode)
    print(len(imhis))
    print(imhis[0])
    print(imhis[150])
    print(imhis[300])

    这里写图片描述

    Load类

    im.load()

    为图像分配内存并从文件中加载它(或者从源图像,对于懒操作)。正常情况下,用户不需要调用这个方法,因为在第一次访问图像时,Image类会自动地加载打开的图像。在1.1.6及以后的版本,方法load()返回一个用于读取和修改像素的像素访问对象。这个访问对象像一个二维队列,如:

    pix = im.load()
    print pix[x, y]
    pix[x, y] =value

    通过这个对象访问比方法getpixel()和putpixel()快很多。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    pix = im.load()
    print(pix[0,2])

    这里写图片描述

    im.paste(colour,box)

    使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.paste((256,256,0),(0,0,100,100))  ##(256,256,0)表示黄色
    im.show()

    这里写图片描述

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.paste("blue",(0,0,100,100))   ##或者“blue”
    im.show()

    这里写图片描述

    im.paste(image,box, mask)

    使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合,如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box=[300,300,400,400]
    im_crop =im.crop(box)
    r,g,b =im_crop.split()
    im.paste(im_crop, (200,200,300,300), r)
    im.show()

    这里写图片描述

    Putdata类

    im.putdata(data)
    im.putdata(data, scale, offset)

    从sequence对象中拷贝数据到当前图像,从图像的左上角(0,0)位置开始。变量scale和offset用来调整sequence中的值:

    pixel = value*scale + offset

    如果变量scale忽略,则默认为1.0。如果变量offset忽略,则默认为0.0。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r, g, b = im.split()
    print(
    r.getpixel((0, 0)),
    r.getpixel((1, 0)),
    r.getpixel((2, 0)),
    r.getpixel((3, 0)),
    r.putdata([1, 2, 3, 4]),
    r.getpixel((0, 0)),
    r.getpixel((1, 0)),
    r.getpixel((2, 0)),
    r.getpixel((3, 0)),
    )

    这里写图片描述

    Resize类

    im.resize(size) ⇒ image
    im.resize(size, filter) ⇒ image

    返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    region = im.resize((400, 400))     ##重新设定大小
    region.show()

    很明显由于大小的重新设定,图片的显示效果有所转变,gakki依然美腻~
    设定大小

    Rotate类

    im.rotate(angle) ⇒ image
    im.rotate(angle,filter=NEAREST, expand=0) ⇒ image

    返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。变量filter是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im_45 = im.rotate(45)
    im_30 = im.rotate(30, Image.NEAREST,1)
    print(im_45.size,im_30.size)
    im_45.show()
    im_30.show()

    这里写图片描述

    这里写图片描述

    Seek类

    im.seek(frame)

    在给定的文件序列中查找指定的帧。如果查找超越了序列的末尾,则产生一个EOFError异常。当文件序列被打开时,PIL库自动指定到第0帧上。

    @zhangziju
    from PIL import Image
    im_gif = Image.open("E:\mywife.gif")
    print(im_gif.mode)
    im_gif.show()    ##第0帧
    im_gif.seek(3)
    im_gif.show()
    im_gif.seek(9)
    im_gif.show()

    来来来~这是gakki原图欣赏下~

    这里写图片描述
    查找帧seek()的效果如下:

    这里写图片描述

    Tell类

    im.tell() ⇒ integer

    返回当前帧所处位置,从0开始计算。

    @zhangziju
    from PIL import Image
    im_gif = Image.open("E:\mywife.gif")
    print(im_gif.tell())
    im_gif.seek(8)
    print(im_gif.tell())

    这里写图片描述

    Thumbnail类

    im.thumbnail(size)
    im.thumbnail(size, filter)

    修改当前图像,使其包含一个自身的缩略图,该缩略图尺寸不大于给定的尺寸。这个方法会计算一个合适的缩略图尺寸,使其符合当前图像的宽高比,调用方法draft()配置文件读取器,最后改变图像的尺寸。变量filter应该是NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果省略该变量,则默认为NEAREST。注意:在当前PIL的版本中,滤波器bilinear和bicubic不能很好地适应缩略图产生。用户应该使用ANTIALIAS,图像质量最好。如果处理速度比图像质量更重要,可以选用其他滤波器。这个方法在原图上进行修改。如果用户不想修改原图,可以使用方法copy()拷贝一个图像。这个方法返回空。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.thumbnail((100,100))

    Transform类

    im.transform(size,method, data) ⇒ image
    im.transform(size, method, data, filter) ⇒ image

    使用给定的尺寸生成一张新的图像,与原图有相同的模式,使用给定的转换方式将原图数据拷贝到新的图像中。在当前的PIL版本中,参数method为EXTENT(裁剪出一个矩形区域),AFFINE(仿射变换),QUAD(将正方形转换为矩形),MESH(一个操作映射多个正方形)或者PERSPECTIVE。变量filter定义了对原始图像中像素的滤波器。在当前的版本中,变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.EXTENT, (0, 0, 500, 500))
    print(imtra.size)
    imtra.show()

    这里写图片描述

    这里写图片描述

    im.transform(size,EXTENT, data) ⇒ image
    im.transform(size, EXTENT, data, filter) ⇒ image

    从图像中裁剪一个区域。变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。输出图像为这两个坐标点之间像素的采样结果。例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。这个方法可以用于在当前图像中裁剪,放大,缩小或者镜像一个任意的长方形。它比方法crop()稍慢,但是与resize操作一样快。

    im.transform(size, AFFINE, data) ⇒ image
    im.transform(size, AFFINE,data, filter) ⇒ image

    对当前的图像进行仿射变换,变换结果体现在给定尺寸的新图像中。变量data是一个6元组(a,b,c,d,e,f),包含一个仿射变换矩阵的第一个两行。输出图像中的每一个像素(x,y),新值由输入图像的位置(ax+by+c, dx+ey+f)的像素产生,使用最接近的像素进行近似。这个方法用于原始图像的缩放、转换、旋转和裁剪。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.AFFINE, (1,2,3,2,1,4))
    print(imtra.size)
    imtra.show()

    这里写图片描述
    这里写图片描述

    im.transform(size,QUAD, data) ⇒ image
    im.transform(size, QUAD, data, filter) ⇒ image

    输入图像的一个四边形(通过四个角定义的区域)映射到给定尺寸的长方形。变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.QUAD, (0,0,0,500,600,500,600,0))
    print(imtra.size)
    imtra.show()

    这里写图片描述
    这里写图片描述

    im.transform(size,PERSPECTIVE, data) ⇒ image
    im.transform(size, PERSPECTIVE, data, filter) ⇒ image

    对当前图像进行透视变换,产生给定尺寸的新图像。变量data是一个8元组(a,b,c,d,e,f,g,h),包括一个透视变换的系数。对于输出图像中的每个像素点,新的值来自于输入图像的位置的(a x + b y + c)/(g x + h y + 1), (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素进行近似。这个方法用于原始图像的2D透视。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.PERSPECTIVE, (1,2,3,2,1,6,1,2))
    print(imtra.size)
    imtra.show()

    这里写图片描述
    wocao!!!gakki不见了!!!

    这里写图片描述

    Transpose类

    im.transpose(method)⇒ image

    返回当前图像的翻转或者旋转的拷贝。变量method的取值为:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或ROTATE_270。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.rotate(45)                             #逆时针旋转 45 度角。
    im.transpose(Image.FLIP_LEFT_RIGHT)       #左右对换。
    im.transpose(Image.FLIP_TOP_BOTTOM)       #上下对换。
    im.transpose(Image.ROTATE_90)             #旋转 90 度角。
    im.transpose(Image.ROTATE_180)            #旋转 180 度角。
    im.transpose(Image.ROTATE_270)            #旋转 270 度角。
    展开全文
  • 图像中许多重复数据,使用数学方法来表示这些重复数据可减少数据量 人的眼睛对图像细节和颜色的辨认有一个极限,把超过极限的部分去掉,就达到了压缩数据的目的 图像的颜色模型 颜色模型 用数值指定颜色的方法 ...

    数据压缩的主要思想
    对图像中许多重复数据,使用数学方法来表示这些重复数据可减少数据量
    人的眼睛对图像细节和颜色的辨认有一个极限,把超过极限的部分去掉,就达到了压缩数据的目的

    图像的颜色模型

    颜色模型
    用数值指定颜色的方法
    颜色空间
    用空间中点的集合描述颜色的方法
    显示图像用RGB相加混色模型
    有源物体
    一种能发出光波的物体称为有源物体
    RGB相加混色模型
    组合三种光波产生特定颜色的方法叫做相加混色法
    用RG和B颜色分量产生颜色,故称为RGB相加混色模型。
    颜色=R(红色百分比)+G(绿色百分比)+B(蓝色百分比)
    三基色等量相加得到白色,等量红绿相加而蓝为0时得到黄色,等量红蓝相加而绿为0得到品红色,等量的绿蓝相加而红为0时得到青色。
    像素
    组成彩色图像的点称为像素
    HSL模型
    色调-饱和度-亮度( Hue Saturation-Lightness, HSL),
    HSL模型中,H定义颜色的波长,称为色调;S定义颜色的强度(intensity),表示颜色的深浅程度,称为饱和度;L定义掺入的白光量,称为亮度。
    用HSL表示颜色的重要性,是因为它比较容易为画家所理解。若把S和L的值设置为1,当改变H时就是选择不同的纯颜色;减小饱和度S时,就可体现掺人白光的效果;降低亮度时,颜色就暗,相当于掺人黑色。因此在Windows附带的画图软件也用了HSL表示法。
    打印彩色图像用CMY相减混色模型
    无源物体
    一种不发光的物体称为无源物体
    青色、品红、黄色,称为CMY模型
    因为减少了为视觉系统识别颜色所需要的反射光所以称为相减色
    等量三基色得到的黑色不是真正的黑色,因此在印刷术中常加一种真正的黑色,所以CMY又写成CMYK
    图像色三个基本属性
    分辨率、像素深度、真/伪彩色
    屏幕分辨率
    屏幕分辨率也称显示分辨率,它是衡量显示设备再现图像时所能达到的精细程度的度量方法。
    屏幕分辨率通常用水平和垂直方向所能显示的像素数目表示,写成“水平像素数X垂直像素数”,如640X480表示显示屏分成480行,每行显示640个像素,整个显示屏含有307200个显像点。常见的屏幕分辨率包括640X480、800X 600、1024X768、1280X1024。水平分辨率与垂直分辨率的比例通常是4 : 3,与传统电视的宽高比相同,但与高清晰度电视的宽高比(16: 9)不同。
    屏幕能够显示的像素越多,说明显示设备的分辨率越高,显示的图像质量也就越高。显示屏上的每个彩色像点由代表R、G、B三种模拟信号的相对强度决定,这些彩色像点就构成一幅彩色图像。
    图像分辨率
    图像分辨率是图像精细程度的度量方法
    对同样尺寸的一幅图,像素数目越多,则说明图像的分辨率越高,看起来就越逼真
    图像分辨率也称空间分辨率和像素分辨率
    图像分辨率和屏幕分辨率是两个不同的概念:
    从行列像素角度看,图像分辨率是构成一幅图像的像素数目,而屏幕分辨率是显示图像的区域大小。例如屏幕分辨率为640x480,name一幅320x240像素的图像只占显示屏幕的1/4。
    像素深度
    像素深度是指存储每个像素所用的位数
    像素深度也被认为是图像分辨率的一种度量方法,表示一个像素的位数越多,它能表达的颜色数目就越多,而它的深度就越深,像素深度越深,所占空间的存储空间也越大。相反如果像素深度太浅,那也影响图像的质量
    真伪彩色和直接色
    真彩色
    真彩色是指每个像素的颜色值用红、绿、蓝表示的颜色
    伪彩色
    (伪彩色(pseudocolor)是指每个像素的颜色不是由每个基色分量的数值直接决定的颜色,而是把像素值当作彩色查找表(Color Look Up Table,CLUT)的表项人口地址,去查找显示图像时使用的R、G、B值,用查找出的R、G、B值产生的彩色称为伪彩色。彩色查找表(CLUT)是一一个事先做好的表,表项入口地址也称为索号。
    直接色
    每个像素值由R、G、B分量构成,每个分量作为单独的索引值对它做变换,也就是通过相应的彩色变换表找出基色强度,用变换后的R、G、B强度值产生的颜色称为直接色(directcolor)。它的特点是对每个基色进行变换。

    图像的种类

    矢量图和位图
    矢量图:
    矢量图是用一系列计算机指令描绘的图,如点、线、面曲线、圆、矩形以及它们的组合。
    优点:
    矢量图有许多优点。例如,目标图像的移动、缩小或放大旋转、拷贝、属性(如线条变宽变细、颜色)变更都很容易做到;相同的或类似的图可以把它们当作图的构造块,并把它们存到图库中,这样不仅可加速矢量图的生成,而且可减小矢量图的文件大小。
    位图:
    位图(imap)是用像索值阵列表示的图门不论用什么方法生成图,凡是用像索值阵列表示的图都称为位图。在有些文章中,把表示矢量图的位图称为图形图像(graphical image)或矢量图像(veetor based image).位图也称光栅图
    位图的获取通常用扫描仪、数码相机、摄像机、录像机、视像光盘和相关的数字化设备,获取的位图文件占据的存储空间比较大。影响位图文件大小的因素主要有两个.图像分辨率和像素深度。(分辨率越高,表示组成一幅图的像素就越多,图像文件就越大:像素深度越深,就是颜色表达单个像素的颜色和亮度的位数越多,图像文件就越大)

    灰度图像与彩色图像
    灰度图
    只有明暗不同的像素而没有彩色像素的图像
    单色图:
    只有黑白两种颜色的图像称为单色图像

    JPEG压缩编码

    JPEG是什么
    JPEG是一个适用范围很广的静态图像数据压缩标准,即可用于灰度图像又可用于彩色图像。采用JPEG标准压缩的文件使用.jpg或.jff作为文件名的后缀。
    为其开发了两种压缩算法,一种是以离散余弦变换为基础的压缩算法,另一种是采用预测技术为基础的无损压缩算法
    JPEG算法概要
    JPEG是采用数据有损压缩算法的标准,利用了人的视觉系统的特性,使用变换、量化和熵编码结合的方法,以去掉或减少视觉冗余信息的数据本身的冗余信息。
    算法的三个步骤
    1、使用正向离散余弦变换把空间域表示的图变换成频率域表示的图
    2、使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的
    3、使用霍夫曼可变字长编码器对量化系数进行编码
    JPEG算法的计算步骤
    (1)正向离散余弦变换(FDCT)
    (2)量化(quantization)。
    (3) Z字形编码(zigzag scan)。
    (4)使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。
    (5)使用行程长度编码(RLE)对交流系数(AC)进行编码。
    (6)熵编码(entropy coding)。

    图像文件格式

    BMP文件格式
    windows标准图像格式
    特点:
    1、每个文件只能存放一幅图像
    2、多种颜色存储格式
    GIF格式:(动图)
    网络传输和BBS用户使用的图像文件
    世界通用的图像格式
    特点:
    ①采用改进的LZW压缩算法处理数据
    ②最多存储256色,不支持24bit
    ③一个文件可存放多幅图像
    JPG格式
    一种高效率的压缩格式
    特点:
    1、表达自然景观的图片,JPEG编码方 式具有非常好的处理效果
    2、计算机绘制的具有明显边界的图形,JPEG编码方式的处理效果不佳
    PNG格式
    一种流式网络图形格式
    特点:
    ①支持24位颜色深度图像
    ②存储灰度图像时,图像深度达16位
    ③存储彩色图像时,图像深度达48位
    TIFF格式
    ①通用的位映射图像文件格式
    ②可移植性好
    PSD格式
    Photoshop的专用文件格式,它包含图层、通道、蒙版等制作效果,编辑过程以PSD保存,编辑后再转换成其它格式。
    特点:
    ①保存各种信息,占用空间较大
    ②压缩比与JPEG差不多,且不失真
    ③支持RGB、CMYK等色彩模式
    ④PSD存取速度比其它格式快

    展开全文
  • 二值图像、灰度图像、彩色图像

    万次阅读 多人点赞 2018-03-31 14:44:08
    ____tz_zs二值图像二值图像(Binary Image),按名字来理解只有两个值,0和1,0代表黑,1代表白,或者说0表示背景,而1表示前景。其保存也相对简单,每个像素只需要1Bit就可以完整存储信息。如果把每个像素看成随机...
  • 图像复原

    千次阅读 2018-08-09 16:16:47
    1图像复原的而理论模型 定义:在成像过程中,由于成像系统各种因素的影响,可能使获得的图像不是真实景物的完善影像。图像在形成、传播和保存过程中使图像质量下降的过程,称为图像退化。图像复原就是重建退化的...
  • 图像的表示方法和种类

    千次阅读 2019-09-26 15:22:31
    1.1 图像预处理算法简介 1.1.1 数字图像表示 我们可以通过这样理解数字图像,首先图像是由许多像素组成的,所以说图像处理是在二维平面上对图片的每一个像素进行处理,而如何知道我们处理的是这一个像素,而不是...
  • 图像的通道和深度

    千次阅读 2019-05-18 18:07:53
    二值图像图像的像素点不是0 就是1 (图像不是黑色就是白色),图像像素点占的位数就是 1 位,图像的深度就是1,也称作位图。 灰度图像图像的像素点位于0-255之间,(0:全黑,255代表:全白,在0-255之间插入了...
  • 图像增强—图像锐化

    万次阅读 多人点赞 2020-04-02 11:49:48
    图像锐化与图像平滑是相反的操作,锐化是通过增强高频分量来减少图像中的模糊,增强图像细节边缘和轮廓,增强灰度反差,便于后期对目标的识别和处理。锐化处理在增强图像边缘的同时也增加了图像的噪声。方法通常有...
  • 图像识别算法

    万次阅读 2019-08-15 17:36:40
    图像特征提取是图像分析与图像识别的前提,它是将高维的图像数据进行简化表达最有效的方式,从一幅图像的的数据矩阵中,我们看不出任何信息,所以我们必须根据这些数据提取出图像中的关键信息,一些基本元件以及它们...
  • Image captioning-数据格式

    千次阅读 2018-01-24 10:00:48
    规划: 整体内容是四块: 首先是训练和评估数据,我们选择的是微软COCO图片数据数据,后面简单会介绍数据的格式,处理方式 整体topic的主线是沿着show and tell的发展 介绍各种attention以及其他encoder机制的...
  • OCR识别之图像预处理

    2020-06-30 16:34:27
    OCR识别之图像预处理图像预处理之作用及效果图像预处理之操作图像预处理之源代码 图像预处理之作用及效果 无论是使用图像来做识别还是别的操作,都需要对图像做一定的预处理操作,预处理的作用是方便后续我们对图像...
  • 转载请注明本函数文详细地址 本文讲解了opencv自带轮廓跟踪以及绘制轮廓的函数 本文讲解了一种基于链码的一种轮廓检测方法 本文一到四部分转载至:《opencv cv.findContours 函数详解》
  • 首先,我们平时所用的彩色图像是RGB色,分别有三个图像通道: red(0-255),green(0-255),blue(0-255) 1. 可以把一张图像理解为一个二维矩阵,在矩阵中每一个点都有一个属性,就是它的RGB色,以此来构成一个图像 ...
  • Python+OpenCV实时图像处理

    万次阅读 多人点赞 2020-05-28 12:36:03
    目录 ...初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
  • MATLAB数字图像处理(一)图像的基本操作

    万次阅读 多人点赞 2018-04-18 16:05:12
    写在前头:说到数字图像处理,不得不提起MATLAB。这是一款非常方便的仿真软件,绝大多数的图像处理可以用MATLAB完成。  有人问,处理图片,用PS岂不是更好。两者各有优点,如果需要将10000幅图片转换成灰度...
  • 图像处理之常见二值化方法汇总

    万次阅读 多人点赞 2016-11-01 20:34:23
    图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越 精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理...
  • 超全Python图像处理讲解(多图预警)

    万次阅读 多人点赞 2020-04-25 17:57:40
    文章目录Pillow模块讲解一、Image模块1.1 、打开图片和显示图片1.2、创建一个简单的图像1.3、图像混合(1)透明度混合(2)遮罩混合1.4、图像缩放(1)按像素缩放(2)按尺寸缩放1.5、图像的剪切与粘贴(1)图像粘贴...
1 2 3 4 5 ... 20
收藏数 1,167,929
精华内容 467,171
关键字:

图像