作者:张青林 字数:4050 点击:

摘 要:本文设计了一套针对烟叶自动化烤制过程中图像处理与特征图样识别的算法,并给出了其中一些步骤的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;im_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;