摘 要:本文設計了一套針對煙葉自動化烤制過程中圖像處理與特征圖樣識別的算法,并給出了其中一些步驟的C語言和MATLAB程序以作模擬。以期為煙葉生產廠商自動化生產流程中關鍵階段準確識別提供思路。
關鍵詞:煙葉烤制;圖像處理;圖像識別;自動化
1 烤煙制作全過程中各狀態圖像的特征分析
1.1 鮮煙狀態(烘烤前):煙葉呈現鮮綠色,葉片明顯舒展文理較為平整、圖中的“溝壑”較少,葉片過渡平整。
1.2 葉片變軟狀態(失水20%):煙葉明顯變黃,呈現黃綠色,葉片開始蜷縮但“溝壑”仍較少,葉片較為平整。
1.3 主脈變軟狀態(失水30%):葉片基本全部變黃,只有葉片中部尚存在零星綠色(應為煙葉的輸水管部分),葉片蜷縮現象更加明顯。
1.4 勾尖卷邊狀態(失水40%):葉片黃色繼續加深,蜷縮明顯,出現“溝壑”現象。
1.5 小打筒狀態(失水55%):黃色略微加深,“溝壑”繼續加深。
1.6 大打筒狀態(失水75%):葉片最黃,“溝壑”最為明顯。
1.7 干筋狀態(烘烤結束):葉片黃色略微回淺(即更鮮亮),綠色含量最少,“溝壑”現象依舊比較明顯但比較前一狀態有所舒展,葉片色澤均勻。
2 本文設計的工作流程
2.1 CCD數碼相機定時拍攝圖像直接傳至計算機端,每次圖像保存兩份;
2.2 對一份圖片分別進入RGB通道處理,處理前先進行巴特沃斯低通濾波或中值濾波(普遍認為巴特沃斯低通濾波效果更好,如采用中值濾波經重慶大學楊陽[3]等人反復試驗測試得出采用5 X 5鄰域的中值濾波效果較好),再分別求出其紅綠藍分量特征值。紅綠藍三色特征值分別達到146、115、43時可以認為煙葉是烤制完成的干筋狀態。三色中有一色不符合即為未完成,刪除舊圖像后從新提取新的圖像進行檢測。顏色識別還可以利用二值化,當三色中不符合要求的點數少到一定值后,可以認為煙葉烤制完成。
2.3 當煙葉的顏色達標后,對所保存的另一張相同圖像只使用其R分量做下述處理,提取其形態學特征(煙葉顏色不能達標時此步驟直接略去):
①在配置OpenCV庫函數的C語言編輯器中使用Sobel 算子或Canny 算子等提取圖像邊緣,如需使用C語言編程,可以考慮在配置好OpenCV庫函數的C語言編輯器下運行Sobel算子函數,鄭州大學郭明儒[4]曾給出如下計算方法:cvSobel(const CvArr* src, CvArr* dst, int xorder, int yorder, int aperyure_size=3); src:輸入圖像;dst:輸出圖像; xorder:x方 向上的差分階數; yorder:y方向上的差分階數; aperyure_size:擴展Sobel核的窗口階數,必須是1,3,5,7。
②提取后的圖像需要經過1~2次開運算腐蝕膨脹消除噪聲后提取主筋,再利用Hough變換提取出煙葉的主脈部分。提取后的紋理與上文表格中提到的紋理熵等進行比較,如果其取值在合理范圍內,就說明烤制完成。
3 針對所使用的算法編制相應的處理程序
3.1 MATLAB編程
(1) 圖像讀取與存儲:
讀取f=imread(‘C:\Users\Administrator\1.jpg);
存儲imwrite(f,C:\Users\Administrator\Desktop)
for i=1:10
str=[‘C:\Users\Administrator\Desktop\img,num2str(i),.tif];
f=imread(str);
end
(2) 濾波:
>> w=ones(2);
>> g1=imfilter(f,w,replicate);
>> subplot(2,2,1);imshow(f);title(‘origin image);
>> subplot(2,2,2);imshow(g1);title(‘smooth image);
>> g2=medfilt2(f(:,:,1),[4,4]);
>> subplot(2,2,3);imshow(g2,[]);title(‘med filter);
>> se=strel(‘square,4);
>> g3=imclose(f(:,:,1),se);
>> subplot(2,2,4);imshow(g3,[]);title(‘imclose);
(3) 形態學分析:條紋間距
>> f4=f2(50:350,200:300);
>> figure,imshow(f4);
>> [r,c]=find(f4==1);
(4) 閾值化:
>> f=im2double(f(:,:,1));
>> subplot(2,2,1);imshow(f);title(‘origin iamge);
>> [gv t]=edge(f,sobel);
>> subplot(2,2,2);imshow(gv,[]);title(‘sobel);
>> [gf t]=edge(f,log);
>> subplot(2,2,3);imshow(gf,[]);title(‘log);
>> [gc t]=edge(f,canny);
>> subplot(2,2,4);imshow(gc,[]);title(‘canny);
3.2 C語言編程
上述過程均可采用C語言實現,如:
閾值化:
void CZqlView::OnThresh()
{CZqlDoc* pDoc = GetDocument();
if (?。╬Doc->m_Dib.GetHandle())) return;
int iWidth = pDoc->m_Dib.GetWidth();
int iHeight = pDoc->m_Dib.GetHeight();
int iBitsWidth = pDoc->m_Dib.GetBitsWidth();
LPSTR lpStartBit = pDoc->m_Dib.GetPixelBit();
int i,j,n=0;
unsigned char * lpPixel;
for (i=0;i
中值濾波
void CZqlView::OnZhongzhilvbo() {CZqlDoc* pDoc = GetDocument();
if (!(pDoc->m_Dib.GetHandle())) return; CDIB Dib=pDoc->m_Dib; int iWidth = Dib.GetWidth(); int iHeight = Dib.GetHeight(); int iBitsWidth = Dib.GetBitsWidth();
LPSTR lpStartBitb =Dib.GetPixelBit();LPSTR lpStartBits =pDoc->m_Dib.GetPixelBit();
int i,j,k,m,n; int c[9]; unsigned char * lpPixelb; unsigned char * lpPixels; double dp=0;
for (i=1;i for(m=0;m<8;m++) {for(n=0;n<8-m;n++) { if(c[n]>c[n+1]) {k=c[n]; c[n]=c[n+1]; c[n+1]=k; }}} dp=c[4]; lpPixels=(unsigned char*)lpStartBits + (iHeight-1-i) * iBitsWidth + j; *lpPixels=(unsigned char)dp;}} Invalidate(); }4 系統總結 本文分兩路對煙葉的顏色和形態分別鑒定,二者均達標時檢出。這樣的要求很高,被檢出的煙葉為干筋狀態的概率會非常大,但顯易存在已烤好的煙葉因某種情況未能檢出的現象,需多試驗定好各閾值來避免此現象的發生。 對于其中的幾個算法,采用MATLAB進行了仿真模擬,尤其是顏色提取等效果比較好,這一系統可以對本例中已經烤制好的煙葉與未烤制完成的煙葉進行區分。正如首段提及的,因為本文在設計中本著烤制完成誤差率最低思想進行的實際,也就是對烤制完成的標準要求設計的較高,這樣被識別的煙葉處于干筋狀態的概率極大,但也可能存在有些煙葉因為各種原因已經烤制完成卻無法檢出的情況。由于實驗條件有限,尚未發現這一情況,但是可以預料到高的水準要求一定會存在這種未檢出的情況,關于各種閾值的把控,還需要經過多次實際實驗檢驗才能摸索出最好的狀態。 考慮產品的便攜性,本文認為采用C語言雖然初期編程較為繁瑣,但后期應用的方便性遠好于MATLAB,便于在各種嵌入式設備上輕松移植,使產品小型化、便攜化、成本最低化和效率最高化。另外C語言運行更快捷,短時間內處理圖像能力更高,配置OpenCV等庫函數后功能同樣齊全,也更適合在工廠等部門進行實際推廣應用。 參考文獻 [1].段史江,宋朝鵬,馬力,史龍飛,王文超,宮長榮.基于圖像處理的烘烤過程中煙葉含水量檢測[J].西北農林科技大學學報,2012,05. [2].宋朝鵬,段史江,李長軍,馬力,史龍飛,宮長榮.烘烤過程中基于圖像處理的烤煙形態特征分析[J].湖南農業大學學報,2011,12. [3].楊陽.基于煙葉圖像處理的密集化烤房溫濕度系統設計[D].重慶大學,2014. [4].郭明儒.基于模糊 PID 的煙葉烤房控制系統設計[D]. 鄭州大學, 2011. 作者簡介 張青林(1995-),鄭州大學物理工程學院電子信息科學與技術專業2013級本科生,曾主持河南省“挑戰杯”競賽作品一項、鄭州大學“大學生創新創業訓練計劃項目”一項等。