找回密码
 立即注册
查看: 868|回复: 19

Matlab之图像处理

[复制链接]
发表于 2022-3-12 19:40 | 显示全部楼层 |阅读模式
在没有学习编程前,对编程的理解是这样的...


这样的...


但一次偶然的机会看了乔布斯生前采访的视频,真是醍醐灌顶...!


然后,编程在我眼里就变成这样!


这不仅改变了我对编程的理解,也让我对学习有了全新的认知,从此学习永远被提上了日程!(心虚中…)
<hr/>啥是编程?两张图搞定!


就像是一个套环,一环套一环,每步都相互联系。


或者把它比做一个执行动作的过滤器,无论主体是谁,只要通过程序一样要执行动作。
Matlab作为编写程序的软件,基本信息在此不多赘述。

以下为我们本次主要分享的三部分内容:


1.图像处理的概述


通俗来讲,我们是可以将图像处理理解成用编程代码P图。其优点就是可以进行批量等复杂操作,是p图软件所不具备的,但p图软件因具有较强的交互性体验,而更为普及化。
利用编程进行图像处理的实质就是将图像转换成数字信号,并用计算机进行处理的过程。


顾名思义,我们可以应用计算机系统语言来进行操作达到和p图软件同样的功能,例如:剪裁、旋转和颜色调整等等,我们会在实例演示部分进行具体的应用。
1.1Matlab图像处理基础


正所谓条条大路通罗马,想对其图像进行操作的方式有很多种,这取决于我们要解决问题的不同而不同。例如,前几节课我们一直学习如何利用Matlab画国旗,若想对国旗进行图像处理,我们可以利用矩阵的方式画一个国旗,也可以利用函数读取我们事先下载好的国旗图片。
说到利用矩阵画国旗我们就先来回顾一下吧。
若要实现在窗口进行画图,我们先复习一下图形窗口原理。


我们是一层一层去建立嵌套式的去构建矩阵,后利用ones/zeros函数调整RGB值的混合颜色就大功告成啦。
而读取的方式是则是利用imread函数进行读取事先下载好的图片。

提到RGB我们在这里要做一个延伸补充
Matlab可处理的图片类型分为索引图、灰度图、二值图和RGB图四种。类型的区别就在于矩阵类型和对应的处理方式的不同。上文所提到的RGB就源起此。
RGB是采用颜色的三原色模式显示的。R G B分别对应红色、绿色和蓝色。
还记得我们前面数字处理的图片吗?


RGB图像是三维矩阵,维度为m  n  3。m  n为每格像素,也就是每个方格块;3则是代表三个颜色(红绿蓝)通道,也就是说我们每个方格块中的颜色都是由三种颜色的不同比例混合而呈现的。
所以这也是为什么我们用矩阵画图时有三列,因为我们需要用不同的RGB值来混合成我们预定的颜色。(我们就以下文要提到的芬兰国旗为例)



芬兰国旗矩阵参数代码

矩阵利用ones函数,我们设置400的列和600的行的3则表示的是RGB值,而接下来则是具体位置的颜色比例的设置,数字1 2 3则分别对应三原色红绿蓝。
2.数据类型的区分
进行了以上的复习,那么问题来了,在我们利用矩阵进行画图的时候RGB值一直设置为0-1间,而读取图像时显示的图像RGB信息却是0-255间。




这二者究竟有怎样的联系呢?原来是我们利用矩阵画图和读取图像时所涉及的数据类型的不同导致的!
画图时所涉及的数据类型为Matlab所默认的双精度double,数值在0-1之间;而读取图像所涉及的数据类型为整形中的无符号uint8,数值在0-255之间。具体可以总结为下表。


为了我们方便理解,我们将矩阵画图划分在GUI(图形用户界面)体系下,将读取图像划分在图像处理模块下,然后我们可以把数据类型理解为两个框架所联结的点。(这样的划分并不意味着两个部分没有联系,它们是有相互交叉部分的,原因仅为希望可以用相对广阔的视角来更好理清其上位概念和相互关系。)
GUI 即人机交互界面,更多涉及交互体验的设计,多数情况需要我们进行设计,遵循我们之前提到过的root-figure-axes-matrix的逻辑线;而图像处理更多涉及对已有图片的处理,更多用到的是imread()/ imshow()/ imwrite()等函数。
另对于数据类型的信息我们可以在工作区查看。(以下文实例演示部分的代码工作区为例)



实例演示例子的工作区

以上的区分对我们应用的价值就在于:
对不同框架下的数据所对应的RGB值进行有效的输入。
在我们进行运算前需将数据确认/转换为double类型,若不转换会出现运算溢出而被迫运行终止等问题。
而无论采用哪种图像处理方式,在用matlab处理图像矩阵后,我们都会用函数imshow()显示或imwrite()写入图片。如果数据类型是double型,输出图像很可能会出现某些异样,因为函数imshow()在显示图像时,会默认为double数据取值范围为0-1之间,那么就会将数组中大于1的元素归为1,显示为白色。故在显示图片前,我们需将数据转换为uint8类型。

3.实例应用
有了以上的区分我们就可以在其基础上进行应用啦!
3.1单个图像处理
我们目标是对图一进行取反、剪裁、缩放、旋转、对比度和亮度的对比操作演示。



图一(原图)

代码如下,我们每一步的操作都基于原图,便于我们进行对比,并且使用subplot平铺创建坐标轴函数做一个整体的展示。其中颜色反转的部分便与我们上文所进行的数据区分有很大的关联,代码因imread读取的数据为uint8类型,所以我们使用的参数值为255,同样的数字1 2 3分别代表三原色。



实例演示代码

运行!结果就是下图所示啦!



演示运行结果

3.2批量化图像处理
我们通过设置一个循环来实现批量化处理。上代码!



批量化图像处理代码

<hr/>



本次教程我更愿意说成是一个总结笔记的分享,我们回顾了矩阵画图和图片读取、对数据类型进行了区分并对图像处理进行了实例演示。代码真是取之不尽用之不竭,我们更应该做的不是浮于表面,而是理解编程本质的思想,以解决具体问题为导向来切入学习,最终达到融会贯通。才疏学浅,也许不能带给各位宏观的视野,但希望这次分享可以在大家心里种下一颗思考的种子,一颗随时都会发芽的种子。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-3-12 19:48 | 显示全部楼层
感谢分享
发表于 2022-3-12 19:49 | 显示全部楼层
怎么运行不了
发表于 2022-3-12 19:52 | 显示全部楼层
OK了,谢谢大佬
发表于 2022-3-12 19:52 | 显示全部楼层
膜拜大佬
发表于 2022-3-12 19:57 | 显示全部楼层
谢谢你,刚入门,你的笔记正是我想学的
[棒]
发表于 2022-3-12 20:06 | 显示全部楼层
想请教一下matlab中,关于bayer图像的数据读取,用什么函数读,读出来做demosaic差值处理。
发表于 2022-3-12 20:13 | 显示全部楼层
大佬,我用Matlab截取一定大小的图像之后,发现黑白图截出来变成了灰度图,这是怎么回事啊
发表于 2022-3-12 20:16 | 显示全部楼层
imread啊
发表于 2022-3-12 20:18 | 显示全部楼层
imread函数读不了
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-19 20:10 , Processed in 0.106375 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表