摘 要:本文设计了一套针对烟叶自动化烤制过程中图像处理与特征图样识别的算法,并给出了其中一些步骤的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 (!(pDoc->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级本科生,曾主持河南省“挑战杯”竞赛作品一项、郑州大学“大学生创新创业训练计划项目”一项等。