图片中番茄个数的检测及标记
实验背景
随着我国农业方面不断向规模化、机械化方向发展,番茄的产量也大幅度增加。目前国内番茄采摘、筛选作业基本采用人工进行,劳动强度大、工作效率低。基于此,应用图像识别技术,研究设计果实采摘过程自动检测与识别技术成为目前研究人员的方向。
实验目的
熟悉掌握关于图像处理方面的相关知识,并将其整合,同时学习掌握Matlab的相关知识,实现对图像的处理。
实验内容
有一幅关于叶片的图片,叶片中含有番茄果实,运用所学知识,在Matlab中编程,找出果实个数并在图中标出其所在位置。
实验流程
实验步骤
1、获取彩色图片
MATLAB代码
rgb=imread('Image_rgb_15.tif');
2、转换为灰度图像
MATLAB代码:
I=rgb2gray(rgb);
3、获取灰度直方图并进行阈值化处理
MATLAB代码:
(1) figure,imhist(I);
观察灰度直方图,可以从图中看出在图像灰度60时为谷值,因此选阈值为60;
(2)I1=imadjust(I,[60/255 1],[0 60/255]);
将灰度值大于60/255的像素置1,灰度值小于50/255的像素置0,以减弱部分叶片的影响:
4、开运算
MATLAB代码:
se=strel('disk',40);
I2=imopen(I1,se);
选择半径为40的圆盘形结构元素对图像进行开运算,以消除点状噪声:
开运算后图像对比度很低,获取灰度直方图:
从灰度直方图中可以看出图像经过处理以后灰度值主要集中在了0~5左右;
5、n值化处理
MATLAB代码:
I2=50*I2;
n值化处理以增强对比度,增大50倍使灰度直方图基本分布在整个区域内:
6、二值化
MATLAB代码:
Ib=im2bw(I2);
7、区域标记
MATLAB代码:
[x,n]=bwlabel(Ib);
8、计算各区域特征值
MATLAB代码:
stats=regionprops(x,'all');
Ib1=zeros(size(Ib));
for i=1:n
ar=stats(i).Area;
max=stats(i).MajorAxisLength;
min=stats(i).MinorAxisLength;
Ri=max/min;
物体序号 | 面积 | 长宽比 |
1 | 5502 | 1.0154 |
2 | 6096 | 1.0550 |
3 | 10606 | 1.0952 |
4 | 8136 | 2.1866 |
根据查阅资料,我们将长宽比的限制范围限制在小于1.3,面积的限制范围限制在大于7000。与上表对比,我们可以看出只有物体编号为3的符合要求,因此基本可以判断出图中只有1个番茄果实。
9、检测目标区域并计数
MATLAB代码:
if Ri<1.3&ar>7000
[p,q]=find(x==i);
Ib2=bwselect(Ib,q,p);
Ib1=(Ib1)|(Ib2);
count=count+1
10、转换为伪彩色图像
MATLAB代码:
Lrgb=label2rgb(Ib1);
11、在原图上叠加伪彩色图像进行目标标记
MATLAB代码:
figure,imshow(rgb);
hold on
himage=imshow(Lrgb);
set(himage,'AlphaData',0.3);
12、设计GUI界面进行图像处理
(1)运行gui界面
(2)点击获取图像
(3)点击检测番茄
总结
总体来说,基本达到实验目标。在本次试验中,对图像处理的技术有了新的了解,在做此次作业之前,感觉图像处理的每一项技术都是分隔开的,无法较好的融合到一起,但是经过此次试验,进一步加深了对图像处理技术的了解。同时,掌握了Matlab一些相关函数的使用,并且较为熟练。本次,我们还设计了gui界面,便于操作者使用。
不足
1 、在对图像进行阈值化处理与选择结构元素时需要进行反复试验,找到最合适的阈值与结构元素形状、大小;
2、该实验并不具有普遍性,
3、计算各区域特征值的时候所选的限制范围是根据此次识别番茄果实而定的,若换为其他果实,由于形状、大小等因素的不同,可以会导致限制范围需要作出相应的改变。