最簡單的程式碼【數字影象處理】計算rice.png中米粒個數
阿新 • • 發佈:2019-01-29
影象處理課程上老師佈置的任務,要求求出圖片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))