-
一、引言
果梗是判断水果新鲜程度的重要标志,对水果的贮藏和保鲜也具有重要的参考价值。库尔勒香梨分级标准中对果梗有明确要求,要求果梗完整,但由于库尔勒香梨果梗颜色与果实接近,用传统的简单阈值分割方法难以提取。因此,下面基于数学形态学开发一个能实现其果梗提取和测量的程序。
-
二、程序代码
clear all;
close all;
clc;
I=imread('.\FragrantPear.tif');
I_R=I(:,:,1);
I_G=I(:,:,2);
I_B=I(:,:,3);
I_GB=I_G-I_B;
figure,imshow(I_GB),title('G-B图像');
figure,imhist(I_GB),title('G-B灰度直方图');
%I_GB_bw=im2bw(I_GB,graythresh(I_GB)); %分割阈值的选择
I_GB_bw=im2bw(I_GB,2/255); %分割阈值的选择
figure,imshow(I_GB_bw);
SE=strel('disk',1);%确定结构元素形式和尺寸
obj=imopen(I_GB_bw,SE);%数学形态学开运算,消除小目标并平滑边界
obj=imfill(obj,'holes');
figure,imshow(obj),title('库尔勒香梨二值图像');
obj2=uint8(obj).*I;
figure,imshow(obj2),title('库尔勒香梨彩色图像');
[L,num]=bwlabel(obj);
stats=regionprops(L,'Area','Perimeter');
A=[stats.Area]; %获取库尔勒香梨的面积
P=[stats.Perimeter]; %获取库尔勒香梨的周长
FP=bwmorph(obj,'remove');
figure,imshow(FP);%获取库尔勒香梨的边缘图像
imtool(obj)
SE2=strel('disk',10); %选取合适的结构元素
M=imopen(obj,SE2);
figure,imshow(M);
Stem=logical(obj-M);%图像减法获取果梗图像像
figure,imshow(Stem);
Stem2=bwareaopen(Stem,100);%去除噪声
figure,imshow(Stem2);
%测量果梗的长和宽
% 计算区域属性
props = regionprops(Stem2, 'Area','BoundingBox','MajorAxisLength','MinorAxisLength');% doc regionprops
% 提取最小外矩形的长轴和短轴
MajorLength=props.MajorAxisLength;%估计果梗长度
MinorLength=props.MinorAxisLength;%估计果梗直径
% 提取最小面积的矩形
minAreaRect = props(1).BoundingBox;
% 绘制最小外矩形
rectangle('Position', minAreaRect, 'EdgeColor', 'r'),title('绘制最小外接矩形');%绘制最小外接矩形
%%https://www.mathworks.com/help/images/ref/regionprops_zh_CN.html
figure,
subplot(2,2,1),imshow(I),title('原始图像');
subplot(2,2,2),imshow(obj),title('二值图像');
subplot(2,2,3),imshow(FP),title('库尔勒香梨边缘图像');
subplot(2,2,4),imshow(Stem2),title('库尔勒香梨果梗二值图像');
三、程序部分运行结果
四、总结
本次果梗提取和测量,充分利用MATLAB中内置函数imopen、imtool和imhist各自特点对彩色图像进行分析,确定了最优分割方案,获得了较好分割效果,对其它水果果梗检测也具有一定参考价值。
五、原始图像
如果觉得本案例对大家今后的编程有帮助,请点赞和收藏。如有改进意见可以与我联系,谢谢!