基于数字图像处理技术测定植物叶片属性
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于数字图像处理技术测定植物叶片属性
一、实验名称:基于数字图像处理技术测定植物叶片属性。
二、实验目的
1.掌握并熟练使用matlab R2014b软件;
2.采用合适的分割方法对原图片进行图像分割,获取目标叶片;
3.将分割后的图片进行去噪增强处理;
4.通过matlab软件来测定目标叶片的属性;
5.通过手工网格法计算出目标叶片实际属性,并与实验结果对比修改。
三、实验原理
实验通过手动网格法测出叶片实际面积值,并与通过matlab图像处理计算出的实验面积值对比,研究测试运用matlab图像处理技术提取叶片面积的可行性。
实验中,将已知属性的小方格(1cm*1cm)作为参照物与所测叶片置于同一平面的白纸上,用手机相机获取图像。由于数字图像都是由一个个像素点组成,可以根据像素点比例和参照物属性求出植物叶片属性。
叶片面积计算公式如下:Array
式1:叶片面积 = 参照物面积
叶片周长计算公式如下:
式2:叶片周长 = 参照物周长
四、实验步骤
(1)网格测面积
手工制作网格纸一张(最小格边长5mm),将叶片轮廓描于纸上,计算轮廓所占方格数(未占满格的均按半格计算),得出实际面积约为24cm2。用一根细线围绕叶子一周,然后拉直,测其周长为22.2cm。
图1:获取的原图片(黑方格为参照物)
图2:网格法求叶片实际面积
(2)matlab图像处理提取叶片属性
1、图像灰度处理
图3:灰度图像 2、中值滤波
图4:中值滤波
3、二值化
图5:二值化图像4、颜色反转
5、提取边缘
6、填补边缘空隙
7、图像切割
对分割后的图像进行图像切割,平均分为三份(如图6、7)。
图6:切割后的叶片图像
图7:切割后的参照物图像
8、分别计算目标叶片和参照物图像的像素数
由于分割后的图像均为二值图像(0和255),所以目标叶片和参照物图像的像素数可以运用sum()函数列出以下式子得出:
参照物像素数=sum(sum(参照物图像))/255;
目标叶片像素数=sum(sum(目标叶片图像))/255;
9、分别计算目标叶片和参照物的实验周长
首先运用bwconncomp函数分析滤波后图像的连通域个数,然后运用regionprops函数计算各连通域周长。
五、结论分析
通过式1、式2得出叶片实验面积为:23.626692 cm2、周长21.697166cm。
图8:实验结果截图
与网格法得出的实际面积约为24 cm2对比,误差为0.37 cm2,周长的误差则为0.5cm,误差较小,可以接受。
六、实验代码
a=imread('leaf.jpg');
figure,imshow(a);title('原图像');
b=rgb2gray(a);
figure,imshow(b);title('灰度图');
c=medfilt2(b);
figure,imshow(c);title('中值滤波');
level=graythresh(c);
d=im2bw(c,level);
figure,imshow(d);title('二值化');
e=imcomplement(d);
figure,imshow(e);title('颜色反转');
image1 = edge(e,'sobel');
image2 = edge(e,'roberts');
image3 = edge(e,'prewitt');
image4 = edge(e,'canny');
figure;
subplot(2,2,1);
imshow(image1);title('soble图像边缘提取')
subplot(2,2,2);
imshow(image2);title('roberts图像边缘提取')
subplot(2,2,3);
imshow(image3);title('prewitt图像边缘提取')
subplot(2,2,4);
imshow(image4);title('canny图像边缘提取')
I = strel('line',3,90);
H = strel('line',3,0);
t = imdilate(image4,[I H]);
figure,imshow(t);title('填补边缘缝隙的图像');
filled = imfill(t,'holes');
figure,imshow(filled);title('填充空隙后的图像');
SeD = strel('diamond',1);
final = imerode(filled,SeD);
final = imerode(final,SeD);
figure,imshow(final);title('平滑后的图像');
%图像平均切割为三份
[x,y]=size(final); %求图像大小
imwrite(final(1:x,round(y*2/3):y),'方块.jpg','jpg');%切割得到“方块”的图像
imwrite(final(1:x,round(y/3):round(y*2/3)),'树叶1.jpg','jpg');%切割得到“树叶1”的图像
%计算叶片和参照物的像素数,以及叶片面积
im1 = imread('方块.jpg'); %读取图像
im2 = imread('树叶1.jpg'); % 读取图像
num1=sum(sum(im1))/255;
num2=sum(sum(im2))/255;
mj=num2/num1;
fprintf('面积为 %f平方厘米\n ',mj);
cc = bwconncomp(final, 4); %4连通域
Perdata = regionprops(cc,'Perimeter');
per1=Perdata(1).Perimeter;
per2=Perdata(2).Perimeter;
Per=per1/per2*4;
fprintf('叶子周长为 %f厘米\n ',Per);