• 图像处理入门必看

    2017-11-27 22:36:25
    (原MyBlog)前要说明这段时间在网上找资料学习图像处理的相关知识,在网上看到这篇得相当不错的文章,在大牛允许转载的情况下,特搬家至此,方便更多的初学者能够看到。正文开始最近有人问我图像处理怎么研究,怎么...

    (原MyBlog)

    前要说明

    这段时间在网上找资料学习图像处理的相关知识,在网上看到这篇写得相当不错的文章,在大牛允许转载的情况下,特搬家至此,方便更多的初学者能够看到。

    正文开始

    最近有人问我图像处理怎么研究,怎么入门,怎么应用,我竟一时语塞。仔细想想,自己也搞了两年图像方面的研究,做个两个创新项目,发过两篇论文,也算是有点心得,于是总结总结和大家分享,希望能对大家有所帮助。在写这篇教程之前我本想多弄点插图,让文章看起来花哨一点,后来我觉得没必要这样做,大家花时间沉下心来读读文字没什么不好,况且学术和技术本身也不是多么花哨的东西。(我也很赞同这样的想法,我写的博文也是这样,自我认为这样可以让读者能够有更多更快的收获)

    一、图像处理的应用

    这个其实没什么好说的,一种技术的应用价值不是靠嘴上说,而是要看有多少人去搞,很简单的道理。其实我觉得判断一项技术有没有价值、有多大价值的最简单最有效的方法就是看有多少人在研究它。如果大家都在研究,那必然说明它很火,至少目前很火,以后的几年里依然还会火。因此,如果你不确定图像处理是不是有价值,那就查查全国图像处理工程师的数量就行了。

    当然这里还是简单提一下。如果你真的只想问“图像处理有什么用?”,相信百度会给出比我更专业的答案。不过作为图像处理的行内人,我还是从几个基本的点来具体说一下。

    1、身份认证

    21世纪是刷脸的时代,这一点无可厚非。首先是银行,据说重庆的银行已经使用了人脸识别的验证系统来进行辅助的认证。其次是门禁系统,以前是指纹,虹膜,现在就是人脸。指纹、虹膜的识别虽然准确,但是有侵犯性,采集的过程中有侵犯性,验证的过程中也有侵犯性,反正让谁天天录指纹(采集指纹信息),用眼睛瞪摄像头(采集虹膜信息),谁都会觉得不舒服的,况且手还会脱皮。相比之下,人脸的识别就方便多了,拍张照片(采集人脸信息)谁都不会介意。最后是监控,一个摄像头所拍的监控能从不同的角度记录成百上千的人(比如车站等密集场所的监控),让警察去辨认将是一个浩大的工程,要是系统能够自动判别人员信息,无疑会给办案带来极大方便。

    2、监控安防

    安防监控可以说是图像处理领域最有潜力的应用领域。如今各个城市都在疯狂的安装监控摄像头,全国时刻都有无数的摄像头在录监控,但是安防监控的后端处理却没跟上。什么是后端处理,简单的说就是监控录像的视频处理。注意这里的视频处理可就不止包含人脸识别了,还有行人检测、异常检测、显著性检测、协同跟踪等。人脸识别之前说了,这里简单说说行人异常检测。图像处理中的行人异常检测在外行人眼中是一个非常有魔力的东西。毕竟让摄像头通过监控视频就能判断出当前画面中谁是好人谁是坏人(当然直接分为好人和坏人还是太武断了),在一般思维中貌似是不可能的。但是请不要忽略这样一个事实,就是目前大部分监控视频的分析处理都是由人工来完成的,警察破案时经常动不动就调出最近几天的监控视频,然后从头看到尾,其工程量之大可想而知。也正是这样才催生了人们对智能监控方面的研究,因为有这方面的实际需求。当然我们的视频分析程序不会直接给出诸如“好人or坏人”这样的武断而片面的判断结果。就当前的技术水平而言,能够统计当下监控画面中的人数(行人检测)、定位他们的人脸(人脸检测)、识别他们的身份(人脸识别)、判别他们的表情(表情识别)、检测他们的动作(异常检测),这就已经够了。这样以后人们就不会再面对长达几十甚至上百个小时的监控视频发呆,而是直接分析计算机给出的数据,当前画面中有多少人、都是谁、谁的动作可疑等。总之,接下来智能监控发展会很迅速,因为需求很迫切。

    3、深度学习(Deep Learning)

    通俗的说一句,“图像处理是深度学习应用的天堂”。深度学习这个概念可能有人不太熟悉,大家可以自行百度,我这里给出一个相对通俗的解释:“如果你不知道什么叫深度学习,就想想《终结者》中的T-800”。当然这句话不是我说的,是出自业界的一位大牛之口。当然这可能有点小片面,不过深度学习确实是公认的新一代人工智能的基础。

    这里举两个例子。一是谷歌的人工大脑项目。谷歌公司可以说是深度学习方面的牵头企业了,其在2012年公布的谷歌大脑项目,动用了1.6万个计算节点,训练数周,得到的人工智能模型能够自主识别猫脸图像,为新一代人工智能开辟了道路,之后微软深度学习研究院、百度深度学习研究院等机构都开始大量投入,各个高校也搞得风声水起,原因很简单,大家都知道它会火。

    第二就是图像识别方面的竞赛。最有权威的就是ImageNet竞赛。大家在一个拥有上千万张,上千类别的图像数据库上训练和测试自己的算法,比拼识别率。近几年来,摘得桂冠的一直都是深度学习模型,确切的说是卷积神经网络。更多有关ImageNet历年的竞赛信息大家可以自行百度。

    说道深度学习在图像处理的应用,不得不提中国的汤晓鸥教授,说他是国内深度学习的领头羊也不为过。他提出的DeepID人脸识别算法(一共分为三代),在一些大规模人脸数据库上的正确率(若LFW库)已经达到了99.75%,单纯从数字上讲的话可以说已经超越了人类的识别率,为此汤教授还开办了公司,开发FaceSDK(虽然还没有公布)。不过拿计算机和人脑相比本身就是不合理的,各有所长嘛。不过可见DeepLearning在图像识别领域的强大威力。至于深度学习与图像处理的关系这里就不用多说了,谷歌大脑识别的是图像,深度学习竞赛用的是图像,DeepID识别的还是图像人脸,虽然深度学习在其他方面诸如语音识别等也有应用,在图像处理依然是其主要的应用领域。

    二、图像处理研究工具

    图像处理的研究分为算法研究和应用两个部分。用到的主要编程语言有Matlab、C/C++、Python等,原因很简单,它们都有很多相应的第三方库,不用我们从零开始编程。

    1、Matlab

    MathWork公司的Matlab软件可以说是算法研究的利器,它的强大之处在于其方便快捷的矩阵运算能力和图形仿真能力,单从简洁性和封装性来说,确实完爆其他语言。但高度封装必然会相应的损失一部分灵活性,况且Matlab严格的讲更像是一个工具,而非一门编程语言。顺便提一句,它在2015年编程语言排行榜中位于第20名,仅次于iOS开发的Objective-C。

    对于算法研究人员(尤其是高校的硕士博士),首选工具自然是matlab,因为它简便快捷,封装性好,更重要的是全世界几乎所有的算法大牛、精英教授都会首先公布对应的Matlab源码,然后在逐步改写成其他语言进行实际应用。所以,如果你想做图像处理方面的研究,Matlab是必须掌握的,而且是熟练掌握。当你有一些想法需要验证时,最好明智的先用matlab编写出来测试。如果你上来就用看似高大上的C++来实验,不仅错误BUG一大堆,到头来可能效果还不佳,就算效果好,时间也会耽搁不少,毕竟算法开发还是要快的,这样才能赶在别人之前发论文。总之,只要是接触图像算法,终究逃不过Matlab,就算你是软件开发的,不研发算法,但总得能看懂别人的Matlab算法吧。

    对于之前没怎么接触过Matlab与图像处理的人,在这里推荐一本相关的书籍《MATLAB图像处理实例详解(附光盘)》。这本书对于Matlab图像处理入门还是很有帮助的。记得我当时刚上研究生时就靠两本书入门的,一是冈萨雷斯的《数字图像处理》,二是这本《MATLAB图像处理实例详解》。不过这里友情提示,在看这类教程(不仅仅是Matlab)时千万不要试图去记忆所有的工具函数,这种做法是十分愚蠢的。正确的做法是根据自己的情况快速翻阅这类工具书,可以找出里面的有实际意义的源码来敲一敲练练手感,至于具体的工具函数,只需要知道Matlab提供了这方面的功能就行了,以后用到了再回来查,或者谷歌百度。我觉得在入门阶段,最重要的不是看了多少书,听了多少课,而是尽快自己敲出一段代码,运行出结果,来建立自信和成就感,这才是支持我们走下去的最实在的动力。记得我当时看了没多久就自己敲了一个蹩脚的车牌检测的Matlab程序,现在看来真是漏洞百出,不过当时我真的很兴奋,很有成就感,觉得自己能干这行,对于初学者来说,这种感受弥足珍贵。

    2、OpenCV

    opencv是Intel公司开发的C++图像处理工具包,形象的理解为就是C++版的Matlab。当初Intel公司开发这个工具包的初衷也是方便大家共享,希望大家能够在一个共同架构的基础上共同建造摩天大楼,而不是各自在自己的地基上盖平房。与Matlab不同,Opencv是面向开发的,稳定性好,异常处理机制周全,但有一点需要注意,由于Opencv是开源的,那么如果你在项目中直接调用了它的API,那就意味着你的项目也必须开源。因此在真正的产品开发过程中,往往需要从Opencv库里面挖代码,而不是直接调用,幸好Intel公司允许我们看源码,自己编译一把就可以了。

    说道C++和Opencv,有一个问题不得不提,那就是深度学习领域大名鼎鼎的Caffe框架。这是一个典型的基于C++和OpenCv的深度学习框架,由谷歌深度学习团队、“谷歌大脑”负责人之一贾扬清学者编写,并公布了源码。如今各个深度学习机构都在大量使用这个框架进行研究。

    这里同样对推荐两本关于Opencv方面的教程。一本是CSDN博客大牛毛星云写的《OpenCV3编程入门》,这是它根据自己多年的博客整理成的书,很详细,很典型的一本教程,介绍了OpenCv中相对前沿的知识。我翻看过这本教程,中规中矩,里面的代码通俗易懂,尤其适合初学者。当然大家同样要注意不要犯了死读书的毛病,只看它的功能,敲代码练手感即可,不要试图记忆API函数。重要的工具用多了自然会记住,不重要的工具记住了也没用。

    这里推荐的第二本书是《图像识别与项目实践――VC++、MATLAB技术实现》,这本书是一本偏向于工程应用的书,我之所以推荐它是因为它给出了很多有新意、能运行的代码。其中里面有一个项目让我印象很深,是一个车牌检测的实例。简单描述一下:由于车牌中的字符数是固定的,因此它通过判断横向区域笔画的跳变数以及笔画宽度来定位车牌区域。这个想法让人耳目一新,并且它还给出了详细代码,我也亲身试验过,效果还不错。

    这里同样再强调一下,就是一定要尽早入手写程序,建立自信和成就感。我当时学OpenCv正好用它开发了一个人脸性别识别的系统,是一个本科大学生创新计划的需求,效果还可以。

    3、python

    Python在今年12月份的编程语言排行榜中名列第5,增长迅速。可以说Python已经逐渐成为当下脚本语言的新标准。Python在图像处理算法方面除了其自身简洁的编程优势外,还得益于两个重要的Python类库——Numpy和Theano。

    Numpy是Python的线性代数库,对于矩阵运算能提供很好的支持,并且能够在此基础上进行很多机器学习相关算法的开发仿真,这里推荐一本受到大家广泛认可的书《机器学习实战》,我最近也正在看这本书,里面对好多机器学习领域的经典算法,小到KNN,大到SVM,都给出了详细的介绍以及代码实现(Python版)。Theano是Python的机器学习库,能够方便的实现深度学习(例如卷积神经网络CNN)算法,网上很多对于DeepID算法的复现都是用的这个库。

    人觉得单从图像处理的角度评价的话,Python并没有前面两个工具(Matlab和OpenCv)应用广泛,不过作为通用的脚本语言,我觉得每个程序员都应该去了解了解它,毕竟俗话说没有烂的编程语言,只有烂程序员。我在学Python时第一个自己写的程序就是微信打飞机的小程序,在我的博客中有详细的教程,虽然是参照小甲鱼的《零基础入门学习Python》视频教程写的,但还是蛮有成就感的。

    三、图像处理研究方法

    我觉得,图像处理研究主要可以分为三个部分:基础概念、基本思想、算法研究。

    1、基础概念

    所谓基础概念,就是图像处理里最基本的知识,比如什么是图像?什么是像素?什么是彩色图像等等。没有一个明确的界限来划定什么是基础概念什么是高级知识,因人而异。了解图像处理的基础知识,有一本书是必读的,就是冈萨雷斯编写的、阮秋琦翻译的《数字图像处理》。这本书已经作为图像处理领域的经典教材使用了三十多年,我自己也把这本书看了好几遍,每一遍都会有新的体会。我觉得每一个搞图像的都应该熟读这本书。书中除了有几章内容在讲小波变换、模式识别等相对抽象的内容外,其他内容相对都是很基础的,本科生水平就能看懂。而且我建议要尽早看这本书,如果是研究生尽量在进入课题之前就看一遍,因为这样一本经典的书在进入课题之后可能就没时间看了,以后也顶多是查阅而已。我当初就是在大四的寒假看完了这本书,以后在图像入门的过程中就显得轻松很多。看完这本书,哪怕是只看前几章,明白了什么是图像(二维或者三维矩阵)、什么是像素、彩色图和灰度图、颜色空间、图像滤波、图像噪声、图像频域变换等概念,将来在进行更深一步的研究的话就会方便很多了。

    2、基本思想

    刚开始想把这部分内容命名为“基本算法”,意在介绍图像处理中的一些基本算法,后来仔细想想决定不这么写,因为图像处理是一个非常大的概念,图像处理不等于人脸识别,也不等于模式识别,直接介绍诸如图像处理基本算法之类的内容很容易写成空话,没有什么实际意义。读者有兴趣的话可以直接谷歌百度“图像处理十大经典算法”,上面有我想说的内容。

    万变不离其宗,算法是死的,重在思想。举个例子,我个人是主攻模式识别方向,在这个方向判断一个学生是否入门有一个非常简单的方法,就是“如果你能把图像很自然的想象成高维空间中的一个点”,那就说明在模式识别方面入门了,可以对图像进行分类了。当然标准不是唯一,在其他领域如目标检测也会有其他的判断标准,总之我们要对图像进行处理,那么图像就不再只是图像,它可能会演变成各种不同形式的概念,可能是点,可能是面,还可能是一个坐标空间。在目标跟踪的经典算法粒子滤波中,将一个个的小图像块看做一个个粒子;在子空间理论中,将一系列图像放在一起构建一个成分主空间(例如主成分分析PCA算法等等。,我不会详细介绍这些算法,说多了就显得抽象老套,但我要说的是我们一定要把图像本身理解好,它是一个图像,是一个矩阵,是一个信息的容器,是一种数据的表现形式,图像不一定都必须在视觉上有意义(比如频域的图像)。

    总之图像处理的基本思想还是要立足于图像本身,要深度到图像内部结构中,思维要灵活。我当时做本科毕设时,怎么也不知道图像和高维空间中的点之间有什么对应关系,后来总算有一天,突然就明白了,这也就是所谓的量变产生质变。总之一定要多想,多总结,主动去钻研,才能够真正领悟一些东西。最基本的东西往往蕴藏着深奥的道理,无论你现在多牛多厉害,都不能放掉最本源的东西。多想想图像是什么,有什么本质属性,你可能无法得到准确的答案,但肯定能得到一些有用的感悟(有点像哲学问题了)。

    3、算法研究

    算法研究应该是图像处理的核心工作,尤其是各大高校的博士硕士。这里我并不想谈那些高大上的算法,我更想说的是一些算法研究的一些基础的东西,比如说一些基础课程,比如说矩阵运算。

    研究图像处理的算法,离不开数学。在这里我建议图像处理方面的硕士一定要上两门课:《泛函分析》以及《最优化算法》,有的学校已经将这两门课列为了研究生阶段的必修课程。这两门可可以说是图像处理(至少是模式识别)的基础。我当初没上过最优化算法,但后来也自己补上了,不然真的是寸步难行。至于泛函我当时听课的时候也不是很懂,但是在之后的研究过程中发现很多图像处理的基本知识基本理论都和泛函分析中枯燥的定理如出一辙,没办法,有的东西本身就是枯燥的干货,学着费力,缺它不行。

    其次我想说的是矩阵运算。图像就是矩阵,图像处理就是矩阵运算。大家为什么都喜欢用Matlab,就是因为它的矩阵运算能力实在是太强大,在Matlab的世界中任何变量都是矩阵。同样OpenCv之所以能流行,不仅仅是因为它良好的封装性,也是因为它的矩阵格式,它定义了Mat基础类,允许你对矩阵进行各种操作。Python也不例外,它的Numpy就是一个专门的线性代数库。

    真正在图像编程过程中,那些看着高大上的API函数归根到底都是工具,查查手册就能找到,真正核心还是在算法,算法是由公式编写的,公式的单元是变量,而图像届的变量就是矩阵。所以,熟练去操作矩阵,求秩、求逆、最小二乘,求协方差,都是家常便饭。所以,如果你有幸能上《矩阵分析》这门课,一定要把它看懂,那里面都是干货。

    四、小结

    总之,图像处理就是一个典型的门槛低、厅堂深的领域。不需要太多基础,学过线性代数,会一点编程就够了;但是那些算法却深不可测,是个消耗功夫的活儿。在写这篇教程时我说的很直白,就像和大家对话一样,想到什么说什么。在最后我想说两句题外话,就是不仅仅针对图像处理,对于其他新技术的入门学习也是一样,尽快迈出第一步,尽快去建立自信和成就感,让自己有勇气走下去,然后缺什么补什么就行了。我觉得真正让人望而却步的往往不是技术本身,而是我们对自身的不自信。唯有果断开工,才能战胜心魔。

    文章转载自图像处理入门教程

    社交栏目

    更多IT相关咨询请关注微信公众号 DeepBlueTeam ,或关注QQ群 577047300(I&T)欢迎各位小伙伴的加入。

    展开全文
  • 能不能自己动手用C++一个小型的图像处理软件,实现一些图像处理算法,而不调用任何外部的包?这个可以有! 多年以前,甚至是主页君还在读书的时候,曾经尝试在VC++ 6.0中编写了最初版本的MagicHo...

    说到图像处理软件你会想到什么?Photoshop?CorelDRAW?美图秀秀?还是ACDSee的图像编辑模块?

    说到实现数字图像处理算法,你又会想到什么?Matlab?OpenCV?

    能不能自己动手用C++写一个小型的图像处理软件,实现一些图像处理算法,而不调用任何外部的包?这个可以有!

     

    多年以前,甚至是主页君还在读书的时候,曾经尝试在VC++ 6.0中编写了最初版本的MagicHouse(一款小型的图像处理软件)。后来当我写了我的第一本图像处理算法书时,我用VC++ 2005更新了它。再后来很长一段时间了,它就一直被压箱底了。我也开始转战Matlab了,毕竟懒惰是推动人类创新的两大动力之一,谁让Matlab那么省时省力呢。但是我们又不得不承认:首先,Matlab相比于C++,在工业应用上其实非常有限。其次,它隐藏了太多的细节,你当然不必为内存管理而操心,也无需为图像文件编解码而犯愁,但一直用Matlab的总是有种“进口加组装”的山寨感。能不能来个“完全自力更生”呢?利用这几天闲暇时间,我在Visual Studio 2013中更新了我的MagicHouse软件。(听说Visual Studio 已经出了2015,Anyway 我想应该无伤大碍)。下面就简单介绍下MagicHouse软件所提供的基本功能。

    先来看看GUI先——

     

     

    纯C++,没有调用任何外部包,好处是一砖一瓦完全自我打造,坏处是我不能保证所有算法的效率都最优。目前该软件仍然只支持BMPJPG两种格式(自己写编码函数的孩纸伤不起啊)。在浏览模式中程序提供了包括十种图片载入的方式:向下扫描、双重扫描、右侧飞入、双侧飞入、垂直百叶窗、水平百叶窗、垂直栅条、水平栅条、方格效果、落雨效果。下面是一些效果图(原图是西安青龙寺的樱花,博主拍摄)——

    下面是软件中实现了的部分图像处理算法演示:

    图像的几何变换之旋转(双线性差值算法)(原图是广州大剧院,由博主的摄影师友人拍摄)

     

    图像的灰度变换之指数变换

     

    图像滤镜之马赛克化(原图是广州南沙湿地,由博主拍摄)

     

    图像滤镜之水雾效果(复合方向)

     

     

    图像滤镜之彩色钢笔效果

     

     

    图像分析之种子填充算法(原图是缅甸蒲甘的神庙,由博主拍摄)→

     

     

    正交变换之快速傅立叶变换

     

     

    正交变换之图像小波分解(二层)→

     

     

    基于Robinson算子的带方向的边缘检测

     

    多区域轮廓跟踪算法

     

    图像分割之分水岭算法(原图是澳大利亚大洋路,由博主拍摄)→

     

    图像增强处理之高斯平滑滤波

     

    采用中值滤波方法对受椒盐噪声污染的图像进行降噪→

     

    高级图像增强处理之保护纹理的降噪算法:基于PM方程的非线性扩散滤波→

     

    高级图像增强处理之保护纹理的降噪算法:基于全变分的TV降噪算法→

     

    图像加密算法之 基于Hilbert曲线的图像置乱加密(中图),以及基于Cat映射的图像置乱加密(右图)→

    什么都看不到,要的就是这种效果:)

     

    基于混沌图像融合的密图隐藏算法→

    下面的左图是隐藏处理后的密图(注意为了让读者看清楚里面隐藏了一幅图像,我特意调整参数让它显现出来,事实上是可以做到完全隐藏的,那样图像就会和原模板图像看起来完全一致了)。右图是解密后复原的图像。

          

     

    基于形态学方法的图像处理之彩色图像的膨胀→

     

    以上列出的仅仅是软件中提供的部分功能,限于篇幅,这里就不逐一列出了,日后有时间我也会继续完善软件、实现更多有趣的算法。

     

    现在提供最新(基于Visual Studio 2013)版本的程序下载,网盘链接:https://pan.baidu.com/s/1XaATmXllMFhByOJxCMsiZQ

    此外,我还共享了我所使用的测试图片,因为1)部分算法对图像有特殊要求,比如某些形态学算法要求图像必须是二值图;2)因为犯懒,某些算法的parameter我采用了hard-coded的方式,所以最好用我提供的实验图像,以期得到理想的测试效果。

     

     

    展开全文
  • 基于opencv1.0 VC++6.0MFC的完整的图像处理程序,功能齐全(图像基本操作:旋转、镜像、反色、图像二值化、图像分割、图像增强、灰度直方图均衡、线性变换、灰度拉伸)、边缘检测(prewitt算子、sobel算子、canny...
  • 1.4数字图像处理的基本步骤 数字图像处理的内容划分为以下两个主要类别:一类是其输入输出都是图像。一类是其输入可能是图像,但输出是从这些图像中提取的属性。 图像获取是数字图像处理的第一步处理。图像获取与...

    1.4数字图像处理的基本步骤

    数字图像处理的内容划分为以下两个主要类别:一类是其输入输出都是图像。一类是其输入可能是图像,但输出是从这些图像中提取的属性。
    在这里插入图片描述

    1. 图像获取是数字图像处理的第一步处理。图像获取与给出一幅数字形式的图像一样简单。通常,图像获取阶段包括图像预处理,譬如图像缩放。
    2. 图像增强是对一幅图像进行操作,使其结果在特定应用中比原始图像更适合进行处理。“特定”一词很重要,因为增强技术建立在面向问题的基础上,例如,对增强X射线图像十分有用的方法,对增强电磁波谱中红外波段获取的卫星图像可能就不是好方法。不存在图像增强方法的通用理论,图像增强方法多种多样,特殊情况特殊对待。
    3. 图像复原也是改进图像外观的处理领域。与图像增强不同,图像增强是主观的,而图像复原是客观的;复原技术倾向于以图像退化的数学或概率模型为基础。而增强以什么是好的增强效果这种主观偏爱为基础。
    4. 彩色图像处理,第6章涵盖许多彩色模型和数字域彩色处理的基本概念。彩色也是图像中提取感兴趣区域的基础。
    5. 小波是以不同分辨率来描述图像的基础。本书中为图像数据压缩和金字塔表示使用了小波,此时图像被成功地细分为较小的区域。
    6. 压缩指的是减少图像存储量或降低图像带宽的处理。互联网是以大量的图片内容为特征的,例如,jpg文件扩展名用于jpeg的图像压缩标准。jpeg格式的图像可以用最少的磁盘空间得到较好的图像质量。
    7. 形态学处理涉及提取图像成分的工具,这些成分在表示和描述形状方面很有用。这一章的内容将从输出图像处理到输出图像属性处理的转换开始。
    8. 分割过程将一幅图像划分为其组成部分或目标。通常,自动分割是数字图像处理中最困难的任务之一。成功地把目标逐一分割出来是一个艰难的分割过程。通常,分割越准确,识别越成功。
    9. 表示与描述,选择一种表示仅是把原始数据转换为适合计算机进行后续处理的形式的一部分。为描述数据以使感兴趣的特征更加明显,必须确定一种方法。描述又称为特征选择,它涉及提取特征,可得到某些感兴趣的定量信息,或是区分一组目标与其他目标的基础
    10. 目标识别,是基于目标的描述给该目标赋予标志(如“车辆”)的过程。
    展开全文
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:
    [数字图像处理] 一.MFC详解显示BMP格式图片
    [数字图像处理] 二.MFC单文档分割窗口显示图片
    [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
    [数字图像处理] 四.MFC对话框绘制灰度直方图
    [数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
    [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
    [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:
    1.图像基础知识
    2.OpenCV读写图像
    3.OpenCV像素处理

    PS: 文章也学习了网易云高登教育的知识,推荐大家学习。

    PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

    一.图像基础知识

    图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

    图像通常包括二值图像、灰度图像和彩色图像。

    1.二值图像
    二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。

    2.灰度图像
    灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
    (1) 浮点算法:Gray=R0.3+G0.59+B0.11
    (2) 整数方法:Gray=(R
    30+G59+B11)/100
    (3) 移位方法:Gray=(R28+G151+B77)>>8;
    (4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
    (5) 仅取绿色:Gray=G;
    (6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R
    0.299+G*0.587+B0.144

    通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。

    3.彩色图像
    彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。



    二.OpenCV读写图像

    本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:

    1.读入图像
    OpenCV读图像主要调用下面函数实现:

    img = cv2.imread(文件名,[,参数])
    参数(1) cv2.IMREAD_UNCHANGED (图像不可变)
    参数(2) cv2.IMREAD_GRAYSCALE (灰度图像)
    参数(3) cv2.IMREAD_COLOR (读入彩色图像)
    参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)

    2.显示图像
    显示图像调用函数如下:

    cv2.imshow(窗口名, 图像名)

    3.窗口等待
    调用函数如下:

    cv2.waitKey(delay)
    键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

    4.删除所有窗口
    调用函数如下:

    cv2.destroyAllWindows() 删除所有窗口
    cv2.destroyWindows() 删除指定的窗口

    5.写入图片
    调用函数如下:

    retval = cv2.imwrite(文件地址, 文件名)

    下面代码是读入图片并显示保存。

    # -*- coding:utf-8 -*-
    import cv2
    
    #读取图片
    img = cv2.imread("test.jpg")
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    #写入图像
    cv2.imwrite("testyxz.jpg", img)
    

    输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。

    如果代码中没有watiKey(0)函数,则运行结果如下图所示:

    同时
    可以对代码进行升级,如下所示:

    #无限期等待输入
    k=cv2.waitKey(0)
    #如果输入ESC退出
    if k==27:
        cv2.destroyAllWindows()
    


    三.OpenCV像素处理

    1.读取像素
    灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。

    灰度图像:返回值 = 图像(位置参数)
    eg: test=img[88,42]
    彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
    eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

    2.修改图像
    修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。

    灰度图像:
    img[88,142] = 255
    彩色图像:
    img[88,142, 0] = 255
    img[88,142, 1] = 255
    img[88,142, 2] = 255
    彩色图像:方法二
    img[88,142] = [255, 255, 255]

    下面代码是获取像素及修改的操作。

    # -*- coding:utf-8 -*-
    import cv2
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    test = img[88,142]
    print test
    img[88,142] = [255, 255, 255]
    print test
    
    #分别获取BGR通道像素
    blue = img[88,142,0]
    print blue
    green = img[88,142,1]
    print green
    red = img[88,142,2]
    print red
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    #写入图像
    cv2.imwrite("testyxz.jpg", img)
    

    输出结果如下所示:
    [158 107 64]
    [255 255 255]
    255
    255
    255

    下面代码是将行为100到200、列150到250的像素区域设置为白色。

    # -*- coding:utf-8 -*-
    import cv2
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #该区域设置为白色
    img[100:200, 150:250] = [255,255,255]
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    #写入图像
    cv2.imwrite("testyxz.jpg", img)
    

    运行结果如下图所示:

    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
    (By:Eastmount 2018-08-16 夜11点 https://blog.csdn.net/Eastmount/

    展开全文
  • 在前头:说到数字图像处理,不得不提起MATLAB。这是一款非常方便的仿真软件,绝大多数的图像处理可以用MATLAB完成。  有人问,处理图片,用PS岂不是更好。两者各有优点,如果需要将10000幅图片转换成灰度...

    写在前头:说到数字图像处理,不得不提起MATLAB。这是一款非常方便的仿真软件,绝大多数的图像处理可以用MATLAB完成。
      有人问,处理图片,用PS岂不是更好。两者各有优点,如果需要将10000幅图片转换成灰度图像并保存呢?MATLAB只需要一段很短的程序运行几秒就可以完成这个工作。
    本文基于MatlabR2012a,将由浅入深写下去。

    MATLAB中图像的基本操作

    1、读取、显示图片

    MATLAB中提供了immread()与imshow()函数读取和显示图片。其中读取函数imread()原型:

    imread:
    A = imread(filename, fmt)

    A是结构体名,用来存储读入的图像数据。filename是读取的文件名,文件名要用”括起来。fmt是读取文件的类型如:jpg、png等等,这个参数可以不输入,由MATLAB自动判断。
    显示函数imshow()原型:

        imshow:
        imshow(I)

    I为读取后保存在MATLAB中的结构体名。
    程序实例:  

    A=imread('1.jpg');%读取名为1.jpg的图片
         imshow(A)%显示图片

    这里写图片描述

    2、将灰度图片变成负片

      对图像进行操作,实际上是将图像看成许多个像素点,对每个像素点进行操作。在计算机系统中,灰度图片被看成是许多个由值在[0~255]之间的像素点组成的图像,255表示白色,0表示黑色,黑白之间存在256个灰度级。
    这里写图片描述
      负片是指将原灰度图白色的地方变成黑色,黑色的地方变成白色。也就是将0变成255,255变成0。MALTAB的imadjust()函数提供了该功能。其函数原型:  

    imadjust:
      J = imadjust(I,[low_in; high_in],[low_out; high_out])

      其中,I为原灰度图像,low_in,high_in为输入图像的低和高灰度级,设置为[0,1]表示从0~255的归一化,low_out,high_out为输出图像的低高灰度级。
      若是想将图片转换为负片,那么将[low_in; high_in]设置为[0,1],将[low_out; high_out]设置为[1,0]。即原来输入为0的地方变成1输出,输入为1的地方变成0输出。
      实例: 

     A=imread('1.jpg');
    imshow(A)%显示原图
    A1=imadjust(A,[0,1],[1,0]);%将灰度级对调
    figure,imshow(A1)%显示负片

      这里写图片描述
      

    3、彩色图片转换成灰度图片

      我们在计算机中看到的大多数彩色图片是基于RBG三通道的图片,红绿蓝三种颜色,每一种取值均为[0~255]。通过255*255*255,可以构成庞大的颜色群。而灰度图像只有256个灰度级。通过以下公式可以将RGB转换成灰度
      GRAY=0.2989 R + 0.5870 * G + 0.1140 * B*
      MATLAB中提供的函数rgb2gray为我们提供了将彩色图片转换成灰度图片的功能。函数原型: 

    I = rgb2gray(RGB)

    实例:

     A=imread('001.png');%原彩色图片
    imshow(A)
    A_gray=rgb2gray(A);%转换成灰度图片
    figure,imshow(A_gray)

    这里写图片描述
      

    展开全文
  • 图像处理入门教程

    2018-04-20 19:00:46
    最近有人问我图像处理怎么研究,怎么入门,怎么应用,我竟一时语塞。仔细想想,自己也搞了两年图像方面的研究,做个两个创新项目,发过两篇论文,也算是有点心得,于是总结总结和大家分享,希望能对大家有所帮助。在...
  • 数字图像处理是计算机视觉,视频语义分析的基础知识。要对数字图像进行处理,比如调整灰度级,图像增强,图像模糊等等操作,首先要对图像进行读写操作。用Java对数字图像进行读写比较简单,用ImageIO.read读,用...
  • 图像处理学习之路

    2015-07-29 10:52:41
    经历了半年多的学习,图像处理总算入门了,做了个小项目,将之前所学的都用到了。虽不敢说精通,但该掌握的工具都掌握了,包括图像算法。图像处理虽说不难,但刚开始入门,还是不易的,我也走了不少弯路,希望借鉴给...
  • Matlab图像处理大师淘宝店(QQ:3249726188) 专注、专一于Matlab图像处理 本店绝非中介,本店代码均由本人及硕士师弟代写完成,提供有偿Matlab算法代码编程服务,不从事不违反涉及学术原则的事。 另外,本店的...
  • 最近想把以前做过的数字图像处理实习成一个教程,用的是CBmpFile类,武汉大学遥感信息工程学院的学生也许都会用这个类来实现图像处理,废话就不多说了,直接开始吧。。。  一、图像的显示  VC6.0工程向导创建MFC...
  • Python程序设计 简单的图像处理(1) 1.个滤镜 照片照的好,不如滤镜用得好!一款好的滤镜软件可以让照片呈现不一样的风格乃至风情,修理照片需要扬长避短达到最佳效果。可是滤镜款式千百种,却没有一款专门为你...
  • 最近版上有不少人在讨论图像处理的就业方向,似乎大部分都持悲观的态度。我想结合我今年找工作的经验谈谈我的看法。就我看来,个人觉得图像处理的就业还是不错的。首先可以把图像看成二维、三维或者更高维的信号,从...
  • 数字图像处理找工作

    2018-05-10 19:58:03
    最近版上有不少人在讨论图像处理的就业方向,似乎大部分都持悲观的态度。我想结合我今年找工作的经验谈谈我的看法。就我看来,个人觉得图像处理的就业还是不错的。首先可以把图像看成二维、三维或者更高维的信号,从...
  • (注:本文代码大部分可从《数字图像处理 第三版》中找到)使用软件:MATLAB R2018a学习前提:了解matlab的GUI界面的每个按钮参考资料:《数字图像处理 第三版》,CSDN博客使用初音图片P站画师uid:1589657。...
  • 无论是我们新提出了一个算法,还是我们新学习了一个算法,都可以直接一个程序来检验它的处理效果。而且这种“效果”往往还是一目了然的。因为图像处理的输入和输出都是图像,图像就是用来给人看的。这种直观性是...
  • 图像处理笔试面试题

    2017-12-12 18:20:20
    秋招各种笔试面试,总结下遇到的图像处理和C++的题目。下来的都是能记起来的,记不起来的应该也有不少。大概让没有经历过的人知道会遇到什么样的问题,可以提前准备下。除了一下题目之外,最多的还是围绕着你做过...
  • 图像获取:对图像预处理 图像增强:以对问题的主观判断,对图像进行操作,使得图片比原始图像更适合处理 图像复原:改进图像外观,与图像增强相比,图像复原指的是客观处理图像 ...参考自Gonzalez的《数字图像处理
  • 最近版上有不少人在讨论图像处理的就业方向,似乎大部分都持悲观的态度。我想结合我今年找工作的经验谈谈我的看法。就我看来,个人觉得图像处理的就业还是不错的。首先可以把图像看成二维、三维或者更高维的信号,从...
  • 第 1 章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量...1.1 PIL:Python图像处理类库PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图...
1 2 3 4 5 ... 20
收藏数 167,984
精华内容 67,193