这不仅改变了我对编程的理解,也让我对学习有了全新的认知,从此学习永远被提上了日程!(心虚中…)
或者把它比做一个执行动作的过滤器,无论主体是谁,只要通过程序一样要执行动作。
通俗来讲,我们是可以将图像处理理解成用编程代码P图。其优点就是可以进行批量等复杂操作,是p图软件所不具备的,但p图软件因具有较强的交互性体验,而更为普及化。
利用编程进行图像处理的实质就是将图像转换成数字信号,并用计算机进行处理的过程。
顾名思义,我们可以应用计算机系统语言来进行操作达到和p图软件同样的功能,例如:剪裁、旋转和颜色调整等等,我们会在实例演示部分进行具体的应用。
正所谓条条大路通罗马,想对其图像进行操作的方式有很多种,这取决于我们要解决问题的不同而不同。例如,前几节课我们一直学习如何利用Matlab画国旗,若想对国旗进行图像处理,我们可以利用矩阵的方式画一个国旗,也可以利用函数读取我们事先下载好的国旗图片。
我们是一层一层去建立嵌套式的去构建矩阵,后利用ones/zeros函数调整RGB值的混合颜色就大功告成啦。
Matlab可处理的图片类型分为索引图、灰度图、二值图和RGB图四种。类型的区别就在于矩阵类型和对应的处理方式的不同。上文所提到的RGB就源起此。
RGB是采用颜色的三原色模式显示的。R G B分别对应红色、绿色和蓝色。
RGB图像是三维矩阵,维度为m\timesn\times3。m\timesn为每格像素,也就是每个方格块;3则是代表三个颜色(红绿蓝)通道,也就是说我们每个方格块中的颜色都是由三种颜色的不同比例混合而呈现的。
所以这也是为什么我们用矩阵画图时有三列,因为我们需要用不同的RGB值来混合成我们预定的颜色。(我们就以下文要提到的芬兰国旗为例)
矩阵利用ones函数,我们设置400的列和600的行的3则表示的是RGB值,而接下来则是具置的颜色比例的设置,数字1 2 3则分别对应三原色红绿蓝。
进行了以上的复习,那么问题来了,在我们利用矩阵进行画图的时候RGB值一直设置为0-1间,而读取图像时显示的图像RGB信息却是0-255间。
这二者究竟有怎样的联系呢?原来是我们利用矩阵画图和读取图像时所涉及的数据类型的不同导致的!
画图时所涉及的数据类型为Matlab所默认的双精度double,数值在0-1之间;而读取图像所涉及的数据类型为整形中的无符号uint8,数值在0-255之间。具体可以总结为下表。
为了我们方便理解,我们将矩阵画图划分在GUI(图形用户界面)体系下,将读取图像划分在图像处理模块下,然后我们可以把数据类型理解为两个框架所联结的点。(这样的划分并不意味着两个部分没有联系,它们是有相互交叉部分的,原因仅为希望可以用相对广阔的视角来更好理清其上位概念和相互关系。)
GUI 即人机交互界面,更多涉及交互体验的设计,多数情况需要我们进行设计,遵循我们之前提到过的root-figure-axes-matrix的逻辑线;而图像处理更多涉及对已有图片的处理,更多用到的是imread()/ imshow()/ imwrite()等函数。
另对于数据类型的信息我们可以在工作区查看。(以下文实例演示部分的代码工作区为例)
在我们进行运算前需将数据确认/转换为double类型,若不转换会出现运算溢出而被迫运行终止等问题。
而无论采用哪种图像处理方式,在用matlab处理图像矩阵后,我们都会用函数imshow()显示或imwrite()写入图片。如果数据类型是double型,输出图像很可能会出现某些异样,因为函数imshow()在显示图像时,会默认为double数据取值范围为0-1之间,那么就会将数组中大于1的元素归为1,显示为白色。故在显示图片前,我们需将数据转换为uint8类型。
我们目标是对图一进行取反、剪裁、缩放、旋转、对比度和亮度的对比操作演示。
代码如下,我们每一步的操作都基于原图,便于我们进行对比,并且使用subplot平铺创建坐标轴函数做一个整体的展示。其中颜色反转的部分便与我们上文所进行的数据区分有很大的关联,代码因imread读取的数据为uint8类型,所以我们使用的参数值为255,同样的数字1 2 3分别代表三原色。
本次教程我更愿意说成是一个总结笔记的分享,我们回顾了矩阵画图和图片读取、对数据类型进行了区分并对图像处理进行了实例演示。代码真是取之不尽用之不竭,我们更应该做的不是浮于表面,而是理解编程本质的思想,以解决具体问题为导向来切入学习,最终达到融会贯通。才疏学浅,也许不能带给各位宏观的视野,但希望这次分享可以在大家心里种下一颗思考的种子,一颗随时都会发芽的种子。IM电竞IM电竞