........大学
计算机科学与工程学院
综合设计报告
设计名称: 《图像处理与机器视觉》综合设计
设计题目: 基于Matlab的图像处理系统
专业班级:
学生学号:
学生姓名:
指导教师(职称):
学业导师(职称):
学生成绩:
完成时间:
........大学计算机科学与工程学院 制
说明:
1、报告中的第一、二、三项由综合设计负责人在综合设计开始前填写并发给每个学生。
2、学业导师负责批改学生的设计报告,并给出相应的得分。同时,就设计报告质量撰写评语。
3、指导教师就学生在设计期间的表现及设计完成情况分别给出相应的得分。同时,就此两项情况撰写评语。
4、设计的总评成绩由上述各部分累加得出,由指导教师汇总,并填写于报告的封面。
5、设计报告正文字数一般应不少于5000字,也可由综合设计负责人根据本项综合设计的具体情况酌情增加字数或内容。
6、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各项课程设计),各专业也可根据本项综合设计的特点及内容做适当的调整,并上报学院批准。
课程教学目标
本课程的教学目标是使学生掌握“数字图像处理”中的基础理论与算法,具备常见数学图像处理算法的设计与编程能力,能运用数字图像处理方法解决复杂工程问题。
该目标分解为以下目标:
(一)课程目标
序号 |
课程目标 |
达成途径 |
评价判据 |
1 |
课程目标1:工程知识——熟练运用本专业所需的数学、自然科学、工程基础和智能科学与技术的专业知识解决智能科学与技术领域的工程问题,如数据分析,人机交互,图像处理等。 |
达成途径:综合设计过程中对专业知识进行运用,在报告中对专业知识进行引用。 |
依据综合设计文档、汇报答辩进行评价 |
2 |
课程目标2:能够通过应用数学、自然科学、工程基础和智能科学与技术的专业知识以及文献研究得出针对复杂工程问题的合理结论。 |
达成途径:综合设计过程中运用专业知识,查找文献并进行研究。 |
依据综合设计文档、汇报答辩进行评价 |
4 |
课程目标5:能够针对智能科学与技术复杂工程问题,开发、选择与使用恰当的技术、资源和信息技术工具,包括对智能科学与技术领域复杂工程问题的预测与模拟,并能够理解其局限性。 |
达成途径:通过与老师进行学习与交流,在实际工程项目中实施及开发。 |
依据综合设计文档、汇报答辩进行评价 |
(二)所支撑的毕业要求及对应的指标点
序号 |
支撑的毕业要求 |
对应的毕业要求指标点 |
课程目标 |
1 |
毕业要求1:工程知识——熟练运用本专业所需的数学、自然科学、工程基础和智能科学与技术的专业知识解决智能科学与技术领域的工程问题。 |
指标点1.2:能运用恰当的数学、物理模型,对智能科学与技术领域复杂工程问题进行建模,保证模型的准确性,满足工程计算的实际要求。 |
课程目标1:工程知识——熟练运用本专业所需的数学、自然科学、工程基础和智能科学与技术的专业知识解决智能科学与技术领域的工程问题,比如数据分析,人机交互,图像处理等。 |
2 |
毕业要求2:问题分析——能够应用数学、自然科学、工程基础和智能科学与技术的专业知识,识别、表达智能科学与技术领域的复杂工程问题,并通过文献查阅等多种方式对其进行分析,以获得有效结论。 |
指标点2.3:掌握科技文献、资料的分类;能够通过图书馆、数据库、网上检索等多种方式快速、准确地检索相关信息,具备借助文献研究对复杂工程问题进行识别、表达、分析的能力。 |
课程目标2:能够通过应用数学、自然科学、工程基础和智能科学与技术的专业知识以及文献研究得出针对复杂工程问题的合理结论。 |
毕业要求5:使用现代工具——能够针对智能科学与技术复杂工程问题,开发、选择与使用恰当的技术、资源、现代工程工具和信息技术工具,包括对智能科学与技术领域复杂工程问题的预测与模拟,并能够理解其局限性。 |
指标点5.3:掌握智能科学与技术专业设备的基本原理、操作方法,能够在复杂工程中合理选择和使用智能科学与技术专业设备。 |
课程目标5:能够针对智能科学与技术复杂工程问题,开发、选择与使用恰当的技术、资源和信息技术工具,并能够理解其局限性。 |
成绩评定表
学生姓名: 学号: 班级:
序号 |
考核内容及权重 |
课程目标 |
评分标准 |
实际 得分 |
|
1 |
工程知识30分 |
课程目标1 |
熟练运用本专业所需的数学、自然科学、工程基础和智能科学与技术的专业知识解决智能科学与技术领域的工程问题 |
学业导师 |
|
2 |
问题分析40分 |
课程目标2 |
能够应用数学、自然科学、工程基础和智能科学与技术的专业知识,识别、表达智能科学与技术领域的复杂工程问题,并通过文献查阅等多种方式对其进行分析,以获得有效结论。 |
指导导师 |
|
5 |
使用现代工具30分 |
课程目标5 |
理解并掌握工程管理原理与经济决策方法,并能在多学科、跨职能环境中合理应用。 |
指导老师 |
|
学业导师签字: |
指导老师签字: |
||||
总评成绩 |
一、综合设计目的、条件、任务和内容要求: 1、设计目的 提高分析问题、解决问题的能力,进一步巩固数字图像处理课程中的基本原理、方法与实现。 熟悉掌握一门计算机语言,可以进行数字图像处理应用的设计。 2、设计任务 选题1: 《基于Matlab的图像处理系统》 ——使用Matlab的GUI功能实现多种图像处理方法 整个系统要完成的基本功能如下:
3、选题2 《汽车车牌中的数字识别》 ——基于XXX的图像处理应用 整个系统要完成的基本功能如下:
4、综合设计方案制定
5、综合设计的一般步骤
6、要求:
这部分主要说明本综合设计的目的、任务和要求;
介绍系统中所设计的主要功能和原理方法;
根据综合设计的具体情况,描述系统的具体构架,包括:功能模块的划分、系统运行的环境、选用的工具以及实现功能的原理。
主要的功能实现和函数要进行详细的说明,包括其用法,使用范围以及参数等。
按照综合设计的要求,选用多幅图像对程序进行测试,并提供系统的主要功能实现的效果图,并在调试中发现问题,并做说明,并进一步总结规律。
主要说明设计中学到的东西和取得的经验总结、心得体会。
写出具体的主要参考文献,标注作者、出处、年代,若为期刊文章,需给出期刊名称,网络引用给出网址。
综合设计成绩考核采用:优、良、中、及格、不及格五级评分制,评分标准如:
另外,对于请人代做,完全照抄他人课题以不及格处理。
|
||||||||||||||
二、进度安排:
|
||||||||||||||
三、应收集资料及主要参考文献: [1] RafaelC.Gonzalez, RichardE.Woods, StevenL.Eddins. 数字图像处理(MATLAB版)[M]. 电子工业出版社, 2005. [2] 张铮,徐超,任淑霞. 数字图像处理与机器视觉--VISUAL C++与MATLAB实现(第2版)(附光[M]. 人民邮电出版社, 2014. [3] 杨淑莹. VC++图像处理程序设计(第2版)[M]. 清华大学出版社, 2005. [4] 胡小锋, 赵辉. Visual C++/MATLAB图像处理与识别实用案例精选[M]. 人民邮电出版社, 2004. [5] JanErikSolem, 索利姆, 朱文涛,等. Python计算机视觉编程[M]. 人民邮电出版社, 2014. [6] 张德丰. MATLAB数字图像处理[M]. 机械工业出版社, 2009. |
||||||||||||||
摘 要 II
Abstract III
第一章 课题背景. 1
1.1 设计目的. 1
1.2 MATLAB的背景. 2
1.3机器视觉原理及应用. 3
第二章 设计简介及设计方案论述. 6
2.1 设计功能及分析. 6
2.2设计方案. 7
第三章 详细设计. 8
3.1 各种图像处理方法的实现. 8
3.1.1 选项. 8
3.1.2基础图像操作. 10
3.1.3图像增强操作. 12
3.1.4图像分割. 15
3.1.5图像变换. 17
3.1.6形态学处理. 19
3.1.7噪声处理. 21
3.1.8二值图像的处理及图像复原. 22
第四章 设计结果及分析. 24
4.1 主界面显示. 24
4.2各功能图像显示及分析. 24
总 结 36
致 谢 37
参考文献 38
附录 主要程序代码. 39
摘 要
在如今的信息社会中,数字图像信息成为了人类获取信息的重要来源以及处理信息的重要手段。数字图像处理学科是科学研究,社会生产和人类发展不可缺少的必要工具,在理论或实践上都存在巨大的潜力。
数字图像处理技术已经在各个领域上都有了比较广泛的应用,本身是一种通过计算机采用一定的算法对图形图像进行处理的技术。由于MATLAB强大的运算和图形展示功能,可用于处理对处理速度要求高,信息量的图片,使得图像处理变得更加简单和直观。
下面将介绍MATLAB软件,基于MATLAB的数字图像处理环境和如何使用MATLAB并如何使用图像处理工具进行数字图像处理。论述利用MATLAB如何实现图像显示,图形表变换。支持索引图像、灰度图像、二值图像、RGB、BMP、GIF、JPEG、TIFF、PNG等文件格式的读、写显示数字图像的统计,增强处理,分割,变换,以及二值图像的处理功能。
关键词:MATLAB数字图像处理;图像增强;二值图像;图像变换;图像复原
Abstract
In today's information society, digital image information has become an important source of information and an important means of information processing. Digital image processing is an indispensable tool for scientific research, social production and human development. It has great potential in theory and practice.
Digital image processing technology has been widely used in various fields. It is a technology that uses certain algorithms to process graphics and images through computers. Because of the powerful operation and graphic display functions of MATLAB, it can be used to process images with high processing speed and information, making image processing more simple and intuitive.
The following will introduce MATLAB software, digital image processing environment based on MATLAB and how to use MATLAB and image processing tools to process digital images. This paper discusses how to use MATLAB to realize image display and graph table transformation. It supports the statistics, enhancement processing, segmentation, transformation, and binary image processing functions of reading and writing digital images in index images, gray-scale images, binary images, RGB, BMP, GIF, JPEG, TIFF, PNG and other file formats.
Keywords: MATLAB digital image processing; Image enhancement; Binary image; Image transformation; image restoration
1.1 设计目的
数字图像处理是指利用数字计算机或其他数字硬件,对图像信息转换得到的电信号进行某种数学运算,以提高图像的实用性。例如,从监控图像中提取对象的特征参数,并且重建三维断层图像。数字图像处理一般包括点运算、几何处理、图像增强、图像恢复、图像形态学处理、图像编码、图像重建、模式识别等。
由于计算机处理能力的不断增强,数字图像处理学科发展迅速,并且也越来越广泛地迅速渗透到其他许多学科中,使得图像作为信息的获取和信息的利用越来越重要。目前,数字图像处理的应用越来越广泛,已经渗透到工业、医疗、航空航天、军事等领域,在国民经济中发挥着越来越重要的作用。MathWorks推出的MATLAB软件。MATLAB的界面简化和丰富、实用、高效的指令和模块的应用,可以使操作者快速了解和理解图像处理的相关概念,逐步掌握图像信号处理的基本方法,进而解决工程和科研中的相关问题。图像是人类获取和交流信息的主要来源。因此,图像处理的应用领域必然涉及到人类生活和工作的方方面面。随着人类活动范围的不断扩大,图像处理的应用领域也将不断扩大,数字图像处理对于人类的作用将是无限的。
数字图像处理,即使用计算机对图像进行处理,是指经过空间采样和幅值量化后将图像信号转换成数字信号的过程,又称为计算机图像处理。数字图像处理技术源于 20 世纪 20 年代,当时通过海底电缆从英国伦敦传输了一幅照片到美国纽约,其中采用了数字压缩技术。数字图像处理作为一门学科大约形成于 20 世纪 60 年代初期,早期图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目标。首次获得巨大成功的是美国喷气推进实验室(JPL),他们对航天探测器徘徊者 7 号在 1964 年发回的几千张月球照片使用了图像处理技术,并由计算机成功地绘制出月球表面地图,随后又对探测飞船发回的近十万张照片进行更为复杂的图像处理,获得了月球的地形图、彩色图及全景镶嵌图等,为人类登月创举奠定了坚实的基础。在以后的宇航空间技术,如对火星、土星等星球的探测研究中,数字图像处理技术都发挥了巨大的作用。1972 年,利用图像重建,根据人的头部截面的投影,经计算机处理来重建截面图像的用于头颅诊断的 X 射线计算机断层摄影装置,即 CT(Computer Tomograph),由英国EMI公司 工 程 师 Housfield 发 明。1975 年EMI 公司又成功研制出全身用的 CT 装置,获得了人体各个部位鲜明清晰的断层图像。1979年,这项无损伤诊断技术获得了诺贝尔奖。 随着图像处理技术的深入发展,从 70 年代中期开始,随着计算机技术和人工智能、思维科学研究的迅速发展,数字图像处理向更高、更深层次发展。近年来,人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。图像理解虽然在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,由于人类本身对自己的视觉过程还了解较少,因此计算机视觉是一个有待人们进一步探索的新领域。
MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室),软件主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式。
MATLAB在数学类科技应用软件中在数值计算方面首屈一指。行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等。MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。可用于科学计算和工程绘图。新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。
还包含一些常用的的工具箱:MATLAB包括拥有数百个内部函数的主包和三十几种工具包。工具包又可以分为功能性工具包和学科工具包。功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能。学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类。
(1)高效的数值计算和符号计算功能,能使用户从繁杂的数学运算分析中解脱出来。
(2)具有完备的图形处理功能,实现计算结果和编程结果的可视化。已友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握。
(3)功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等),为用户提供了大量方便实用的处理工具。其图形处理能力也尤为的突出,MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形的方式表现出来,并且可以对图形进行标注和打印, 高层次的作图包括二维和三维的可视化、图像处理、动画和表达式作图。新版本的MATALAB对整个图形处理功能作出了很大的改进和完善,使它不仅仅在般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加元善,而且对于-些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到。
机器视觉检测采用CCD摄相机将被检测的目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度、颜色等信息,转变成数字化信号,图像处理系统对这些信号进行各种运算来抽取目标的特征,如面积、数量、位置、长度,再根据预设的允许度和其他条件输出结果,包括尺寸、角度、个数、合格 / 不合格、有 / 无等,实现自动识别功能。
机器视觉的应用主要有检测和机器人视觉两个方面:
1检测:又可分为高精度定量检测(例如显微照片的细胞分类、机械零部件的尺寸和位置测量)和不用量器的定性或半定量检测(例如产品的外观检查、装配线上的零部件识别定位、缺陷性检测与装配完全性检测)。
2机器人视觉:用于指引机器人在大范围内的操作和行动,如从料斗送出的杂乱工件堆中拣取工件并按一定的方位放在传输带或其他设备上(即料斗拣取问题)。至于小范围内的操作和行动,还需要借助于触觉传感技术。
此外还有:自动光学检查、人脸识别、无人驾驶汽车、产品质量等级分类、印刷品质量自动化检测、文字识别、纹理识别、追踪定位等等。
等机器视觉图像识别的应用。
1 纸币印刷质量检测系统:
该系统利用图像处理技术,通过对纸币生产流水线上的纸币20多项特征(号码、盲文、颜色、图案等)进行比较分析,检测纸币的质量,替代传统的人眼辨别的方法。
2 智能交通管理系统:
通过在交通要道放置摄像头,当有违章车辆(如闯红灯)时,摄像头将车辆的牌照拍摄下来,传输给中央管理系统,系统利用图像处理技术,对拍摄的图片进行分析,提取出车牌号,存储在数据库中,可以供管理人员进行检索。
3金相分析:
金相图象分析系统能对金属或其它材料的基体组织、杂质含量、组织成分等进行精确、客观地分析,为产品质量提供可靠的依据。
4 医疗图像分析:
血液细胞自动分类计数、染色体分析、癌症细胞识别等。
5 瓶装啤酒生产流水线检测系统:
可以检测啤酒是否达到标准的容量、啤酒标签是否完整
6 大型工件平行度、垂直度测量仪:
采用激光扫描与CCD探测系统的大型工件平行度、垂直度测量仪,它以稳定的准直激光束为测量基线,配以回转轴系,旋转五角标棱镜扫出互相平行或垂直的基准平面,将其与被测大型工件的各面进行比较。在加工或安装大型工件时,可用该认错器测量面间的平行度及垂直度。
7 螺纹钢外形轮廓尺寸的探测器件:
以频闪光作为照明光源,利用面阵和线阵CCD作为螺纹钢外形轮廓尺寸的探测器件,实现热轧螺纹钢几何参数在线测量的动态检测系统。
8轴承实时监控:
视觉技术实时监控轴承的负载和温度变化,消除过载和过热的危险。将传统上通过测量滚珠表面保证加工质量和安全操作的被动式测量变为主动式监控。
9 金属表面的裂纹测量:
用微波作为信号源,根据微波发生器发出不同波涛率的方波,测量金属表面的裂纹,微波的波的频率越高,可测的裂纹越狭小。
使用MATLAB的GUIDE命令调用GUI程序设计功能,用来设计图像处理程序。此程序拥有常用的函数处理功能,满足常用的图片处理。设计图形化界面的窗口如下所示图2-1所示。现设计程序有以下的一些功能:
图2-1
(1)选项:包括打开图片,选择图片,清楚图片,保存图片,退出系统的功能。
(2)基本图像操作:直方图统计、绘制与直方图均衡化操作,包括原始图像、灰度化图像、灰度化图像、二值化图像、放大缩小图像、图像的旋转功能(水平旋转,垂直旋转,任意角度旋转)等功能。
(3)图像增强操作:空域中的运算(中值滤波器(3×3、7×7模板)、均值滤波器(3×3、7×7模板)、高斯低通滤波器,理想低通滤波器),频域中的运算(低通滤波、高通滤波)。
(4)图像分割:Sobel算子(对灰度图像的水平梯度算子、垂直梯度算子以及水平垂直叠加图,还有对二值图像的Sobel算子)、Canny算子、Prewitt算子、Roberts算子,拉普拉斯(Laplace算子对灰度图像的处理)、区域分割(基于阈值分割,采用迭代法求阈值)等功能。
(5)图像变换:傅里叶变换(DFT)、小波变换(DWT)、余弦变换(DCT)等功能。
(6)形态学操作:膨胀,腐蚀,开运算,闭运算。
(7)噪声处理:椒盐噪声、泊松噪声、高斯噪声、伽马噪声、指数噪声、乘性噪声、均匀噪声、瑞利噪声。
首先通过MATLAB的命令行窗口输入命令guide,并创建GUI界面,然后会生成一个.fig文件和一个.m文件。其中.fig文件中就是GUI界面的具体组件设计的可视化,通过拖动各种组件,来实现界面上组件的设计,双击组件可以打开每个组件的检查器(也就是各个组件的属性框)。在属性框中的每一项属性可以通过鼠标来进行设置。还有另一些功能,比如对齐功能,布局功能,颜色布局等可以用来增加设计界面的美观程度。在.fig文件对按键通过点击鼠标右键,会出现Callback回调函数,通过其可以找到在.m文件中函数的功能。主要解决自己在.fig中的各个组件之间联系起来,通过内置的函数功能Set还有get来设置某个组件的属性或者是获得某个属性的值从而将各个组件联系起来。
其次在.fig文件通过拖动各种组件,通过设计菜单栏,来修改各个部分的属性,比如字体大小、组件背景框的颜色,取值范围等等。首先我们需要将功能进行模块化,即将具有一类功能设计成菜单项,根据具体的功能设计设计多菜单、这样就完成了菜单栏的设计。在.fig文件中有设计坐标轴的功能,即通过坐标区按键,设计两个显示窗口即axes.g1和axes.g2用来显示原来图片和处理过的图片、以及示波器下的三个显示窗口axes.g3、axes.g4、axes.g5。有些操作需要一些参数值,需要可编辑文本框,还有可选的按钮。如果需要动态的知道参数的影响范围,可以设置几个滑动条,如图2-2所示,通过滑动条来改变参数的值,进而产生动态的效果,便于处理和研究。
图2-2
然后通过每个按键的Callback回调函数在.m文件中设计函数功能。比如:灰度化图像、二值化图像,图像分割,各种算子的处理操作,各种噪声处理,图像变换处理等。
最后运行GUI运行代码,通过图像处理程序,不断观察和修改系统中存在的BUG使得功能更加完善。程序流程图如图2-3 GUI程序设计流图所示:
图2-3 MATLAB程序设计流图
首先在MATLAB的GUI中建立两个坐标区axes.g1和axes.g2分别表示原图像与处理后的图像,通过set()函数对每一个对象进行初始化,每种对象的每个属性规定了一个名字,称为属性名,属性名的取值成为属性值。初始化窗口的核心代码为:
handles.output = hObject;
set(handles.save,'Enable','off');
set(handles.exit,'Enable','off');
set(handles.reset,'Enable','off');
set(handles.g1,'Visible','off');
set(handles.g2,'Visible','off');
set(handles.g3,'Visible','off');
set(handles.g4,'Visible','off');
set(handles.g5,'Visible','off');
guidata(hObject, handles);
对于全局变量的设置为
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
Handle.img为读取的原图,用numel表示其通道数,如果通道数大于2。然后用rgb2gray函数将其变为灰度图用变量I来表示handle.img的灰度图,它们都是uint8型的矩阵。
(1)选择图片
采用uigetfile函数实现界面选择文件,选择图片之后进行一些图片的初始化操作,例如灰度化、二值化,其回调函数为
[file path]=uigetfile({'*.jpg';'*.bmp';'*.jpeg';'*.png'}, '打开文件');
image=[path file];
handles.file=image;
if (file==0)
warndlg('请选择一张图片...') ;
end
[fpath, fname, fext]=fileparts(file);
validex=({'.bmp','.jpg','.jpeg','.png'});
axes(handles.g1);
cla;
imshow(handles.img);
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
break;
end
end
found=0;
for (x=1:length(validex))
if (strcmpi(fext,validex{x}))
found=1;
if (found==0)
errordlg('文件扩展名不正确,请从可用扩展名[.jpg、.jpeg、.bmp、.png]中选择文件','Image Format Error');
end
此函数从文件夹中读取图片,其中validex为文件选择类型(.jpg、.bmp、.jpeg、.png),
下面用for循环和if语句来选择图片符合操作,如果不符合操作会弹出窗口:文件名扩展不正确。
(2)保存图片
保存图像操作用到uiputfile()函数,用来实现保存图片的可视化,将图片统一转化为.jpg格式用save()和imwrite()函数将图片进行保存和转化。其回调函数为:
function save_Callback(hObject, eventdata, handles)
[file path]= uiputfile('*.jpg','Save Image as');
save=[path file]; imwrite(handles.img,save,'jpg');
用uiputfile()读取图片路径,并弹出窗口为“Save Image as”,用save函数对路径进行保存,最后imwrite()对图片进行图片格式化操作,转化为jpg格式。
(3)退出图像
回调函数为:
function exit_Callback(hObject, eventdata, handles)
close all;
直接用close all操作用以清除所有变量,从而完成退出系统操作。
(4)图像清除功能
回调函数为:
function reset_Callback(hObject, eventdata, handles)
handles.img=handles.i;
axes(handles.g2);
cla;
imshow(handles.img);
updateg4(handles);
guidata(hObject,handles);
用cla命令,清除坐标轴中的图形,且不关闭坐标轴。清除之后,用imshow()函数显示图片,用update()函数对图片进行更新,最后用guidata存储该结构,对中间的属性做更改了。
(1)直方图显示:
直方图又称质量分布图。是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。在统计数据时,按照频数分布表,在平面直角坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。比如你的图像是0-255像素的分布,那么直方图横坐标表示像素的分布,纵坐标表示每个像素出现的频率
回调函数为:
function pushbutton39_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
if I==0
msgbox('没有可输出的图像','error');
return;
end
if size(I,3)~=1
I=rgb2gray(I);
end
axes(handles.g2);
imhist(I)
guidata(hObject,handles);
代码分析:通过mysize对象读取handle.img的大小,再判断通道数是否为RGB三通道,如果是将其通过rgb2gray()函数转化为灰度图的形式。如果对象I的信息不存在,会弹出窗口显示‘没有可输出的图片’,对于显示直方图,我直接调用函数imhist()。对于imhist()函数直接统计该图的直方图,灰度级别256个等级。
(2)直方图的均衡化操作
直方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。从而达到清晰图像的目的。步骤为:
1.确定图像的灰度级,在实际情况下,如果我们的图像是彩色,需要将其转换为灰度图像,其中的灰度级一般是0-255,假设图像灰度级只有8级,需要注意下
2:计算原始直方图的概率,统计每一个灰度在原始图像上的像素所占总体的比例,记为Pi。
3:计算直方图概率的累加值S(i),直到最后一个灰度级,总和为1
4: 根据公式求取像素映射关系,这里的pix是指的灰度级,也就是(最大灰度级-最小灰度级)*累加概率+0.5后取整数
5: 灰度映射,找到了原图像和均衡化图像灰度的对应关系,对原图进行操作,将每个像素映射成新的像素
此时图像均衡化已经完成,观察一下结果。
回调函数如下:
function pushbutton51_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
img=handles.img;
img1=histeq(img);
axes(handles.g2);
cla;
imshow(img1);
其中图像处理的关键代码为img1=histeq(img),其用法为
步骤1:计算原始图像I的累积函数A(g),其中g=[0,255]表示256个灰度级。
A(0)就是灰度级为0的元素个数;A(1)就是灰度级为0和1的元素个数和;A(2)就是灰度级为0、1和2的元素个数和;依次类推;A(255)就是X,即原始图像的总的像素个数。
步骤2:计算原始直方图和均衡化后直方图的映射关系g->G,即将原始图像中的灰度值g变成新的灰度值G。
这里,G=N*A(g)/X
步骤3:遍历原始图像I,依据步骤2中的映射关系,把所有像素点的灰度值变成新的灰度值,完毕。
(1)中值滤波器
中值滤波就是一种低通滤,其是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。所以能够消除图像篡改的噪音。用于数字图像反取证。
Medfilt2()函数为中值滤波器功能函数,[3,3]为3×3模板,其回调函数的核心代码为:
r=medfilt2(handles.img(:,:,1));
g=medfilt2(handles.img(:,:,2));
b=medfilt2(handles.img(:,:,3));
handles.img=cat(3,r,g,b);
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
(2)均值滤波器
设置模板大小,初始为全为1的矩阵,将模板扫描灰度化图片,对应位置相乘求和取均值,将该值赋给当前模板的中心,用到imfilter()函数进行均值化,其回调函数的代码为:
function f1_Callback(hObject, eventdata, handles)
h=fspecial('average');
handles.img=imfilter(handles.img,h,'replicate');
axes(handles.g2); cla; imshow(handles.img)
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
(3)理想低通滤波器
去除了图像的高频部分,即细节信息,留下的低频信息代表了概貌。首先确定D0的大小(阈值),将灰度化图像转换为频域上(傅里叶变换),在频率域上计算在一半大小中每一个距离频域中心的距离D,若D大于D0则该位置赋值为0,否者为1,然后通过傅里叶的逆变换变化回到空间域上,其回调函数的核心代码为:
function p2_Callback(hObject, eventdata, handles)
%理想低通滤波器
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
M=2*size(I,1);
N=2*size(I,2);
u=-M/2:(M/2-1);
v=-N/2:(N/2-1);
[U,V]=meshgrid(u,v);
D=sqrt(U.^2+V.^2);
D0=80;
H=double(D<=D0);
J=fftshift(fft2(I,size(H,1),size(H,2)));
K=J.*H;
L=ifft2(ifftshift(K));
L=L(1:size(I,1),1:size(I,2));
handles.img=L;
首先将图像转化为灰度图像,确定D0阈值的大小为80,求出D的距离,用fft()函数进行傅里叶变换,再用ffthsift()函数通过将零频分量移动到数组中心,最后通过ifft2()进行傅里叶逆变换回到空间域上。
(4)高斯滤波器
高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。通过高斯函数,带入D0,D等参数算出的h的值,去乘以相应频域上的值赋给当前频域上的位置,其回调函数的核心代码为:
% --- Executes on button press in f2.
function f2_Callback(hObject, eventdata, handles)
hsize=[8 8]; sigma=1.7;
h=fspecial('gaussian',hsize,sigma);
handles.img=imfilter(handles.img,h,'replicate');
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
其中关键的核心代码为:
h=fspecial('gaussian',hsize,sigma);
handles.img=imfilter(handles.img,h,'replicate');
'gaussian',为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3]。
(5)巴特沃斯低通滤波器:
巴特沃斯低通滤波器与高斯滤波器相似,其低通公式不同。频域图像增强是将图像通过变换函数从空域转换为频域,在频域空间里对图像进行滤波处理实现图像增强,再由逆变换函数转换回空域图像的过程。 巴特沃斯滤波是频域滤波图像增强的一种。
回调函数:I=fftshift(fft2(double(rgb2gray(image))));
[m,n]=size(I);
N=2;
D0=30;
x=floor(m/2);
y=floor(n/2);
for i=1:m
for j=1:n
dist=sqrt((i-x)^2+(j-y)^2);
h=1/(1+0.414*(dist/D0)^(2*N));
I(i,j)=h*I(i,j);
End;
End;
I=uint(real(ifft2(iffshitt(I))));
axes(handles.g2);
imshow(I);
tiltle(‘巴特沃斯低通滤波器 D0=30,N=2’,‘color’,‘r’);
(1)各种算子的处理(Roberts算子、prewitt算子、Canny算子、Sobel算子、LOG算子、Laplace算子对二值图像进行边缘提取)。这些算子的实现是通过MATLAB的edge()函数进行实现的。
它们本质区别是所用的模板不同,各类边缘检测的原理大体都是相似的,让模板遍历整个图像的区域,将求和的结果赋给当前模板的中心位置,最后得到所得的最终图像。 Sobel算子的水平梯度算子模板为:[1,0,-1,2,0,-2;1,0,-1],Sobel算子的垂直梯度的模板算子为[1,2,1;0,0,0;-1,-2,-1],Sobel算子就是这两个梯度的图像进行相加,Sobel算子的回调函数如下:
mysize=size(handles.img);
if numel(mysize)>2
handles.img=rgb2gray(handles.img);
end
handles.img=edge(handles.img,'sobel');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
其他的算子(Roberts、Prewitt、Canny、LOG)的回调函数与Sobel算子的回调函数相似。
(2)Laplace算子:
Laplace算子是对灰度化图像进行边缘化提取。Laplace的算子模板如图3-1所示,原理与Sobel算子相似。处理之前先对图像的像素值进行归一化处理,首先用函数rgb2gray()将图片转化为灰度图然后用模板,变量遍历图像。新像素的值为四领域的像素值之和减去中心的像素值。
图3-1 拉普拉斯算子滤波器模板图
其回调函数的核心代码为:
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
[M,N]=size(I);
B=zeros(size(I));
for x=2:M-1
for y=2:N-1
B(x,y)=I(x+1,y)+I(x-1,y)+I(x,y+1)+I(x,y-1)-4*I(x,y);
end
end
B=im2uint8(B);
(3)阈值分割
阈值分割是常见的直接对图像进行分割的算法,根据图像像素的灰度值的不同而定。 对应单一目标图像,只需选取一个阈值,即可将图像分为目标和背景两大类,这个称为单阈值分割;如果目标图像复杂,选取多个阈值,才能将图像中的目标区域和背景被分割成多个,这个称为多阈值分割,此时还需要区分检测结果中的图像目标,对各个图像目标区域进行唯一的标识进行区分。其回调函数如下:
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
img=handles.img;
prompt = {'请输入阈值大小:'};%阈值大小设定
title ='输入';
numlines = [1 35];
def = {'120'};
answer = inputdlg(prompt,title,numlines,def);
a = str2num(answer{1});
I = img > a;
img = I;
axes(handles.g2);
cla;
imshow(img);
guidata(hObject,handles);
此回调函数是基于手动输入的阈值进行区域分割。
阈值分割技术属于区域分割,阈值分割获取阈值的两种方法,一种是迭代法求阈值和Ostu算法求阈值。
其中迭代算法的基本思想为:首先为全局阈值T选着一个初始的估计值(图像的平均灰度),将划分两部分的像素集合,分别为R1(灰度值大于T)和R2(灰度值小于T),随后计算R1和R2的平均灰度值m1和m2,并计算一个新的阈值T=1/2(m1+m2),重复前面的步骤,直到T值不在变换或者变化很微小为止,最终得到阈值T。
Otsu算法的基本原理是寻找最佳阈值将图像的灰度直方图分割为两部分、使得两部分的方差取得最大值,也就是分离性最大。
(1)傅里叶变换(DFT)
傅立叶变换用正弦波作为信号的成分。傅立叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。其回调核心代码如下:
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);%将图片进行灰度化
end
I=handles.img;
F=fft2(I);%傅里叶变换
Fs=fftshift(F);
F1=log(abs(Fs)+1);%取模并进行缩放
axes(handles.g2)
imshow(F1,[]);
guidata(hObject,handles)
(2)小波变换(DWT,基于Haar小波)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
[ca1,chd1,cvd1,cdd1] = dwt2(X,'bior3.7'); %进行单层小波分解
set(0,'defaultFigurePosition',[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])
axes(handles.axes1);
imshow([ca1,chd1;cvd1,cdd1]); %显示小波变换分量组合图像
title('小波变换分量组合图像')
guidata(hObject,handles);
其中dw2函数为MATLAB中的小波变换函数。
(3)余弦变换(DCT)
其回调函数的核心代码如下:
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
s=size(I);
M=s(1);
N=s(2);
% B=dctmtx(n)建立n*n的离散余弦变换矩阵B,其中n是一个正整数
P=dctmtx(M);
Q=dctmtx(N);
J=P*I*Q';% 通过离散余弦变换矩阵定义B=P*A*Q计算矩阵A的离散余弦变换
K=dct2(I);
E=J-K;% 两种方法计算出的离散余弦系数之差
find(abs(E)>0.000001)% 查找系数差的绝对值大于0.000001(命令行显示:空的 0×1 double 列向量--说明两种方法计算出的离散余弦系数基本相同)
axes(handles. g2);
imshow(K);
其中dctmtx()为Matlab中的图像余弦变换函数。
(1)膨胀
图像膨胀是一种基本的形态学运算,其中膨胀类似与‘领域扩张’,将图像的高亮区域或白色区域进行扩张,其中运行结果图比原图的高亮区域更大。其边缘变得平滑很多,其原理就是用膨胀模板去遍历二值图像。当模板与区域有交集时,则当前模板中心的值赋值为1,而1为二值图像的白色,故白色区域会更大。
膨胀的运算符号为+,A用B来膨胀写作A+B,这里先将A和B看作所有取值为1的像素点的集合。其定义如图3-2所示:
图3-2 膨胀公式
其回调函数的核心代码:
handles.mori=handles.img;
str=strel(handles.strel,handles.value);
handles.mori=imdilate(handles.mori,str);
axes(handles.g2);
cla;
imshow(handles.mori)
guidata(hObject,handles);
handles.img=handles.mori;
mysize=size(handles.img);
guidata(hObject,handles);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
其中str为膨胀的模板,imdilate为MATLAB中的膨胀函数。
(2)腐蚀
腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。简单讲,腐蚀把白区域变细,其直观感受就是使得二值图像的白色区域变得更少,边缘变得平滑。首先通过腐蚀模板去遍历一个二值图像,当模板被白色区域完全覆盖时,把当前模板的中心位置的值赋值为1,其余的地方赋值为0,而0为原来二值图像的原色,所以说白色区域会变。
腐蚀的算符为H,A用B来腐蚀写作AHB。其定义如图3-3所示:
图3-3 腐蚀公式
其回调函数的核心代码为:
handles.mori=handles.img;
str=strel(handles.strel,handles.value);
handles.mori=imerode(handles.mori,str);
axes(handles.g2);
在MATLAB图像工具箱中提供了imerode函数实现图像的腐蚀操作。
(3)开运算
开运算其实就是对二值图像先进行腐蚀操作然后再进行膨胀操作,其回调函数的核心代码:
I=handles.img;
axis on; %显示坐标系
se=strel('square',6); %采用半径为6的矩形作为结构元素
I1=imopen(I,se); %开启操作
axes(handles.g2);
imshow(I1);
title('开启运算后图像');
其中,se为开运算模板,strel为构造某种形状的矩阵函数,imopen()为MATLAB中开运算函数。
(4)闭运算
闭运算其实是先对二值图像进行膨胀然后再进行腐蚀的操作,其回调函数的核心代码为:
I=handles.img;
axis on; %显示坐标系
se=strel('square',6); %采用半径为6的矩形作为结构元素
I2=imclose(I,se); %闭合操作
axes(handles.g2);
imshow(I2);
title('开启运算后图像');
其中,se为闭运算的模板,strel为构造某种形状矩阵的函数,imclose()为MATLAB中的闭运算函数。
(1)椒盐噪声
椒盐噪声一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。
其核心回调函数代码为:
handles.img = imnoise(handles.img,'salt & pepper',0.02);
axes(handles.g2);
cla;
imshow(handles.img);
其中imnoise函数为MATLAB中专门指定的图像中添加噪声的函数,修改参数为“salt & pepper”,进而修改噪声的类型。
(2)高斯噪声
高斯噪声指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。
handles.img = imnoise(handles.img,'gaussian');
axes(handles.g2);
cla;
imshow(handles.img);
imnoise函数为MATLAB中专门指定的图像中添加噪声的函数,修改参数为“gaussian”,进而修改噪声的类型。
(3)泊松噪声
泊松噪声就是符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。
核心回调代码为:
handles.img = imnoise(handles.img,'poisson');
axes(handles.g2);
cla;
imshow(handles.img);
在imnoise函数修改参数为‘poisson’,来改变噪声类型。
(4)斑点噪声
斑点噪声在图像上表现为信号相关的小斑点。
其核心回调代码如下:
handles.img = imnoise(handles.img,'speckle',0.04);
axes(handles.g2);
cla;
imshow(handles.img);
在imnoise函数后面修改speckle,改为斑点噪声。
二值图像操作只返回与二值图像形式与结构有关的信息,如果希望对其他类型的图像进行同样的操作,则首先将其转换为二进制的图像格式,可以通过调用MATLAB提供的im2bw()函数来实现,方法如下
thresh = graythresh(handles.img); %自动确定二值化阈值
handles.img = im2bw(handles.img,thresh);:
(2)图像复原
在实际的日常生活中,人们要接触很多图像,画面。而在景物成像这个过程里可能会出现模糊、失真或混入噪声,最终导致图像质量下降,这种现象称为图像退化。因此我们可以采取--些技术手段来尽量减少甚至消除图像质量的下降,还原图像的本来面目,即在预定义的意义上改善给定的图像,这就是图像复原。图像复原和图像增强有很密切的关系,他们的目的都是在某种意义.上对图像进行改进,既改善了图像视觉效果,又便于后续处理。引起图像模糊有多种多样的原因,举例来说有运动引起的,高斯噪声引起的,斑点噪声引起的,椒盐噪声引起的等等。
图像的退化模型如图3-4所示:
图3-4 图像的退化模型
上图中用退化函数把退化过程模型化,它和加性噪声项一起,作用于输入图f(x,y),产生一副退化的图像g(x,y) ,其退化图像公式g(x,y)= H[f(x,y)]+ n(x,y)。给定g(x,y)、一些关于退化函数H的知识以及一些关于加性噪声n(x,y)的知识,复原的目标就是得到原图像的一个估计。我们要是这个估计尽可能地接近原始的输入图像。通常,我们对H和η知道越多,f(x,y) 就越接近f(x,y)。
(3)维纳滤波复原
当退化图像的噪声比较小,即轻质降质,采用逆滤波复原可以获得较好的结果,但图像中含有噪声时,效果就不太好,这时,我们采用维纳滤波结合噪声的先验统计信息来解决这个问题。其回调函数的核心代码为:
I=handles.img;
I=im2double(I);
LEN=20;%参数设置
THETA=10;
PSF=fspecial('motion',LEN,THETA);%产生PSF
J=imfilter(I,PSF,'conv','circular');%运动模糊
noise=0.03*randn(size(I));
K=imadd(J,noise);%添加噪声
NP=abs(fft2(noise)).^2;
NPower=sum(NP(:))/prod(size(noise));
NCORR=fftshift(real(ifft2(NP)));
IP=abs(fft2(I).^2);
IPower=sum(IP(:))/prod(size(I));
ICORR=fftshift(real(ifft2(IP)));
L=deconvwnr(K,PSF,NCORR,ICORR);
handles.img=L;
先在原图中添加噪声,使用deconvwnr函数实现维纳滤波。若复原图像呈现出由算法中使用的离散傅里叶变换所引入的振铃,则它往往会提醒我们需要调用edgetaper函数进行预处理。
设计完成后的.fig文件及菜单栏,如图4-1所示:运行.m文件,即编写回调函数的那个文件,即可以出现主界面显示的模样,如图4-2所示:
图4-1 主界面的设计框图
图4-2 主界面显示图
在主界面显示图中,中间有两个显示窗口:一个显示原始图像,另一个显示处理后的图像,各个功能按键分别集成到大功能框架内。
(1)选项
在选项菜单栏中有选择图像、退出图像、清楚图像和退出系统的功能,操作系统的显示图如图4-3,图4-4所示:
图4-3 选择图像后的显示图
图4-4 保存图像显示图
选择完图像后,左边图像框内会显示相应的原图,若图像未进行任何的图像处理,右边的图像仍然是原来的图像。点击退出操作,显示界面会直接退出。点击保存操作,会显示名为‘Save Image as’窗口,将图片进而保存到相应的位置。清除操作是将其他图像处理进行消除。
(2)基本图像操作
在基本图像操作菜单中有原始图像,灰度化图像,二值化图像,反色图像,图像旋转(左右翻转、上下翻转和360°旋转)和直方图的均衡化,其中灰度化图像具体的实现界面框图如图4-5 所示,二值化图像具体实现界面框图如图4-6 所示、图像旋转具体实现界面框图如图4-7所示、旋转具体实现界面如4-8所示、直方图均衡化如图4-9所示及直方图显示如图4-10和图4-11所示:
图4-5 灰度化图像的显示图
图4-7 二值化图像的显示图
图4-8 图像旋转的显示图
图4-9 均衡化后的图像显示图
图4-10 原图及直方图
图4-11 均衡化后的图像直方图
观察上述几幅显示图可以发现,基本实现了相应的图像处理操作。通过原始图像和效果后的图像进行比较,效果比较明显。在直方图均衡化的操作中,可以观察到均衡化后的图像中灰度值几乎差不多,无论原始图像的灰度值差别有多大,现在的灰度值基本差不多,通过观察图像的直方图可以观察到灰度值比较集中在[50,200]之间,均衡化后的图像直方图就比较平均了。
(3)图像的增强操作
在图像增强操作的菜单中有各种滤波器,如:中值滤波器、均值滤波器、高斯滤波器、理想低通滤波器,高通滤波器、带阻滤波器、同态滤波器等。其中中值滤波器的具体实现界面框图如4-12所示,均值滤波器具体实现框图如图4-13所示,高斯滤波器如图4-14所示,理想低通滤波器如图4-15所示、高斯低通滤波器如图4-16所示:
图4-12 中值滤波器7×7模板的显示图
图4-13 均值滤波器7×7模板显示图
中值滤波器是一种非线性的滤波器,其基本原理就是选择待处理的像素的一个领域中各个像素中值来代替待处理的像素,其主要功能是将像素的灰度值与周围像素比较接近,从而去除比较孤立的噪声点,所以一般用来去除椒盐噪声,并且还能有效保护图像的边界信息。相对于均值滤波器而言不会对图像产生很大的模糊。
图4-14 高斯滤波器显示图
以上三种为空间滤波器,目的是改善影像质量,包括去除高频噪声与干扰,及影像边缘增强、线性增强以及去模糊等。高斯滤波是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。但其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1,而高斯滤波器的模板系数则随着距离模板中心的增大而减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。
图4-15 理想低通滤波器
图4-16 高斯低通滤波器
理想低通滤波器、高斯低通滤波器、带阻滤波、同态滤波等都是属于频率域上的滤波,先通傅里叶变换得到频谱,设定一个阈值,像高斯低通滤波设定的阈值为50.然后通过滤波器进行构造,最后将中心平移到原来的状态,最后反傅里叶变换得到实数部分,最后得到其频谱图。
(3)图像分割操作
图像分割操作有Laplace算子、sobel算子、阈值分割操作等等。其显示显示框图如图4-17、4-18、4-19所示:
图4-17 Laplace算子图
图4-18 sobel算子图
图4-19 阈值分割图
这三种算子是边缘检测的方法,在阈值分割图中,设置阈值为D0=15。边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。
(4)图像变换操作
傅里叶变化、小波变换、离散余弦变换分别如图4-20、4-21、4-22所示。
图 4-20 傅里叶变换频谱图
傅里叶变换得到的频谱相当于图像的梯度,表现了图像上某一点与邻域点差异的强弱,体现了图像变化的剧烈程度。傅里叶变换将一个信号曲线分解成若干个正弦曲线,这些正弦的频率代表了原信号曲线的频率变化情况。
图4-21 小波变换图
图中先将图片转化为灰度图,再进行单层小波分解,最后显示小波变换分量组合图像。
图 4-22 离散余弦变化谱图
如果将信号展开为偶信号,则为余弦变换。傅里叶变换的图像零频部分在四周,高频部分在中心,而余弦变换图像具有很强的能量集中在频谱低频部分的特性,低频部分集中在左上角,幅值大,高频部分幅值小。
(5)形态学处理操作:
膨胀、腐蚀、开运算、闭运算具体框架显示图如图4-23、4-24、4-25、4-26所示。
图4-23 膨胀
图 4-24 腐蚀
图4-25 开运算
图4-26 闭运算
(6)噪声处理
高斯噪声、泊松噪声、椒盐噪声、斑点噪声如图4-27、4-28、4-29、4-30所示。这些噪声在信号形式上表现为不同的斑点信号。
图4-27 高斯噪声
图 4-28 泊松噪声
图4-29 椒盐噪声
图 4-30斑点噪声
(7)二值图像的处理及复原
二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。其二值化实现图如图4-31所示:
图 4-31二值图像处理图
维纳滤波复原如图4-32,先在原图中添加噪声,然后实现维纳滤波实现复原图像。
图4-32 维纳滤波复原图
文章主要介绍了数字图像处理的基本理论,图像的格式,MATLAB 仿真软件和基于MATLAB的数字图像处理环境,介绍了如何利用MATLAB 及其图像处理工具箱进行数字图像处理。在第三章详细介绍了二值图像的处理,介绍了膨胀、腐蚀和综合应用,然后详细介绍了图像增强的技术,介绍了空域处理和频域处理;第六章介绍了图像复原的方法,介绍了维纳滤波和图像边缘提取算法;并都利用MATLAB来实现。二值图像处理是最简单的技术,能够获得图像的信息:图像增强技术是数字图像处理中最基础和必需的技术;图像复原是最实用的图像处理技术,应用最广泛。
数字图像处理技术的迅速发展给人类带来了巨大的经济社会效益,大到卫星遥感进行全球环境气候检测,小到指纹识别技术在安全领域的广泛应用。MATLAB用更直观的,符合人们思维习惯的代码,代替了C和FORTRAN语言的冗长代码。应用MATLAB友好的界面和丰富、实用、高效的指令及模块,可以使人较快地认识、理解图像处理的相关概念,逐步掌握图像信号处理的基本方法,进而能够解次相关的工程和科研中的问题。
首先诚挚的感谢我的论文指导老师王老师。她在忙碌的教学工作中指导我们实践,指导我们的课程设计,给我提供了大量数据资料、参考书目和建议。她对我们的平时生活也很关心,不断提出修改意见,修改我的课程设计以严谨的治学态度,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响. 深远。在此,谨向王老师表示崇高的敬意和衷心的感谢! 还有感谢人工智能学院的所有老师们,你们严谨细致、一丝 不苟的作风一- 直是我工作、学习中的榜样;你们循循善诱的教导和不拘- -格的思路给予我无尽的启迪! 感谢一学期中陪伴在我身边的同学、朋友,感谢他们为我提出的有益的建议和意见! 最后祝愿人工智能学院各位老师工作顺心,人工智能学院明天将更加美好!
[1]陈超, 《MATLAB 应用实例精讲一 图像处理与GUI设计篇》[M], 北京:电子工业出版社,2011.2
[2] 张德丰,《MATLAB 数字图像处理》 (第二版) [M], 北京:机械工业出版社,2012.1
[3] 朱习军,隋思涟, 《MATLAB 在信号与图像处理中的应用》[M], 北京:电子工业出版社,2009. 3
[4] 张德丰,《详解MATLAB数字图像处理》[M], 北京:电子工业出版社,2010.7
[5] 詹青龙,卢爱芹,《数字图像处理技术》[M], 北京:清华大学出版社,2010. 7
[6]张德丰, 《数字图像处理(MATLAB版)》[M], 北京:人民邮电出版社,2009. 10
[7]游福成,《数字图像处理》 [M], 北京:机械工业出版社,2011
[8]陈炳权,刘宏立,《数字图像处理技 术的现状及其发展方向》[J], 吉首大学学报,2009.01期,2
[9]李红俊,《数 字图像处理技术及其应用》[J], 中国学术期刊,2002. 09期,1
[10]杨丹,赵海滨,《MATLAB 从入门到精通》[M], 北京:中国铁道出版社,2013.1
[11]闫敬文,《数 字图像处理MATLAB版》[M], 国防工业出版社,2007. 2
[]周新伦,柳建,《数字图像处理》 [M], 国防工业出版社,1986. 3
function varargout = Image_processing_GUI(varargin)
% IMAGE_PROCESSING_GUI MATLAB code for Image_processing_GUI.fig
% IMAGE_PROCESSING_GUI, by itself, creates a new IMAGE_PROCESSING_GUI or raises the existing
% singleton*.
%
% H = IMAGE_PROCESSING_GUI returns the handle to a new IMAGE_PROCESSING_GUI or the handle to
% the existing singleton*.
%
% IMAGE_PROCESSING_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in IMAGE_PROCESSING_GUI.M with the given input arguments.
%
% IMAGE_PROCESSING_GUI('Property','Value',...) creates a new IMAGE_PROCESSING_GUI or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before Image_processing_GUI_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to Image_processing_GUI_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help Image_processing_GUI
% Last Modified by GUIDE v2.5 04-Sep-2021 08:30:15
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Image_processing_GUI_OpeningFcn, ...
'gui_OutputFcn', @Image_processing_GUI_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before Image_processing_GUI is made visible.
function Image_processing_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to Image_processing_GUI (see VARARGIN)
% Choose default command line output for Image_processing_GUI
handles.output = hObject;
set(handles.save,'Enable','off');
set(handles.exit,'Enable','off');
set(handles.reset,'Enable','off');
set(handles.g1,'Visible','off');
set(handles.g2,'Visible','off');
set(handles.g3,'Visible','off');
set(handles.g4,'Visible','off');
set(handles.g5,'Visible','off');
set(handles.n1,'Enable','off');
set(handles.n2,'Enable','off');
set(handles.n3,'Enable','off');
set(handles.n4,'Enable','off');
set(handles.f1,'Enable','off');
set(handles.f2,'Enable','off');
set(handles.f3,'Enable','off');
set(handles.slider1,'Enable','off');
set(handles.slider2,'Enable','off');
set(handles.slider3,'Enable','off');
set(handles.slider4,'Enable','off');
set(handles.slider5,'Enable','off');
set(handles.m1,'Enable','off');
set(handles.m2,'Enable','off');
set(handles.m3,'Enable','off');
set(handles.m4,'Enable','off');
set(handles.m5,'Enable','off');
set(handles.m6,'Enable','off');
set(handles.m7,'Enable','off');
set(handles.m8,'Enable','off');
set(handles.m9,'Enable','off');
set(handles.p1,'Enable','off');
set(handles.p2,'Enable','off');
set(handles.p3,'Enable','off');
set(handles.p4,'Enable','off');
set(handles.p5,'Enable','off');
set(handles.invc,'Enable','off');
set(handles.dia,'Enable','off');
set(handles.ero,'Enable','off');
set(handles.strel,'Enable','off');
set(handles.strels,'Enable','off');
set(handles.strelv,'Enable','off');
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes Image_processing_GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = Image_processing_GUI_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
%示波器g4彩色图象更新函数
function updateg4(handles)
r=handles.img(:,:,1);
g=handles.img(:,:,2);
b=handles.img(:,:,3);
x=size(r);
x=(1:x(1,2));
r=r(1,:);
g=g(1,:);
b=b(1,:);
axes(handles.g4);
cla;
plot(x,r,'r');
hold on
plot(x,g,'g');
plot(x,b,'b');
hold off;
ImageData1 = reshape(handles.img(:,:,1), [size(handles.img, 1) * size(handles.img, 2) 1]);
ImageData2 = reshape(handles.img(:,:,2), [size(handles.img, 1) * size(handles.img, 2) 1]);
ImageData3 = reshape(handles.img(:,:,3), [size(handles.img, 1) * size(handles.img, 2) 1]);
[H1, X1] = hist(ImageData1, 1:5:256);
[H2, X2] = hist(ImageData2, 1:5:256);
[H3, X3] = hist(ImageData3, 1:5:256);
axes(handles.g5);
cla;
hold on;
plot(X1, H1, 'r');
plot(X2, H2, 'g');
plot(X3, H3, 'b');
axis([0 256 0 max([H1 H2 H3])]);
%示波器灰色图象更新函数
function updateg4_1(handles)
k=handles.img(:,:,1);
x=size(k);
x=(1:x(1,2));
k=k(1,:);
axes(handles.g4);
cla;
plot(x,k,'k');
ImageData = reshape(handles.img, [size(handles.img, 1) * size(handles.img, 2) 1]);
[H, X] = hist(ImageData, 1:5:256);
axes(handles.g5);
cla;
hold on;
plot(X, H, 'k');
axis([0 256 0 max(H)]);
%打开
% --- Executes on button press in load.
function load_Callback(hObject, eventdata, handles)
[file path]=uigetfile({'*.jpg';'*.bmp';'*.jpeg';'*.png'}, '打开文件');
image=[path file];
handles.file=image;
if (file==0)
warndlg('请选择一张图片...') ;
end
[fpath, fname, fext]=fileparts(file);
validex=({'.bmp','.jpg','.jpeg','.png'});
found=0;
for (x=1:length(validex))
if (strcmpi(fext,validex{x}))
found=1;
set(handles.save,'Enable','on');
set(handles.exit,'Enable','on');
set(handles.reset,'Enable','on');
set(handles.g1,'Visible','on');
set(handles.g2,'Visible','on');
set(handles.g3,'Visible','on');
set(handles.g4,'Visible','on');
set(handles.g5,'Visible','on');
set(handles.n1,'Enable','on');
set(handles.n2,'Enable','on');
set(handles.n3,'Enable','on');
set(handles.n4,'Enable','on');
set(handles.f1,'Enable','on');
set(handles.f2,'Enable','on');
set(handles.f3,'Enable','on');
set(handles.slider1,'Enable','on');
set(handles.slider2,'Enable','on');
set(handles.slider3,'Enable','on');
set(handles.slider4,'Enable','on');
set(handles.slider5,'Enable','on');
set(handles.m1,'Enable','on');
set(handles.m2,'Enable','on');
set(handles.m3,'Enable','on');
set(handles.m4,'Enable','on');
set(handles.m5,'Enable','on');
set(handles.m6,'Enable','on');
set(handles.m7,'Enable','on');
set(handles.m8,'Enable','on');
set(handles.m9,'Enable','on');
set(handles.p1,'Enable','on');
set(handles.p2,'Enable','on');
set(handles.p3,'Enable','on');
set(handles.p4,'Enable','on');
set(handles.p5,'Enable','on');
set(handles.invc,'Enable','on');
set(handles.dia,'Enable','on');
set(handles.ero,'Enable','on');
set(handles.strel,'Enable','on');
set(handles.strels,'Enable','on');
set(handles.strelv,'Enable','on');
handles.img=imread(image);
handles.i=imread(image);
h = waitbar(0,'等待...');
steps = 100;
for step = 1:steps
waitbar(step / steps)
end
close(h)
axes(handles.g1);
cla;
imshow(handles.img);
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
break;
end
end
if (found==0)
errordlg('文件扩展名不正确,请从可用扩展名[.jpg、.jpeg、.bmp、.png]中选择文件','Image Format Error');
end
set(handles.g3,'Visible','on');
set(handles.g4,'Visible','on');
% 示波器g3更新
mysize=size(handles.img);
if numel(mysize)>2
r=handles.i(:,:,1);
g=handles.i(:,:,2);
b=handles.i(:,:,3);
x=size(r);
x=(1:x(1,2));
r=r(1,:);
g=g(1,:);
b=b(1,:);
axes(handles.g3);
cla;
plot(x,r,'r');
hold on
plot(x,g,'g');
plot(x,b,'b');
set(gca,'xtick',-inf:inf:inf);
hold off;
else
k=handles.img(:,:,1);
x=size(k);
x=(1:x(1,2));
k=k(1,:);
axes(handles.g3);
cla;
plot(x,k,'k');
end
%示波器g5更新
mysize=size(handles.img);
if numel(mysize)>2
ImageData1 = reshape(handles.img(:,:,1), [size(handles.img, 1) * size(handles.img, 2) 1]);
ImageData2 = reshape(handles.img(:,:,2), [size(handles.img, 1) * size(handles.img, 2) 1]);
ImageData3 = reshape(handles.img(:,:,3), [size(handles.img, 1) * size(handles.img, 2) 1]);
[H1, X1] = hist(ImageData1, 1:5:256);
[H2, X2] = hist(ImageData2, 1:5:256);
[H3, X3] = hist(ImageData3, 1:5:256);
axes(handles.g5);
cla;
hold on;
plot(X1, H1, 'r');
plot(X2, H2, 'g');
plot(X3, H3, 'b');
axis([0 256 0 max([H1 H2 H3])]);
else
ImageData = reshape(handles.img, [size(handles.img, 1) * size(handles.img, 2) 1]);
[H, X] = hist(ImageData, 1:5:256);
axes(handles.g5);
cla;
hold on;
plot(X, H, 'k');
axis([0 256 0 max(H)]);
end
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to load (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%退出
% --- Executes on button press in exit.
function exit_Callback(hObject, eventdata, handles)
close all;
% hObject handle to exit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%保存
% --- Executes on button press in save.
function save_Callback(hObject, eventdata, handles)
[file path]= uiputfile('*.jpg','Save Image as');
save=[path file]; imwrite(handles.img,save,'jpg');
% hObject handle to save (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in reset.
function reset_Callback(hObject, eventdata, handles)
handles.img=handles.i;
axes(handles.g2);
cla;
imshow(handles.img);
updateg4(handles);
guidata(hObject,handles);
% hObject handle to reset (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in n1.
function n1_Callback(hObject, eventdata, handles)
handles.img = imnoise(handles.img,'gaussian');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to n1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in n2.
function n2_Callback(hObject, eventdata, handles)
h = waitbar(0,'等待...');
steps = 200;
for step = 1:steps
waitbar(step / steps)
end
close(h)
handles.img = imnoise(handles.img,'poisson');
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to n2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in n3.
function n3_Callback(hObject, eventdata, handles)
handles.img = imnoise(handles.img,'salt & pepper',0.02);
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to n3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in n4.
function n4_Callback(hObject, eventdata, handles)
handles.img = imnoise(handles.img,'speckle',0.04);
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to n4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in f2.
function f2_Callback(hObject, eventdata, handles)
hsize=[8 8]; sigma=1.7;
h=fspecial('gaussian',hsize,sigma);
handles.img=imfilter(handles.img,h,'replicate');
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to f2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in f1.
function f1_Callback(hObject, eventdata, handles)
h=fspecial('average');
handles.img=imfilter(handles.img,h,'replicate');
axes(handles.g2); cla; imshow(handles.img)
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to f1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in f3.
function f3_Callback(hObject, eventdata, handles)
r=medfilt2(handles.img(:,:,1));
g=medfilt2(handles.img(:,:,2));
b=medfilt2(handles.img(:,:,3));
handles.img=cat(3,r,g,b);
axes(handles.g2); cla; imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to f3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
x=get(hObject,'Value');
r=handles.img(:,:,1);
g=handles.img(:,:,2);
b=handles.img(:,:,3);
r1=r+x;
rcon=cat(3,r1,g,b);
axes(handles.g2);
cla;
imshow(rcon)
handles.img=rcon;
r=handles.img(:,:,1);
g=handles.img(:,:,2);
b=handles.img(:,:,3);
x=size(r);
x=(1:x(1,2));
r=r(1,:);
g=g(1,:);
b=b(1,:);
axes(handles.g4);
plot(x,r,'r');
hold on
plot(x,g,'g');
plot(x,b,'b');
hold off;
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function slider2_Callback(hObject, eventdata, handles)
x=get(hObject,'Value');
r=handles.img(:,:,1);
g=handles.img(:,:,2); b=handles.img(:,:,3);
g1=g+x; gcon=cat(3,r,g1,b);
axes(handles.g2); cla; imshow(gcon)
handles.img=gcon;
updateg4(handles)
% hObject handle to slider2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider2_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function slider3_Callback(hObject, eventdata, handles)
x=get(hObject,'Value');
r=handles.img(:,:,1);
g=handles.img(:,:,2); b=handles.img(:,:,3);
b1=b+x; bcon=cat(3,r,g,b1);
axes(handles.g2); cla; imshow(bcon)
handles.img=bcon;
updateg4(handles)
% hObject handle to slider3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider3_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on button press in m6.
function m6_Callback(hObject, eventdata, handles)
handles.img = rgb2gray(handles.img);
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m8.
function m8_Callback(hObject, eventdata, handles)
handles.img=fliplr(handles.img);
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to m8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m9.
function m9_Callback(hObject, eventdata, handles)
handles.img=flipud(handles.img);
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to m9 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m1.
function m1_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img=rgb2gray(handles.img);
end
handles.img=edge(handles.img,'sobel');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m2.
function m2_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img=rgb2gray(handles.img);
end
handles.img=edge(handles.img,'roberts');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m3.
function m3_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img=rgb2gray(handles.img);
end
handles.img=edge(handles.img,'prewitt');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m4.
function m4_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img=rgb2gray(handles.img);
end
handles.img=edge(handles.img,'log');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m5.
function m5_Callback(hObject, eventdata, handles)
mysize=size(handles.img);
if numel(mysize)>2
handles.img=rgb2gray(handles.img);
end
handles.img=edge(handles.img,'canny');
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in invc.
function invc_Callback(hObject, eventdata, handles)
x=handles.img;
r=x(:,:,1); r=256-r;
g=x(:,:,2); g=256-g;
b=x(:,:,3); b=256-b;
handles.img=cat(3,r,g,b);
axes(handles.g2);
cla;
imshow(handles.img);
updateg4(handles);
guidata(hObject,handles);
% hObject handle to invc (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in m7.
function m7_Callback(hObject, eventdata, handles)
thresh = graythresh(handles.img); %自动确定二值化阈值
handles.img = im2bw(handles.img,thresh);
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles);
% hObject handle to m7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in strels.
function strels_Callback(hObject, eventdata, handles)
handles.img=handles.mori;
axes(handles.g2);
cla;
imshow(handles.img)
guidata(hObject,handles);
updateg4(handles);
% hObject handle to strels (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on slider movement.
function slider4_Callback(hObject, eventdata, handles)
x=get(hObject,'Value');
img=handles.img;
img=img+x;
axes(handles.g2); cla; imshow(img)
handles.img=img;
updateg4(handles)
% hObject handle to slider4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider4_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on button press in dia.
function dia_Callback(hObject, eventdata, handles)
handles.mori=handles.img;
str=strel(handles.strel,handles.value);
handles.mori=imdilate(handles.mori,str);
axes(handles.g2);
cla;
imshow(handles.mori)
guidata(hObject,handles);
handles.img=handles.mori;
mysize=size(handles.img);
guidata(hObject,handles);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to dia (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in ero.
function ero_Callback(hObject, eventdata, handles)
handles.mori=handles.img;
str=strel(handles.strel,handles.value);
handles.mori=imerode(handles.mori,str);
axes(handles.g2);
cla;
imshow(handles.mori)
guidata(hObject,handles);
handles.img=handles.mori;
guidata(hObject,handles);
mysize=size(handles.img);
if numel(mysize)>2
updateg4(handles)
else
updateg4_1(handles)
end
% hObject handle to ero (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
function strelv_Callback(hObject, eventdata, handles)
handles.value=str2num(get(hObject,'String'));
guidata(hObject,handles);
% hObject handle to strelv (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of strelv as text
% str2double(get(hObject,'String')) returns contents of strelv as a double
% --- Executes during object creation, after setting all properties.
function strelv_CreateFcn(hObject, eventdata, handles)
% hObject handle to strelv (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on selection change in strel.
function strel_Callback(hObject, eventdata, handles)
val=get(hObject,'Value');
switch val
case 1
helpdlg('请选择一种结构元素类型','Morphological Operations');
case 2
handles.strel='diamond';
case 3
handles.strel='disk';
case 4
helpdlg('值必须是3的非负倍数','Octagon Structure Help');
handles.strel='octagon';
end
guidata(hObject,handles);
% hObject handle to strel (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns strel contents as cell array
% contents{get(hObject,'Value')} returns selected item from strel
% --- Executes during object creation, after setting all properties.
function strel_CreateFcn(hObject, eventdata, handles)
% hObject handle to strel (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on slider movement.
function slider5_Callback(hObject, eventdata, handles)
rrv=(get(hObject,'Value'));
handles.rot=handles.img;
handles.rot=imrotate(handles.rot,rrv);
axes(handles.g2); cla; imshow(handles.rot);
guidata(hObject,handles)
% hObject handle to slider5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider5_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on button press in p2.
function p2_Callback(hObject, eventdata, handles)
%理想低通滤波器
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
%理想低通
s=fftshift(fft2(I));%傅里叶变换,直流分量搬移到频谱中心
[a,b]=size(s);
h=zeros(a,b);%滤波器函数
res=zeros(a,b);%保存结果
a0=round(a/2);
b0=round(b/2);
d=40;
for i=1:a
for j=1:b
distance=sqrt((i-a0)^2+(j-b0)^2);
if distance<=d
h(i,j)=1;
else
h(i,j)=0;
end
end
end
res=s.*h;
res=real(ifft2(ifftshift(res)));
axes(handles.g2);
cla;
imshow(h);
guidata(hObject,handles);
updateg4_1(handles)
% hObject handle to p2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in p3.
function p3_Callback(hObject, eventdata, handles)
%高斯低通滤波器
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
d0=50; %阈值
[M ,N]=size(I);
img_f = fft2(double(I));%傅里叶变换得到频谱
img_f=fftshift(img_f); %移到中间
m_mid=floor(M/2);%中心点坐标
n_mid=floor(N/2);
h = zeros(M,N);%高斯低通滤波器构造
for i = 1:M
for j = 1:N
d = ((i-m_mid)^2+(j-n_mid)^2);
h(i,j) = exp(-(d)/(2*(d0^2)));
end
end
img_lpf = h.*img_f;
img_lpf=ifftshift(img_lpf); %中心平移回原来状态
img_lpf=uint8(real(ifft2(img_lpf))); %反傅里叶变换,取实数部分
imshow(img_lpf);%title('高斯低通滤波d=50');
axes(handles.g2);
cla;
imshow(img_lpf);
guidata(hObject,handles);
updateg4_1(handles)
% hObject handle to p3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in p4.
function p4_Callback(hObject, eventdata, handles)
%带阻滤波器
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=imnoise(I,'gaussian',0,0.01);
I=im2double(I);
M=2*size(I,1);%滤波器行数
N=2*size(I,2);%滤波器列数
u=-M/2:(M/2-1);
v=-N/2:(N/2-1);
[U,V]=meshgrid(u,v);
D=sqrt(U.^2+V.^2);
D0=50;%滤波器D0
W=30;%滤波器带宽
H=double(or(D<(D0-W/2),D>D0+W/2));
J=fftshift(fft2(I,size(H,1),size(H,2)));
K=J.*H;
L=ifft2(ifftshift(K));
L=L(1:size(I,1),1:size(I,2));
handles.img=L;
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles)
% hObject handle to p4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in p5.
function p5_Callback(hObject, eventdata, handles)
%同态滤波器
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
J=log(im2double(I)+1);
K=fft2(J);
n=5;
D0=0.1*pi;
rh=0.7;
rl=0.4;
[row, column]=size(J);
for i=1:row
for j=i:column
D1(i,j)=sqrt(i^2+j^2);
H(i,j)=rl+(rh/(1+(D0/D1(i,j))^(2*n)));
end
end
L=K.*H;
M=ifft2(L);
N=exp(M)-1;
handles.img=N;
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles)
% hObject handle to p5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in p1.
function p1_Callback(hObject, eventdata, handles)
%维纳滤波复原,复原含有噪声和运动模糊的图片
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
LEN=20;%参数设置
THETA=10;
PSF=fspecial('motion',LEN,THETA);%产生PSF
J=imfilter(I,PSF,'conv','circular');%运动模糊
noise=0.03*randn(size(I));
K=imadd(J,noise);%添加噪声
NP=abs(fft2(noise)).^2;
NPower=sum(NP(:))/prod(size(noise));
NCORR=fftshift(real(ifft2(NP)));
IP=abs(fft2(I).^2);
IPower=sum(IP(:))/prod(size(I));
ICORR=fftshift(real(ifft2(IP)));
L=deconvwnr(K,PSF,NCORR,ICORR);
handles.img=L;
axes(handles.g2);
cla;
imshow(handles.img);
guidata(hObject,handles);
updateg4_1(handles)
% hObject handle to p1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in pushbutton39.
function pushbutton39_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton39 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
if I==0
msgbox('没有可输出的图像','error');
return;
end
if size(I,3)~=1
I=rgb2gray(I);
end
axes(handles.g2);
imhist(I)
guidata(hObject,handles);
%laplace算子
% --- Executes on button press in pushbutton43.
function pushbutton43_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton43 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
[M,N]=size(I);
B=zeros(size(I));
for x=2:M-1
for y=2:N-1
B(x,y)=I(x+1,y)+I(x-1,y)+I(x,y+1)+I(x,y-1)-4*I(x,y);
end
end
B=im2uint8(B);
axes(handles.g2)
imshow(B);
handles.img=B;
guidata(hObject,handles);
% --- Executes on button press in pushbutton44.
function pushbutton44_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton44 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);%将图片进行灰度化
end
I=handles.img;
F=fft2(I);%傅里叶变换
Fs=fftshift(F);
F1=log(abs(Fs)+1);%取模并进行缩放
axes(handles.g2)
imshow(F1,[]);
guidata(hObject,handles)
%小波变换
% --- Executes on button press in pushbutton46.
function pushbutton46_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton46 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
[ca1,chd1,cvd1,cdd1] = dwt2(I,'bior3.7'); %进行单层小波分解
set(0,'defaultFigurePosition',[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])
axes(handles.g2);
imshow([ca1,chd1;cvd1,cdd1]); %显示小波变换分量组合图像
title('小波变换分量组合图像')
guidata(hObject,handles);
% --- Executes on button press in pushbutton47.
function pushbutton47_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton47 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
axis on; %显示坐标系
se=strel('square',6); %采用半径为6的矩形作为结构元素
I1=imopen(I,se); %开启操作
axes(handles.g2);
imshow(I1);
title('开启运算后图像');
guidata(hObject,handles);
% --- Executes on button press in pushbutton48.
function pushbutton48_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton48 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
axis on; %显示坐标系
se=strel('square',6); %采用半径为6的矩形作为结构元素
I2=imclose(I,se); %闭合操作
axes(handles.g2);
imshow(I2);
title('开启运算后图像');
guidata(hObject,handles);
% --- Executes on button press in pushbutton50.
function pushbutton50_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton50 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
img=handles.img;
prompt = {'请输入阈值大小:'};%阈值大小设定
title ='输入';
numlines = [1 35];
def = {'120'};
answer = inputdlg(prompt,title,numlines,def);
a = str2num(answer{1});
I = img > a;
img = I;
axes(handles.g2);
cla;
imshow(img);
guidata(hObject,handles);
% --- Executes on button press in pushbutton51.图像均衡化
function pushbutton51_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton51 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
img=handles.img;
img1=histeq(img);
axes(handles.g2);
cla;
imshow(img1);
guidata(hObject,handles);
% --- Executes on button press in pushbutton52.
function pushbutton52_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton52 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
I=handles.img;
I=im2double(I);
s=size(I);
M=s(1);
N=s(2);
% B=dctmtx(n)建立n*n的离散余弦变换矩阵B,其中n是一个正整数
P=dctmtx(M);
Q=dctmtx(N);
J=P*I*Q';% 通过离散余弦变换矩阵定义B=P*A*Q计算矩阵A的离散余弦变换
K=dct2(I);
E=J-K;% 两种方法计算出的离散余弦系数之差
find(abs(E)>0.000001)% 查找系数差的绝对值大于0.000001(命令行显示:空的 0×1 double 列向量--说明两种方法计算出的离散余弦系数基本相同)
axes(handles. g2);
imshow(K);
% --- Executes on button press in pushbutton54.
function pushbutton54_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton54 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
mysize=size(handles.img);
if numel(mysize)>2
handles.img = rgb2gray(handles.img);
end
img=handles.img;
img1=histeq(img);
axes(handles.g2);
cla;
imhist(img1)
guidata(hObject,handles);