Image Thresholding(图像阈值化)
如何数下图中有多少颗米?
- 将图转为binary图,背景将变黑,米变白
- 计算连在一起的白色区域有多少
阈值图就是设定一个阈值,大于阈值的值都将被设为白色(1),小于阈值的值都将被设为黑色(0)
Image Thresholding
threshold(阈值)
- graythresh()
找出阈值 - im2bw()
根据阈值将影像转为binary image(二元图像)
也可以用两层循环遍历图像的每个点,然后与自定义的阈值比较,大于阈值置为1,小于阈值置为0,来实现上述函数
Background estimation
背景会影响图像识别,所以可以先把背景识别出来,然后用原图减掉他
这样原来的执行过程就可优化为:
imsubstract 是相减
可以看出准确度大大提高
Connected-component labeling
扫描图像中的点,将相连的同一非零数值标上label
过程:
- 背景全部标0,label初始值为1
- 从第一个非0点开始,值标为label(此时是1)
- 将与这个点相连的点都标为label(1)
- label=label+1(此时是2)
- 寻找下一个非0点
- …
从而实现数出米粒的颗数(即最后的label值)
- bwlabel()
只用于binary image
1.bwlabel()
Matlab中bwlabel函数的使用
语法: L = bwlabel(BW,n)
返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。
4连通/8连通
4连通/8连通是图像处理里的基本概念:
- 4连通是指,如果像素的位置在其他像素相邻的上、下、左 或 右,则认为他们是连接着的,连通的,
- 8连通,则是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角 或 右下角连接着,则认为他们是联通的;
[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。
通俗的说,这个函数的作用是用来找这个二值图像中的连通区域的,对于不同的符合条件的连通区域(4连通,8连通)分别用不同的标号加以区别,结果保存在L这个矩阵里,而num里保存的是输入图像中连通区域的总数。
example
2.label2rgb()
给不同label的标上特定颜色
3.cat()
任务:将米标为红色,背景标为黑色
cat() : 用来联结数组
用法:
C = cat(dim, A, B) 按dim来联结A和B两个数组。
C = cat(dim, A1, A2, A3, …) 按dim联结所有输入的数组。
一个常用的用法:
由于灰度图是二维的,RGB图是三维的,在做图像处理的时候,如果需要升维,可以考虑用cat,三个灰度图(二维矩阵)可以用cat叠加为三维的RGB图
example
imshow(cat(3,labeled,zeros(size(labeled,1),size(labeled,2)),zeros(size(labeled,1),size(labeled,2))))
4.降噪
有些米粒只有部分出现,可以设置阈值将阈值以下的置零
有些米粒两个连在了一起,可以设置阈值根据情况将阈值以上的数目乘2或更多
5.regionprops()
用途:get the properties of region,即用来度量图像区域属性的函数。
语法:STATS = regionprops(L,properties)
描述:测量标注矩阵L中每一个标注区域的一系列属性。
L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。
返回值STATS是一个长度为max(L( : ))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。
properties 可以是由逗号分割的字符串列表、饱含字符串的单元数组、单个字符串 ‘all’ 或者 ‘basic’。如果 properties 等于字符串 ‘all’,则所有下述字串列表中的度量数据都将被计算,如果 properties 没有指定或者等于 ‘basic’,则属性: ‘Area’, ‘Centroid’, 和 ‘BoundingBox’ 将被计算。
graindata(51)即查看第51颗米的数据
6.bwselect()
可以互动式选择米
十字标选中米,然后按esc 便会只显示这些选中的米