1. 程式人生 > >最簡單的程式碼【數字影象處理】計算rice.png中米粒個數

最簡單的程式碼【數字影象處理】計算rice.png中米粒個數

影象處理課程上老師佈置的任務,要求求出圖片rice.png中米粒的個數及其各米粒的大小。

本來開始的時候我們不是很會做,就去百度或者去部落格園上面查詢別人的程式碼,發現都很長。少則三四十行,多則五六十行。一下看懂太過困難,最後老師講解了一下,這是最終版本,不超過10行就搞定了。PS:我在CSDN上面看到別的版本是69粒,是因為它去掉了邊緣部分。

I=imread('rice.png');
BG=imopen(I,strel('disk',15));
%對影象實現開運算,開運算一般能平滑影象的輪廓,消弱狹窄的部分,去掉細的突出。 
% imshow(BG);
I2=imsubtract(I,BG);
% imshow(I2); 
%????????
level=graythresh(I2);
bw2=im2bw(I2,level);
imshow(bw2);
[labeled,numObjects]=bwlabel(bw2,8);
max(max(labeled))



輸出結果為99,故一共有99粒米

下面來講解如何計算出該結果的,

rice.png

首先我們可以看到這張圖是明暗不均的一張圖片,上面的亮度比下面的亮度高,甚至還有些雜色,第一步我們要做的就是提取出背景,然後用原圖減去背景圖,就可以將米粒完整乾淨的提取出來了。

I=imread('rice.png');

BG=imopen(I,strel('disk',15));
imshow(BG);
 
I2=imsubtract(I,BG);
imshow(I2);

提取出來的背景顏色

BG



原圖減去背景顏色:


這個時候我們可以發現圖中只有米粒,沒有其他干擾選項了

為了便於操作我們將該圖轉變為二進位制圖片

level=graythresh(I2);
bw2=im2bw(I2,level);
imshow(bw2);



這個時候,影象的矩陣只有0和1兩種數值

如下圖格式

0

0

0

1

1

1

0

1

0

0

0

1

0

0

1

1

而每個米粒是由多個畫素連線在一起的,我們將多個畫素連在一起的一個部分稱為團,比如上圖有兩個團,只要將判別出來有幾個團,即得米粒個數。

那我們如何判別出來有幾個團?
在這採取標號法,再以上圖為例,

0

0

0

2

1

1

0

2

0

0

0

2

0

0

2

2


 

遇見第一個團,將內部所有元素標為1,遇見第二個團將所有元素標為2.直到標到最後一個元素。

level=graythresh(I2);
bw2=im2bw(I2,level);
imshow(bw2);
[labeled,numObjects]=bwlabel(bw2,8);
max(max(labeled))

然後再找出該矩陣最大的數即米粒個數