目标:
- 图像阈值
- 背景评估
- 联通区域标记
一、图像阈值
- graythresh():找出一个图像的最佳阈值是什么
- im2bw():转变图像为二值图像
I = imread('rice.png');
level=graythresh(I); % 获取阈值
bw=im2bw(I, level); % 根据阈值,转化为二值图像
subplot(1,2,1);
imshow(I);
subplot (1,2,2);
imshow(bw)
这个图像是不完美的,在转换为黑白二值图像的时候,有一些白色的点,有一些米不见了,是由于图像的打光不均匀,上边亮下边暗,造成前景和背景的误判。因此,我们要对背景进行评估,减掉背景,使背景分布均匀。
二、背景评估
1. Background Estimation(背景评估)
I = imread('rice.png');
BG = imopen(I, strel('disk', 15)); % 获得背景的评估
imshow(BG);
在这个背景评估图片中我们可以看到上边比较亮,下边比较暗。接下来我们做第二步,用原图像减去背景评估图。
2.Background Subtraction
I = imread('rice.png');
subplot(1,3,1); imshow(I);
BG = imopen(I, strel('disk', 15)); % 得到背景评估图
subplot(1,3,2); imshow(BG);
I2 = imsubtract(I, BG); % 使用原图减去背景评估图
subplot(1,3,3);
imshow(I2);
3.Thresholding on Background Removed Image
I = imread('rice.png');
% 获取阈值
level = graythresh(I);
% 转换为二值图像
bw = im2bw(I, level);
subplot(1,2,1); imshow(bw);
% 获得背景图
BG = imopen(I, strel('disk', 15));
% 原图减去背景图
I2 = imsubtract(I, BG);
% 获得背景均匀图的阈值
level = graythresh(I2);
bw2 = im2bw(I2, level);
subplot(1,2,2); imshow(bw2);
右边是经过处理之后的图,很明显效果要比左边的好。
下面,我们要计算图中有多少粒米,就需要用到连通域分析。
三、连通域分析
我们要求得图像中,有多少粒米,在二值图像中,只有0和一两个值,有1的位置代表是米,并且相连位置的1是一个米的形状。因此,我们穿建一个标签矩阵。
第一步:从二值图像的左上角开始遍历,当遇见第一个1时,标签矩阵的相应位置设为1,二值图像的矩阵位置变为0.
第二步: 查看该位置的右边和下边,为1的话就把标签位置设为1,二值图像的位置设为0.一直进行下去,如果为0就两个矩阵都不改变。
第三步:继续操作,一直到右边和下边的位置都是0时,则一个米粒标记完成。
第四步:继续按顺序遍历二值图像矩阵。当再次遇到1的时候,就将标签矩阵的位置记为2.二值矩阵记为0. 与上面的方式相同。
第五步:以此类推,计算出第二个,第三个。
MATLAB提供了一个函数,来计算label matrix。注意,必须是对二值图像进行操作。
I=imread('rice.png');
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG);
level=graythresh(I2);
BW=im2bw(I2, level);
[labeled, numObjects]=bwlabel(BW, 8);
labeled:就是生成的标签矩阵。生成的是256*256的矩阵,下面是截取的一部分。
Color-coding Objects: label2rgb()
- 将label matrix 转换为rgb颜色图像
- 可视化rgb图像
I=imread('rice.png');
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG);
level=graythresh(I2);
BW=im2bw(I2, level);
[labeled, numObjects]=bwlabel(BW, 8);
RGB_label=label2rgb(labeled); % 将label矩阵转为rgb图像
imshow(RGB_label);
Object Properties: regionprops()
获取没个连通域的属性:
I=imread('rice.png');
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG);
level=graythresh(I2);
BW=im2bw(I2, level);
[labeled, numObjects]=bwlabel(BW, 8);
graindata = regionprops(labeled, 'basic'); % 获取相关属性
graindata(51) % 查看第51粒米的属性
Interactive Selection: bwselect()
可以选择哪个米,然后只显示选择的米
I=imread('rice.png');
level=graythresh(I);
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG);
BW=im2bw(I2, graythresh(I2));
ObjI = bwselect(BW); % 可以选择米粒
imshow(ObjI);