【圖像計數(shù)】基于形態(tài)學(xué)實現(xiàn)硬幣計數(shù)matlab源碼
一、簡介
本設(shè)計為硬幣圖像識別統(tǒng)計裝置,通過數(shù)碼相機獲取平鋪無重疊堆積的硬幣的圖像,并通過Matlab工具處理后統(tǒng)計硬幣的數(shù)目。

1 圖像格式轉(zhuǎn)換
取的圖像格式為RGB彩色圖像,需要先將其轉(zhuǎn)換為8位256級的灰度圖像。本程序采用Matlab的圖像處理工具箱的函數(shù)rgb2gray來實現(xiàn)。
rgb2gray()
功能:
轉(zhuǎn)換RGB圖像或顏色映像表為灰度圖像。
語法:
I = rgb2gray(RGB)
newmap = rgb2gray(map)
2 去噪及特征提取


圖1-2 灰度圖及其直方圖
上圖1-1為硬幣統(tǒng)計的局部圖片,圖中可見,硬幣主體部分和背景以及圖像有著明顯的區(qū)別,可以通過選取合適的閾值進行二值化,從而提取出硬幣的特征。
圖1-2為此圖像的直方圖,從圖中可見到比較明顯的閾值分界點,但是并不是非常的明顯,這是因為,圖中有很多的硬幣因為反光的緣故,導(dǎo)致主體部分有些發(fā)白,如圖1-3所示。

1.3灰度調(diào)整
對于這些發(fā)白部分,我們采用灰度調(diào)整及中值濾波進行處理,在matlab中,提供了兩個函數(shù)進行相應(yīng)的操作,其中imadjust進行灰度調(diào)整,其用法如下
Imadjst(f,[low_in high_in],[low_out high_out],gamma)
Gamma所表示的意義:
1 -------- 凹曲線
<1 -------- 凸直線
=1 -------- 直線
medfilt2用于進行中值濾波處理,其用法如下
F=medfilt2(f,[m n]);
f為輸入圖像
[m n]為中值濾波模板
F是中值濾波后輸出的圖像。
圖4-1經(jīng)過灰度調(diào)整及中值濾波后的圖像如圖1-4所示,可見,經(jīng)過中值濾波后,硬幣的主體部分有了較大的改善。

1.4二值化處理
經(jīng)過濾波后,即可對圖像進行二值化處理,首先,我們采用人工選擇閾值的方法進行二值化,由圖可見,對于本幅圖片,其合適的閾值在50~100之間,通過試驗,我們選取的值為80。
對圖像二值化處理的程序如下:
[M,N]=size(F);
for x=1:M
for y=1:N
if F(x,y)<80
F(x,y)=0; %低于閾值的值黑
else
F(x,y)=255; %高于閾值的值白
end
end
end
處理后的圖像如圖1-6所示:

1.5閾值分割
當然仍有許多模糊的硬幣管腳殘影,但已經(jīng)將硬幣的主體很好的識別了出來,采用人工選擇閾值的方法雖然可以成功分離出硬幣的主體,但是這個閾值這是針對這張圖片有效,對于獲取的其它圖片,這個閾值并不能正確地對圖像進行二值化處理,因此我們決定采用自動閾值分割的方法來對圖像進行二值化。
我們所選用的自動閾值分割方法為Otsu法,它是一種使類間方差最大的自動確定閾值的方法,該方法具有簡單、處理速度快的特點,是一種常用的閾值選取方法。
在matlab中,提供了一個函數(shù)graythresh來實現(xiàn)Otsu法閾值分割,其用法如下:
T=graythresh(f);
其中,f為待進行閾值分割的灰度圖像,T為返回的分割灰度比例,將其乘于256即為Otsu法劃定的分割閾值。
優(yōu)化后的程序如下:
T=graythresh(F);

由圖中可見,噪聲被有效的濾除了,但是,去除了噪聲的同時,也使部分接觸緊密的硬幣在閉運算后可能連成一個整體,如圖1-8中的紅圈所示,因此在此后的識別統(tǒng)計中需要對其進行特殊的處理。
二、源代碼
clear all;
close all;
f=imread('yingbi2.jpg');
w=imshow(f);title('原圖像');
F=rgb2gray(f); %真彩圖轉(zhuǎn)化為灰度圖
figure;imshow(F);title('灰度圖');
figure;imhist(F);title('直方圖');
F0 = imadjust(F,stretchlim(F),[0 1]);
Ft=medfilt2(F0,[5 5]);
figure;imshow(Ft);title('灰度調(diào)整,中值濾波后的圖像');
figure;imhist(Ft);title('灰度調(diào)整,中值濾波后的直方圖');
T=graythresh(Ft);
T=T*256-5;
[M,N]=size(Ft);
for x=1:M
? ?for y=1:N
? ? ? ?if Ft(x,y)<T
? ? ? ? ? ?Ft(x,y)=0; %低于閾值的值黑
? ? ? ?else
? ? ? ? ? ?Ft(x,y)=255; %高于閾值的值白
? ? ? ?end
? ?end
end
figure;imshow(Ft);title('二值化結(jié)果');
B=ones(10);
F0=imclose(Ft,B);
figure;imshow(F0);title('閉運算');
F1=imadjust(F0,[0,1],[1,0],1);
figure;imshow(F1);title('反色');
%對圖像貼標簽
[L N]=bwlabel(F1,8) ? ? ? ?
Sum = [];
%統(tǒng)計每個標簽的數(shù)量,有些硬幣可能會重疊在一起的情況一定要用此種方法
for i=1:N
[r,c] = find(L==i); ? ? ? ? ? ? ? ? ? ? ?
rc = [r c];
Num = length(rc); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Sum([i])=Num; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
end
三、運行結(jié)果
