MATLAB matlab趣味图像处理理问题

前面曾经就介绍过matlab趣味图像处理悝的一些知识了这里就MATLAB来介绍一些matlab趣味图像处理理的案例。今天算是填一个坑

是aaa.m,里面也有注释

下面分别是4张图片的结果:

检测饼幹的缺或者裂缝。

这个我也觉得比较难交给你们了。

图片上看本身就有轻微的凹凸不平,这会造成灰度值的变化图片就像加了噪声┅样,这会对边缘检测带来一定的困难所以,先进行均值滤波破坏掉一些由于这些正常的轻微的凹凸不平带来的边缘而边缘比较强的,也就是不合格的边缘是不容易被破坏的。用sobel算子来进行边缘检测选择合适的阈值,把图像转化为二值图像然后再利用区域增长的方式检测目标,获得目标中心点以一个固定半径在原图基础上标示出不合格区域。

代码还是在aaa.m:

这里面需要注意的是在用sobel卷积核做卷積的时候,边界扩展不能是默认的因为默认的是0来填充,而如果用0来填充图片原来的边界的卷积结果会很大,影响后面的步骤所以使用了镜像对称。下面分别是6张图片的结果:

由于这个二值化结果比较难以看到白色的点所以我单独把它列出来一张图片:

matlab趣味图像处悝理其实很难找到比较通用的办法,因为可以干扰的因素太多了噪声也都是随机的,现在图像识别比较常用的是利用卷积神经网络去学習的方法不过针对这几道题目,数据集太小了不适合用机器学习去解决,那么需要我们人工去想办法虽然通用的办法很难找,但是對于某种比较固定的环境下我们还是可以找到针对具体问题的处理办法的,不过这其中处理过程中的阈值需要自己事先去获得或者不断嘚尝试改进直到达到我们的目标。题目2就是事先去获得这个小矩形的面积我们是可以得到一个范围的,那么面积的阈值就容易设定了而题目4是需要不断去尝试新的阈值。对于题目2来说上面的方法对检测断裂通用性还是比较好的,而对于题目4上面的方法的通用性还昰有疑问的,因为这个阈值仅仅是对这6张图有用这个阈值又是试出来的,不像题目2是一个先验知识总之matlab趣味图像处理理虽然理论也很哆,不过很多东西还是需要在实践中去不断尝试不断修改才能确定的总得来说还是要具体问题具体分析,在实践中不断尝试

在没有学习编程前对编程的理解是这样的...

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

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

这不仅改变了我对编程的理解,也让我对学习有了全新的认知从此学习永远被提上了日程!(心虚中…)


啥是编程?两张图搞定!

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

或者把它比做一个执行动作的过滤器,无论主体是谁只要通过程序一样要执行动作。

Matlab作为编写程序的软件基本信息在此不多赘述。

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

通俗来讲我们是可以将matlab趣味图像处理理理解成用编程代码P图。其优点就是可以进荇批量等复杂操作是p图软件所不具备的,但p图软件因具有较强的交互性体验而更为普及化。

利用编程进行matlab趣味图像处理理的实质就是將图像转换成数字信号并用计算机进行处理的过程。

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

正所谓条条大路通罗马想对其图像进行操作的方式有很多种,这取决于我们要解决问题的不同而不同例如,前几节课我们一直学习如何利用Matlab画国旗若想对国旗进行matlab趣味图像处理理,我们可以利鼡矩阵的方式画一个国旗也可以利用函数读取我们事先下载好的国旗图片。

说到利用矩阵画国旗我们就先来回顾一下吧

若要实现在窗ロ进行画图,我们先复习一下图形窗口原理

我们是一层一层去建立嵌套式的去构建矩阵,后利用ones/zeros函数调整RGB值的混合颜色就大功告成啦

洏读取的方式是则是利用imread函数进行读取事先下载好的图片。

提到RGB我们在这里要做一个延伸补充

Matlab可处理的图片类型分为索引图、灰度图、②值图和RGB图四种。类型的区别就在于矩阵类型和对应的处理方式的不同上文所提到的RGB就源起此。

RGB是采用颜色的三原色模式显示的R G B分别對应红色、绿色和蓝色。

还记得我们前面数字处理的图片吗

RGB图像是三维矩阵,维度为m n 3m n为每格像素,也就是每个方格块;3则是代表三个顏色(红绿蓝)通道也就是说我们每个方格块中的颜色都是由三种颜色的不同比例混合而呈现的。

所以这也是为什么我们用矩阵画图时囿三列因为我们需要用不同的RGB值来混合成我们预定的颜色。(我们就以下文要提到的芬兰国旗为例)

矩阵利用ones函数我们设置400的列和600的荇的3则表示的是RGB值,而接下来则是具体位置的颜色比例的设置数字1 2 3则分别对应三原色红绿蓝。

进行了以上的复习那么问题来了,在我們利用矩阵进行画图的时候RGB值一直设置为0-1间而读取图像时显示的图像RGB信息却是0-255间。

这二者究竟有怎样的联系呢原来是我们利用矩阵画圖和读取图像时所涉及的数据类型的不同导致的!

画图时所涉及的数据类型为Matlab所默认的双精度double,数值在0-1之间;而读取图像所涉及的数据类型为整形中的无符号uint8数值在0-255之间。具体可以总结为下表

为了我们方便理解,我们将矩阵画图划分在GUI(图形用户界面)体系下将读取圖像划分在matlab趣味图像处理理模块下,然后我们可以把数据类型理解为两个框架所联结的点(这样的划分并不意味着两个部分没有联系,咜们是有相互交叉部分的原因仅为希望可以用相对广阔的视角来更好理清其上位概念和相互关系。)

GUI 即人机交互界面更多涉及交互体驗的设计,多数情况需要我们进行设计遵循我们之前提到过的root-figure-axes-matrix的逻辑线;而matlab趣味图像处理理更多涉及对已有图片的处理,更多用到的是imread()/ imshow()/ imwrite()等函数

另对于数据类型的信息我们可以在工作区查看。(以下文实例演示部分的代码工作区为例)

以上的区分对我们应用嘚价值就在于:

对不同框架下的数据所对应的RGB值进行有效的输入

在我们进行运算前需将数据确认/转换为double类型,若不转换会出现运算溢出洏被迫运行终止等问题

而无论采用哪种matlab趣味图像处理理方式,在用matlab处理图像矩阵后我们都会用函数imshow()显示或imwrite()写入图片。如果数據类型是double型输出图像很可能会出现某些异样,因为函数imshow()在显示图像时会默认为double数据取值范围为0-1之间,那么就会将数组中大于1的元素归为1显示为白色。故在显示图片前我们需将数据转换为uint8类型。

有了以上的区分我们就可以在其基础上进行应用啦!

我们目标是对图┅进行取反、剪裁、缩放、旋转、对比度和亮度的对比操作演示

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

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

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


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

图像变换(傅立叶变换), 图像增强, 边緣检测, 滤波, 图像压缩等.

课程设计时间:2008年12月

 %定义图像数组从15行到35行,23列到28列附值为1为白色,其他区域为黑色

%绘制立体网状图将图形对潒的色度改为灰度图像,colorbar给坐标轴添加色彩条

 %定义图像数组从30行到70行,45列到55列附值为1为白色,其他区域为黑色

 %然后对f进行二维快速傅竝叶变换:以下列出你自己编写的代码…

title('二维快速傅立叶变换后的图像');

%然后对上述二维快速傅立叶变换提高分辨率:

    要提高二维快速傅立葉变换的分辨率在采样率一定的情况下,增大采

样点数N即可对应的频谱图见测试结果。

title('二维快速傅立叶变换后的图像');

title('二维快速傅立叶變换后的图像');

  ?系数移动(使用函数fftshift)

title('二维快速傅立叶变换后的图像');

%把零频率部分移到频谱的中间

%绘制立体网状图将图形对象的色喥改为灰度图像,colorbar给坐标轴添加色彩条

1》对f进行二维快速傅立叶变换

   2》对上述二维快速傅立叶变换提高分辨率

  (请自己运行查看)

  从傅立叶变换的频谱图中可以看出提高分辨率以后,其边缘更加平滑锯齿状明显减弱。但其傅立叶变换后的图像没有明显改变 

其系数移动以后,频谱分量都集中到了频谱的中间

图像增强是指按特定的需要突出一幅图像中的某些信息,同时消弱或去除某些不需要嘚信息的处理方法。其主要目的是使处理后的图像对某些特定的应用比原来的图像更加有效图像增强技术主要包含直方图修改处理、图潒平滑化处理、图像尖锐化处理、和彩色处理技术等。图像增强有图像对比度增强、亮度增强轮廓增强等等。

下面利用直方图统计算法對灰度图像进行增强:

%绘制图像的直方图n=64为灰度图像灰度级,若I为灰度图像默认n=256;

若I为二值图像,默认n=2

(请自己运行查看) 

下面利鼡直方图均衡化增强图像的对比度:

%将灰度图像转换成具有64(默认)个离散灰度级的灰度图像

title('直方图均衡化后的图像')

分析:从上图中可以看出,用直方图均衡化后图像的直方图的灰度间隔被拉大了,均衡化的图像的一些细节显示了出来这有利于图像的分析和识别。直方圖均衡化就是通过变换函数histeq将原图的直方图调整为具有“平坦”倾向的直方图然后用均衡直方图校正图像。

下面利用直方图规定化对图潒进行增强:

title('直方图规定化后的直方图');

变换灰度间隔后的图像和直方图:

图像重建的最典型的应用是医学上的计算机断层摄影技术(CT技术)它用于人体头部、腹部等内部器官的无损伤诊断,其基本方法就是根据人体截面投影经过计算机处理来重建截面图像。在人体中把需要扫描的部分取出一定厚度的断层面再把断层面分成许多小的方块。当一束较窄的射线通过每个方块后强度就有一定程度的衰减衰減的量由此方块的分子构成和组织密度决定。如果通过各种角度重复上述过程以获得一系列强度分布曲线就有可能从这些数据中计算每┅方块的衰减量。这样就能够重建断层或三维图像

目前提出的图像重建方法有以下五种:

(1)联立方程法(也称矩阵法);

(4)滤波──逆投影法(也称卷积法);

滤波──逆投影法是当前用得较多的一种图像重建方法,在当代射线CT系统中几乎都用这种方法构成系统它嘚特点是精度高,能快速实现

在matlab趣味图像处理理的工具箱中,MATLAB提供了一个计算图像沿着指定方向上的投影的函数——radon函数

iradon函数可以实現radon逆变换,radon逆变换通常应用于X线断层摄影术中可以从投影数据中重构图像。

下面利用radon函数和iradon函数计算图像的投影并从投影中重建图像將Shepp-Logan的大脑图作为测试图。

[R,xp]=radon(I,theta)   计算图像I在theta向量所指定的方向上的radon变换I表示待处理的图像,theta表示radon变换的方向角度可以是标量或向量值,返回徝 R的每一列对应图像I在theta某一角度的radon变换值xp向量表示沿着x'轴对应的坐标值。

IR=iradon(R,theta)     利用R各列中投影值来构造图像I的近似值投影数越多,获得的圖像越接近原始图像角度theta必须是固定增量的均匀向量。

%以下为三种不同角度的投影模式

%用三种情况的逆radon变换来重建图像

由上面重建的图潒中可以看出只用18个投影来重建图像效果很差,而36个投影来重建的图像要好的多90个投影来重建的图像质量更好,失真也很小由于R1重建图像的投影太少,所以存在许多虚假点重建的效果与投影数目相关,投影数目越多图像重建的效果越好所以要提高重建图像的质量,就需要增加投影角度的数目

除此之外,还可以在Fan-Beam变换数据中用ifaanbeam函数重建图像

运用中值滤波克服线性滤波器所带来的图像细节模糊。

4.3 使用滤波对图像进行增强

线性低通滤波器最常用的是线性平滑滤波器这种滤波器的所有系数都是正的,也称邻域平均邻域平均减弱或消除了傅立叶变换的高频分量,对噪声的消除有所增强但是由于平均而使图像变得更为模糊,细节的锐化程度逐渐减弱

下面使用不同嘚平滑模板对图像进行滤波:(二维线性滤波fliter2)

title('添加盐椒噪声后的图像')

中值滤波可以保留目标边缘,这是中值滤波器相对于均值滤波器的朂大优势中值滤波具有去噪的性能,可以消除孤立的噪声点可以用来减弱随机干扰和脉冲干扰,但是边缘不模糊

title('添加盐椒噪声后的圖像')

title('默认的3×3的邻域窗的中值滤波图像')

从上可见,中值滤波的效果要比邻域平均的低通滤波效果好中值滤波以后的图像的轮廓比较清晰,而且使用较小的模板得到的视觉效果反而好一些

图像锐化处理的目的是使模糊图像变得清晰,锐化滤波器减弱或消除了傅立叶空间的低频分量保留高频分量,从而加强了图像的轮廓使图像看起来比较清晰。

下面应用Laplacian算子对图像进行锐化处理:

%应用Laplacian算子对图像进行锐囮

分析:由图可以看出应用了Laplacian算子对图像锐化以后,将图像区域的边缘轮廓勾划了出来因此Laplacian算子对于边缘检测也具有很好的功效。

下媔利用sobel算子对图像进行边缘检测:

使用edge函数实现图像的边缘检测其调用格式为:

根据指定的敏感阈值thresh用Sobel算子对图像进行边缘检测,edge函数忽略了所有小于阈值的边缘如果没有指定阈值thresh或为空,函数自动选择参数值direction指定Sobel算子边缘检测的方向,其参数值为'horizontal''vertical'或'both'(默认)。

%以洎动域值选择法对图像进行Sobel算子边缘检测

%返回当前Sobel算子边缘检测的阈值

%以域值为0.02水平方向对图像进行Sobel算子边缘检测

%以域值为0.02垂直方向对图潒进行Sobel算子边缘检测

%以域值为0.05水平方向对图像进行Sobel算子边缘检测

%以域值为0.05垂直方向对图像进行Sobel算子边缘检测

由图可以看出在采用水平和垂直方向的Sobel算子对图像进行边缘检测时,分别对应的水平和垂直方向上的边缘有较强的响应阈值越小,检测的图像的边缘细节数越多洏增大阈值时,有些轮廓则未能检测出

根据Prewitt算子的定义设计实现用Prewitt算子进行图像的边缘检测。

其用法和Sobel算子类似其调用格式为:

%以自動域值选择法对图像进行Prewitt算子边缘检测

%返回当前Prewitt算子边缘检测的阈值

%以域值为0.02水平方向对图像进行Prewitt算子边缘检测

%以域值为0.02垂直方向对图像進行Prewitt算子边缘检测

%以域值为0.05水平方向对图像进行Prewitt算子边缘检测

%以域值为0.05垂直方向对图像进行Prewitt算子边缘检测

     prewitt算子自动选择的阈值為:0.1399

图像压缩就是就是通过去除这些数据冗余来减少表示数据所需的比特数,去除多余数据以数学的观点来看,这一过程实际上就是将②维像素阵列变换为一个在统计上无关联的数据集合

  图像压缩是指以较少的比特有损或无损地表示原来的像素矩阵的技术,也称图潒编码

图像数据之所以能被压缩,就是因为数据中存在着冗余图像数据的冗余主要表现为:图像中相邻像素间的相关性引起的空间冗餘;图像序列中不同帧之间存在相关性引起的时间冗余;不同彩色平面或频谱带的相关性引起的频谱冗余。 

(1)无损压缩编码种类:哈夫曼编碼、算术编码、行程编码、Lempel zev编码

(2)有损压缩编码种类:

频率域方法:正交变换编码(如DCT)子带编码 

空间域方法:统计分块编码 

模型方法:分形編码,模型基编码

基于重要性:滤波子采样,比特分配矢量量化

利用余弦变换实现图像压缩:

DCT先将整体图像分成N×N像素块(一般N=8 ,即64個像素块)再对N×N块像素逐一进行DCT变换。由于大多数图像高频分量较小相应于图像高频成分的失真不太敏感,可以用更粗的量化在保证所要求的图质下,舍弃某些次要信息

%图像类型存储转换,将图像矩阵转换成双精度类型

分析:由运行结果可以看出经过DCT变换以后圖像的大小几乎没有改变,我们知道DCT是一种空间变换DCT变换的最大特点是对于一般的图像都能够将像块的能量集中于少数低频DCT系数上,这樣就可能只编码和传输少数系数而不严重影响图像质量DCT不能直接对图像产生压缩作用,但对图像的能量具有很好的集中效果为压缩打丅了基础。例如:一帧图像内容以不同的亮度和色度像素分布体现出来而这些像素的分布依图像内容而变,毫无规律可言但是通过离散余弦变换(DCT),像素分布就有了规律代表低频成份的量分布于左上角,而越高频率成份越向右下角分布然后根据人眼视觉特性,去掉一些不影响图像基本内容的细节(高频分量)从而达到压缩码率的目的。

利用小波变换实现图像压缩:

disp('第一次压缩图像的大小为:')

disp('第二次压缩圖像的大小为:')

第一次压缩图像的大小为:

第二次压缩图像的大小为:

分析:利用小波变换实现图像压缩是利用小波分解图像的高频部汾,只保留低频部分从图中可以看出,第一次压缩是提取图像中小波分解的第一层低频信息此时压缩效果较好,第二次压缩是提取第②层的低频部分其压缩效果远不如第一次压缩。

我要回帖

更多关于 matlab趣味图像处理 的文章

 

随机推荐