一、簡介
本設計為硬幣影像識別統計裝置,通過數碼相機獲取平鋪無重疊堆積的硬幣的影像,并通過Matlab工具處理后統計硬幣的數目,

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


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

1.3灰度調整
對于這些發白部分,我們采用灰度調整及中值濾波進行處理,在matlab中,提供了兩個函式進行相應的操作,其中imadjust進行灰度調整,其用法如下
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經過灰度調整及中值濾波后的影像如圖1-4所示,可見,經過中值濾波后,硬幣的主體部分有了較大的改善,
1.4二值化處理
經過濾波后,即可對影像進行二值化處理,首先,我們采用人工選擇閾值的方法進行二值化,由圖可見,對于本幅圖片,其合適的閾值在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閾值分割
當然仍有許多模糊的硬幣管腳殘影,但已經將硬幣的主體很好的識別了出來,采用人工選擇閾值的方法雖然可以成功分離出硬幣的主體,但是這個閾值這是針對這張圖片有效,對于獲取的其它圖片,這個閾值并不能正確地對影像進行二值化處理,因此我們決定采用自動閾值分割的方法來對影像進行二值化,
我們所選用的自動閾值分割方法為Otsu法,它是一種使類間方差最大的自動確定閾值的方法,該方法具有簡單、處理速度快的特點,是一種常用的閾值選取方法,
在matlab中,提供了一個函式graythresh來實作Otsu法閾值分割,其用法如下:
T=graythresh(f);
其中,f為待進行閾值分割的灰度影像,T為回傳的分割灰度比例,將其乘于256即為Otsu法劃定的分割閾值,
優化后的程式如下:
T=graythresh(F);

由圖中可見,噪聲被有效的濾除了,但是,去除了噪聲的同時,也使部分接觸緊密的硬幣在閉運算后可能連成一個整體,如圖1-8中的紅圈所示,因此在此后的識別統計中需要對其進行特殊的處理,
二、源代碼
clear all;
close all;
f=imread('yingbi2.jpg');
w=imshow(f);title('原影像');
F=rgb2gray(f); %真彩圖轉化為灰度圖
figure;imshow(F);title('灰度圖');
figure;imhist(F);title('直方圖');
F0 = imadjust(F,stretchlim(F),[0 1]);
Ft=medfilt2(F0,[5 5]);
figure;imshow(Ft);title('灰度調整,中值濾波后的影像');
figure;imhist(Ft);title('灰度調整,中值濾波后的直方圖');
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('二值化結果');
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 = [];
%統計每個標簽的數量,有些硬幣可能會重疊在一起的情況一定要用此種方法
for i=1:N
[r,c] = find(L==i);
rc = [r c];
Num = length(rc);
Sum([i])=Num;
end
三、運行結果

四、備注
完整代碼或者代寫添加QQ 1564658423
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272327.html
標籤:其他
上一篇:C1任務01-修改游戲存檔


