%计算各个图形单元的周长 用连接像素点或数边界像素点个数的方法 numPoints数组表示各个图形边界的像素个数(即用个数来表示周长) %num = max(max(Label)); for i = 1 : num Premeter(i) = 0; end
[row,col] = size(Label); for i = 1 : row for j = 1 : col if(Label(i,j) > 0)
Premeter(Label(i,j)) = Premeter(Label(i,j)) + 1; %计算标记后的各块图形边界中像素的个数的总数 end end end
%5计算各个图形单元的面积
FilledLabel = imfill(Label,'holes'); %填充打过标记的边界线中间围成的图形区域 figure,imshow(FilledLabel),title('打过标记后并已被填充的结果图像'); for i = 1 : num Area(i) = 0; end
[row,col] = size(FilledLabel); for i = 1 : row for j = 1 : col
if(FilledLabel(i,j) > 0)
Area(FilledLabel(i,j)) = Area(FilledLabel(i,j)) + 1; %通过统计像素点个数的方式来求各形状的面积 end end
end
%计算各个图形单元的圆度 for i = 1 : num
Ecllipseratio(i) = 4*pi*Area(i)/Premeter(i)^2; end %识别苹果
%构建苹果的分类器,在二维特征空间对各个图像进行类别区分 apple=0; for i=1:num
if((Ecllipseratio(i)<1.25)&&(Ecllipseratio(i)>1.0)) %分类器识别苹果的准则:判断各个图形中圆度居于1.0与1.25之间的的为苹果 apple=i; end end
%对分出来的类别分别构建相应的图像掩膜,并用对原图的亮度图像进行掩膜操作 appleHSV=HSV; for j = 1 : row for k = 1 : col
if(FilledLabel(j,k) ~=apple) appleHSV(j,k,3)=0; end end end
%变换生成最终的结果图像,图像中显示的结果即对应分类器中指定的类别
applematrix = hsv2rgb(appleHSV); %转换为RGB彩图,彩图中已经滤去了其余水果,只剩下苹果
figure,imshow(applematrix),title('水果类别:苹果');
接下来可以考虑计算苹果的直径。因为对于苹果来讲,不同的大小价格是不同的。 检测思路为:将图片灰度化、二值化后,利用regionprops函数计算二值化图像的最小外接矩形大小,外接矩形框长度和宽度中的最大值即为苹果最大横切面直径。此时的
数值为像素值,通过与照片的长、宽像素值进行比较,结合图片的实际长、宽值,即可求出果径的实际长度。 具体函数如下: rgb=imread('d:\\apple.png'); rgb1=im2double(rgb); r=rgb1(:,:,1); g=rgb1(:,:,2); b=rgb1(:,:,3); I=(r+g+b)/3;
tmp1=min(min(r,g),b); tmp2=r+g+b; tmp2(tmp2==0)=eps; S=1-3.*tmp1./tmp2; tmp1=0.5*((r-g)+(r-b)); tmp2=sqrt((r-g).^2+(r-b).*(g-b)); theta=acos(tmp1./(tmp2+eps)); H=theta;
H(b>g)=2*pi-H(b>g); H=H/(2*pi); H(S==0)=0; I = (r + g + b)/3;
% Combine all three results into an hsi image. hsi = cat(3, H, S, I); S=im2bw(S,0.2); imshow(S)
求取外接最小矩形框,并利用regionprops函数计算图像区域的属性信息,并读取矩形的长、宽数据,以长、宽中的最大值为果径的数值。这里的数值为像素值。 [l,m]=bwlabel(S,8);
status=regionprops(l,'BoundingBox');
x=status(2,1).BoundingBox; %读取矩形的长宽 X=max(x); %取最大值
取得果径的像素值后,与图片的长(宽)像素值相比。由于图片的像素、实际长宽等数值已预先设定并保持不变,因此根据果径像素与图片像素的比值可求出果径的实际数值。
接下来可以考虑检测水果表面的缺陷。果面的缺陷主要包括压伤、碰伤、虫蛀伤亦或是裂开等,但所有表面可见的伤痕都表现为正常果面色泽、质地不一致。因此可通过提取果面的图像特征,检测缺陷情况。
首先,读入图像后用rgb2gray函数对受检苹果进行灰度化,并用imadjust函数调整灰度图像的强度值。
I= imread(d:\\'apple3.jpg'); I2= rgb2gray(I);
J= imadjust(I2,[0.1 0.2],[]);
利用im2bw函数将调整后的灰度图像转换为二值图像,level值取1。为方便检测,对二值图像进行取反处理。
Y=im2bw(J,1);Y=~Y。
与计算果径的方法相同,求病斑区域的外接矩形框,并利用regionprops函数计算图像区域的属性信息。
[l,m]=bwlabel(Y,8);
status=regionprops(l,'BoundingBox'); imshow(Y); hold on; for i=1:m
rectangle('position',status(i).BoundingBox,'edgecolor','r'); end hold off;
由于病斑的不规则,且一个果面可能会有多个病斑,图像区域中会有多个外接矩形框,因此需要对每个矩形框的大小进行判定,选取面积最大的矩形框。
[x,y]=size(status); %读取图片信息 for i=1:x %共有x个矩形框 X(i)=max(status(i).BoundingBox); %取矩形框最大值 end
x2=status(i,1).BoundingBox; %读取矩形框的长、宽 x2(1) x2(2)
在这里,以最大矩形框的面积近似为病斑的面积。通过矩形框尺寸的像素值与照片长、宽像素值的比值,以及照片实际尺寸,进而确定病斑实际面积。
相关推荐: