matlab第八课:图像分析(下)

目标:

  1. 图像阈值
  2. 背景评估
  3. 联通区域标记

一、图像阈值

  • 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);

       

猜你喜欢

转载自blog.csdn.net/gyt15663668337/article/details/83340618