matlab—影像分析进阶

十三、影像分析进阶

在这一章里面我们要做的事情全部都围绕两个问题,一个图像当中有多少个xxx,他们的大小是多少,举个例子

图13-1 rice

上图是一个米的影像,这张图片里有很多的米,现在我们的问题是,这里面有多少米,他们的大小是多少?

13.1 graythresh() and im2bw()

我们要回答上述两个问题,首先要做的是对影像进行预处理,第一步就是对图像进行阈值化处理。所谓阈值化处理就是当灰度值低于一个值(阈值)时,让其成为一个小的值,当灰度值大于一个值(阈值)时,让其成为一个大的值,即实现了阈值分割,这样图像就黑白分明,对比度加大了

所以我们首先要找到阈值,才能进行阈值化处理,matlab为我们提供了两个函数:

1.graythresh():使用最大类间方差法找到图片的一个合适阈值,其调用格式为:level = graythresh();

2.im2bw():使用阈值变换法把灰度图像转换成二值图像,所谓二值图像就是只有0(纯黑)、255(纯白),其调用格式为:bw = im2bw(I,level);,其中I是原图像对应矩阵,level是阈值

示例:

图13-2 阈值化处理

现在我们看上面的图,其实还没有打到我们想要的效果,因为有的米在处理的时候直接消失了,还有的变成了很多小颗粒,这些都会影响我们的结果。究其原因,我们发现,原图的背景本身就不是很均匀,中间部分比较亮,下半部分比较暗,所以我们要想办法去掉背景(background subtraction)

13.2 background subtraction

要想去掉背景,首先我们得把背景分离出来吧,这里用到一个函数imopen,读者照做即可

图13-3 去掉背景

现在我们可以将去掉背景以后的影响在做阈值化处理

图13-4 阈值化处理2

到此我们的影像预处理算是完成了,得到了一个比较满意的处理后的影像,下面我们就是要想办法让计算机去“数”有多少颗米,这说起来可能比较难,但是我们先分析图上,怎么样算是一颗米,我们不妨先看一下bw的矩阵

图13-5 bw矩阵

因为矩阵太大,所以我随便节选了一个部分,经过阈值化处理之后,矩阵内只有0和1,0表示黑,1表示白,我们的影像也是这样,米是白的,所以我们可以看到,在矩阵中,连续的一段区域内都是1,也就表示这是一颗米,当然这个类似于搜索的算法,不需要我们写,matlab为我们提供了函数bwlabel

13.3 bwlabel()

调用格式:L = bwlabel(bw,n),返回一个和bw大小相同的矩阵L,包含了标记bw中每个连通区域的类别标签,这些标签的值为1、2......num(连通区域的个数),n的值为4或8,表示是按4连通寻找还是按8连通寻找。4连通是指,如果像素的位置在像素相邻的上、下、左、右,则认为他们是连通的。8连通是指,如果像素的位置在像素相邻的上、下、左、右、左上角、左下角、右上角、右下角,则认为他们是连通的

示例:

图13-6 示例1

>>L = bwlabel(bw,4);

图13-7 四连通寻找

>>[L, num] = bwlabel(BW,8)

图13-8 八连通寻找

下面我们开始分析米的数量

图13-9 99颗米

计算出来的结果,num是99,所以图上一共有99颗米,不信的话可以打开label矩阵,看看靠右下角的地方数值是不是99。那么数完了米的数量,读者还可以思考一下,如何求出最大的米的大小以及所有米的平均大小,这两个问题留给读者下去思考

13.4 label2rgb()

我们再多学习几个函数,label2rgb这个函数的名字一听就知道,是将一个影像转换成rgb色彩,参数太简单我就不写了,直接看示例

示例:

图13-10 label2rgb函数

13.5 regionprops()

用来度量图像区域属性的函数regionprops(),调用格式为:stats = regionprops(L,properties);

参数说明:测量矩阵L中每一个标注区域的一系列属性,返回值stats是一个长度为max(L(:))的结构数组,结构数组的相应区域定义了每一个区域相应属性下的度量,properties可以是”all”或者”basic”,如果是all,则所有度量数据都将被计算,详情参考360百科:https://baike.so.com/doc/3338660-3515923.html

示例:

图13-11 regionprops函数

stats存储的是这99颗米,每颗米的area、centroid、boundingbox这三个度量的数据,如果要想查看第某颗米的数据,只需要stats(x)即可,这里我查看的是第33颗米的数据

13.6 bwselect()

最后说一个函数就结束影像处理的部分了,这个函数能够让用户与影像产生交互,bwselct,参数比较简单,直接给出示例

示例:

图13-12 bwselect函数

还没完,这时你把鼠标移到图上,随便点击几颗米,然后摁一下鼠标右键,图上就会只剩你点击的几颗米

图13-13bwselect函数(续)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏新智元

TensorFlow官方力推、GitHub爆款项目:用Attention模型自动生成图像字幕

【新智元导读】近期,TensorFlow官方推文推荐了一款十分有趣的项目——用Attention模型生成图像字幕。而该项目在GitHub社区也收获了近十万“点赞...

2012
来自专栏人工智能LeadAI

基于Spark /Tensorflow使用CNN处理NLP的尝试

01 前言 关于CNN如何和NLP结合,其实是被这篇文章(http://www.wildml.com/2015/11/understanding-convolu...

3946
来自专栏华章科技

与数据挖掘有关或有帮助的R包和函数的集合

rpart,party,randomForest,rpartOrdinal,tree,marginTree,

873
来自专栏DHUtoBUAA

编程求取直线一般式表达式,两直线交点

背景介绍   最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给...

4757
来自专栏编程软文

前端慌不慌?用深度学习自动生成HTML代码

5706
来自专栏祝威廉

基于Spark /Tensorflow使用CNN处理NLP的尝试

关于CNN如何和NLP结合,其实是被这篇文章指导入门的 。 我觉得使用CNN去处理一些NLP的分类问题,是非常不错的。

1732
来自专栏机器之心

教程 | 利用TensorFlow和神经网络来处理文本分类问题

3447
来自专栏游戏开发那些事

【小白学游戏常用算法】一、随机迷宫算法

  现在的很多游戏中的地图一般采用格子的方式,虽然在表面地图上无法看到实际的格子,但是在地图的结构中专门有一个逻辑层,这个层和地图大小相等,划出很多小的格子,然...

1552
来自专栏desperate633

小白也能看懂的BP反向传播算法之Towards-Backpropagation

想要理解backpropagation反向传播算法,就必须先理解微分!本文会以一个简单的神经元的例子来讲解backpropagation反向传播算法中的微分的概...

861
来自专栏贾老师の博客

【笔记】ejoy2d —— matrix

1314

扫码关注云+社区

领取腾讯云代金券