1. 程式人生 > >matlab第八課:影象分析(下)

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