matlab第八課:影象分析(下)
目標:
- 影象閾值
- 背景評估
- 聯通區域標記
一、影象閾值
- 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);