首页> 中国专利> 禽蛋尺寸及蛋形指数的检测方法

禽蛋尺寸及蛋形指数的检测方法

摘要

本发明涉及一种禽蛋尺寸及蛋形指数的检测方法,包括以下步骤:采集禽蛋的图像,并对采集的图像进行滤波;在滤波后的图像RGB颜色空间中,以R分量为变量函数,利用二分法检测禽蛋在图像中的边缘点;利用得到的边缘点信息计算禽蛋的形心;以形心为基点,查找禽蛋的纵径及最大横径。本发明的技术方案具有以下优点:(1)图像不需要二值化;(2)边缘检测采用二分法,速度较快;(3)采用简化形心计算方法,效率较高;(4)具有较高的准确性。

著录项

  • 公开/公告号CN101455183A

    专利类型发明专利

  • 公开/公告日2009-06-17

    原文格式PDF

  • 申请/专利权人 北京农业信息技术研究中心;

    申请/专利号CN200810247486.3

  • 申请日2008-12-31

  • 分类号A01K43/00(20060101);G01B11/08(20060101);G01B11/24(20060101);

  • 代理机构11002 北京路浩知识产权代理有限公司;

  • 代理人张国良

  • 地址 100097 北京市海淀区曙光花园中路11号农科大厦A座318

  • 入库时间 2023-12-17 22:06:15

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-03-27

    未缴年费专利权终止 IPC(主分类):A01K43/00 授权公告日:20100818 终止日期:20181231 申请日:20081231

    专利权的终止

  • 2010-08-18

    授权

    授权

  • 2009-08-12

    实质审查的生效

    实质审查的生效

  • 2009-06-17

    公开

    公开

说明书

技术领域

本发明涉及农产品无损检测技术,尤其涉及一种禽蛋尺寸及蛋形指数的检测方法。

背景技术

禽蛋尺寸大小和蛋形指数检测在蛋品工业中有着重要应用。运输过程中要求禽蛋按大小进行分级包装以减少破损;销售中要求保持外观一致性以提高产品价格。此外,孵化中也要求蛋形指数必须在一定范围以保证孵化率。

中国发明专利“用于禽蛋尺寸与蛋形指数及重量同时检测的方法”(CN1934935)公开了一种同时检测禽蛋尺寸、蛋形指数和重量的检测法。此专利采用计算机视觉技术,采集禽蛋图像,对禽蛋图像进行二值分割、滤波和边缘检测,最后利用提出的特征算来检测尺寸、蛋形指数和重量等。该方法具有无损、快捷等特点,但离实际应用还存在不少差距,主要体现在:

(1)在生产中,CCD获取的图像通常为彩色RGB图像,专利“CN1934935”的方法检测禽蛋尺寸和蛋形指数,首先需要对彩色图像进行二值化,而图像转化时计算机系统资源的巨大开销会加大对系统硬件的配置要求;

(2)禽蛋图像形心的计算需要计算禽蛋在图像上的投影面积,专利“CN1934935”在计算面积时,需要统计图像上每个点的信息;利用一阶矩计算形心时,也需要统计图像上每个点的相关信息,算法较为复杂,效率不高;

(3)图像纵径是重要的特征参数,专利“CN1934935”计算时需要对边缘点做正交旋转变换,运算相当复杂,主要表现在:①需要将边缘点坐标从图像坐标系转换到迪卡尔坐标系;②需要对图像的所有边缘点进行多次的正交旋转、平移操作;③程序可靠性得不到保证。此外最大横径的特征算法也有待进一步商榷。

发明内容

本发明的目的是提供一种禽蛋尺寸与蛋形指数的检测方法,以解决现有技术中检测方法存在的对系统硬件配置要求较高、算法复杂效率较低及可靠性得不到保证等缺陷。

为了达到上述目的,本发明的技术方案提出一种禽蛋尺寸及蛋形指数的检测方法,该方法包括以下步骤:

采集禽蛋的图像,并对采集的图像进行滤波;

在滤波后的图像RGB颜色空间中,以R分量为变量函数,利用二分法检测禽蛋在图像中的边缘点;

利用得到的边缘点信息计算禽蛋的形心;

以形心为基点,查找禽蛋的纵径及最大横径。

上述禽蛋尺寸及蛋形指数的检测方法中,所述利用二分法检测检测禽蛋在图像中的边缘点具体包括:

利用二分法查找图像的最高点及最低点,分别记为pt0、pt1

以最高点pt0为参考点,查找正下方边缘点pt;

以pt0、pt、pt1为依据,将图像划分为两块区域;

分别在所述两块区域内,利用二分法查找图像在每一行像素的左右边缘点。

上述禽蛋尺寸及蛋形指数的检测方法中,所述利用得到的边缘点信息计算禽蛋的形心具体包括:

按照每一行像素的顺序对图像的左右边缘点进行存储;

根据公式(1)计算图像的面积,

>A=(x,y)objectdxdy=Σi=pt0.ypt1.y(ptiR.x-ptiL.x+1)---(1)>

其中,ptiL、ptiR分别为第i行的左、右边缘点,ptiR.x-ptiL.x+1表示第i行的像素和;

根据公式(4)计算图像的形心横坐标,

>xo=(x,y)objectxdxdyAΣi=pt0.ypt1.y(ptiR.x-ptiL.x+1)(ptiR.x+ptiL.x)/2A---(4)>

根据公式(5)计算图像的形心纵坐标,

>yo=(x,y)objectydxdyAΣi=pt0.ypt1.yi×(ptiR.x-ptiL.x+1)A---(5)>

上述禽蛋尺寸及蛋形指数的检测方法中,以形心为基点查找禽蛋的纵径及最大横径具体包括:

记形心为点O,以形心O为基点,定义离O距离最远的边缘点为纵径的一端点A;定义离A距离最远的边缘点为纵径的另一端点B;计算AB的长度LAB,该长度LAB即为禽蛋纵径的长度;

以AB为基准线,用两条平行于AB的直线逼近图像的边缘点,当两平行线均相切于边缘时,切点分别记为E、F;计算两平行线之间的垂直距离LEF,该长度LEF即为禽蛋的最大横径。

上述禽蛋尺寸及蛋形指数的检测方法中,得到禽蛋的纵径及最大横径之后还包括:

建立禽蛋实际横径Dvert与最大横径LEF之间的关系模型并用于检测禽蛋的实际横径Dvert,该值Dvert即为所需的禽蛋尺寸;

计算禽蛋纵径LAB与最大横径LEF的比值,该比值即为所需的蛋形指数。

上述禽蛋尺寸及蛋形指数的检测方法中,所述的实际横径Dvert与最大横径LEF之间的关系模型为:

Dvert=k·LEF+b

其中,k、b为根据实际检测的经验数据进行曲线拟合得到的常数。

本发明的技术方案具有以下优点:(1)图像不需要二值化;(2)边缘检测采用二分法,速度较快;(3)采用简化形心计算方法,效率较高;(4)具有较高的准确性。

附图说明

图1为本发明禽蛋尺寸及蛋形指数的检测方法实施例流程图;

图2为本发明检测方法实施例采集得到的禽蛋图像;

图3为本发明检测方法实施例的上边缘点查找流程图;

图4为本发明检测方法实施例的水平边缘点查找流程图;

图5为本发明检测方法实施例的最高点查找流程图;

图6为本发明检测方法实施例的下边缘点查找流程图;

图7为本发明检测方法实施例的禽蛋图像分区示意图;

图8为本发明检测方法实施例的左边缘点查找流程图;

图9为本发明检测方法实施例的右边缘点查找流程图;

图10为本发明检测方法实施例的图像边界点图;

图11为本发明检测方法实施例的图像形心检测示意图;

图12为本发明检测方法实施例的图像纵径检测原理图;

图13为本发明检测方法实施例得到的图像纵径、最大横径示意图。

具体实施方式

以下实施例用于说明本发明,但不用来限制本发明的范围。

图1为本发明禽蛋尺寸及蛋形指数的检测方法实施例流程图,如图所示,本实施例的检测方法包括以下步骤S11~S14。

S11、采集禽蛋的图像,并对采集的图像进行滤波处理。

选取一定数量的禽蛋试验样本,分别加以标记。同时用游标卡尺实际检测其纵径和最大横径,并将检测数据记录下来。

采集禽蛋图像(如图2所示),滤波后得到图像的RGB颜色空间。

S12、在滤波后的图像RGB颜色空间中,以R分量为变量函数,利用二分法检测禽蛋在图像中的边缘点。

以R分量(后续用函数f表示)为研究对象,利用二分法快速检测禽蛋在图像中的边缘点,具体过程如以下S121~S124所述。

S121、利用二分法查找图像的最高点及最低点,分别记为pt0、pt1

查找最高点与最低点,是缩小图像边缘查找区域,同时为步骤S123的图像分区提供基点。其中,查找最高点的过程如下。

首先,在图像上任取一点pt,利用二分法在竖直方向上查取上边缘点pt′。查找上边缘点的程序流程如图3所示,又具体包括:①定义二分法的两个变量并赋值,令a0=0,b0=pt.y(pt.y表示点pt的纵坐标,单位为像素),如图5所示,初始的a0、b0分别为整个图像边缘的一点及pt点,而查找蛋形上边缘点的二分法也即在经过点pt的竖直线上进行,因此所有点的横坐标x都相同,查找的仅是边缘点的纵坐标y;②计算变量平均值,r0=(a0+b0)/2,r0即为线段a0b0的中点;③判断点r0处图像的R分量与设定T值之差,即f(r0)-T是否大于0,(T为常量,取值范围是蛋形特征区域内R分量的最小值与背景区域R分量最大值之间,下同),如果大于则说明点r0在蛋形特征区域内,则将r0赋值给变量b0并转下一步;否则说明点r0在蛋形特征区域外,从而将r0赋值给变量a0并转下一步;④判断b0与a0差是否大于1,如果是则需转步骤②进行下一轮逼近运算,否则说明已足够逼近蛋形特征区域的上边缘点;⑤如图5所示,即找到点pt竖直线上的上边缘点pt′,其横坐标与点pt相同,纵坐标为a0,即pt′.x=pt.x;pt′y=a0。

然后,根据上边缘点pt′,利用二分法查找水平方向另一边缘点pt″。查找水平边缘点pt″的程序流程与查找上边缘点pt′的原理相同、流程类似,仅仅将纵坐标变量改为横坐标变量,而逼近算法即在经过点pt′的水平线上进行,如图4所示,具体包括:①定义二分法的两个变量并赋值,令a0=M(设整个图像的右边缘处具有最大的横坐标值M),b0=pt’.x(pt’.x即表示点pt′的纵坐标,单位为像素);②计算变量平均值,r0=(a0+b0)/2,r0即为线段a0b0的中点;③判断点r0处图像的R分量与设定T值之差,即f(r0)-T是否大于0,如果大于则说明点r0在蛋形特征区域内,则将r0赋值给变量b0并转下一步;否则说明点r0在蛋形特征区域外,从而将r0赋值给变量a0并转下一步;④判断b0与a0差是否大于1,如果是则需转步骤②进行下一轮逼近运算,否则说明已足够逼近蛋形特征区域的右边缘点;⑤如图5所示,即找到点pt′水平线上的右边缘点pt″,其纵坐标与点pt′相同,横坐标为a0,即pt".x=a0;pt"y=pt′.y。

最后,判断pt′与pt″之间的水平距离,若小于某一设定值,则认为两者之间的任一点即为图像最高点,程序查找结束;若距离大于设定值,则pt′与pt″连线的中点为新的点pt,重复上述查找上边缘点→查找右边缘点→计算水平距离的过程,直至找到图像的最高点pt0

最低点查找与最高点类似,区别在于最高点查找在第一步时需要用二分法查找上边缘点,而最低点的查找是需要查找下边缘点;而随后的两步则相同,也是查找下边缘点水平线上的右边缘点,接着判断两点的水平距离是否小于某一设定值,进而确定是否需要继续逼近直至找到图像的最低点pt1。此处,对于最低点的查找流程不再赘述,仅对图6所示的下边缘点查找流程描述如下:①定义二分法的两个变量并赋值,令a0=M(设整个图像的下边缘处具有最大的纵坐标值M),b0=pt.y;②计算变量平均值,r0=(a0+b0)/2,r0即为线段a0b0的中点;③判断点r0处图像的R分量与设定T值之差,即f(r0)-T是否大于0,如果大于则说明点r0在蛋形特征区域内,则将r0赋值给变量b0并转下一步;否则说明点r0在蛋形特征区域外,从而将r0赋值给变量a0并转下一步;④判断b0与a0差是否大于1,如果是则需转步骤②进行下一轮逼近运算,否则说明已足够逼近蛋形特征区域的下边缘点;⑤即找到点pt竖直线上的下边缘点,其横坐标与点pt相同,纵坐标为a0。

S122、以最高点pt0为参考点,查找正下方边缘点pt。

S123、以pt0、pt、pt1为依据,将图像划分为两块区域。

分区的方法为:经过pt0、pt的两条水平线与图像左、右边界所围区域为I,经过pt、pt1的两条水平线与图像左、右边界所围区域为II。分区的目的是为二分法的程序自动实现提供保障。图7为分区的示意图。

S124、分别在所述两块区域内,利用二分法查找图像在每一行像素的左右边缘点。

经过步骤S123的分区后,运算区域限制在区域I、II。以I区为例,图像每行的边缘点分布在线段两侧,运用二分法分别快速查找出左右边缘点。

代码结构为:

for(int i=pt0.y;i<pt1.y;i++)

{

   int a0=0;

   int b0=pt0.x;

   查找第i行左边缘点;

   a0=M;

   b0=pt0.x;

   查找第i行右边缘点;

   保存第i行边缘点;

}

其中,左边缘点查找流程如图8所示,右边缘点查找流程如图9所示,其原理已在上述图3、4、6的说明中详细阐述,除二分法变量初始赋值外的各步骤也基本相同,因此本技术领域的技术人员已能毫不费力地加以实施,此处不再加以赘述。

同理,依次对区域II进行二分法边缘检测。图10为最终检测出的蛋形特征区域边界。

S13、利用得到的边缘点信息计算禽蛋的形心。

本步骤S13具体包括下述子步骤S131~S133。

S131、对边缘点信息进行顺序规律的保存,为此定义了如下的数据结构。

Typedef struct L_point_R

{

  CPoint left_point;//左边缘点

  CPoint Right_Point;//右边缘点

}

实际使用时,定义此结构对象,然后分别保存检测到的图像的某一行的左边缘点和右边缘点。因为每个禽蛋图像的大小是变化的,即图像边缘的行数不确定,因此在使用时,为了尽可能地减少内存的使用,我们使用了动态分配变量的方式,即在需要保存某大小的数据,就即时定义该大小的变量。此外,还需利用C++提供的CARRY模板类,使得检测的每一行的边缘点信息都保存在CARRY对象中。需要对边缘信息进行操作时,只需要对CARRY对象进行操作就可以了。

边缘保存的程序结构如下:

CArry m_strArray;

for(int i=pt0.y;i<pt1.y;i++){

   //检测到第i行的左右边缘点m_left,m_right;

   L_Point_R*point=new L_Point_R;//动态分配内存

   point->left_point=m_left;  //保存左边缘点

   point->right_point=m_right;//保存右边缘点

   m_strArray.Add(point)

}

有时,需要把边缘点按顺时针或逆时针存储,则仅需对m_strArray数组进行操作即可。下面以逆时针为例:

    int m=m_strArray.GetSize();//获取图像边缘所占的行数

    CPoint*m_strPoint=new CPoint[2*m];

    for(int i=0;i<m;i++)

    {

      m_strPoint[i]=((L_Point_R*)(m_strArray.GetAt(i)))->left_point;

      m_strPoint[2*m-1-i]=             ((                L_Point_R

*)(m_strArray.GetAt(i)))->right_point;

    }

这样就可以把边缘点按逆时针顺序保存到CPoint数组中去,上述动态分配的内存在使用后要注意及时地释放,以免内存外泄,影响系统的运行。

S132、图像区域面积公式的简化。

由图10所示,图像区域面积即为边缘所围的闭区域所覆盖的范围,计算机图像是离散的,因此,区域面积在计算机中表现为边缘所围区域内像素的统计和,即像素面积和。结合数字图像的知识,可以理解禽蛋图像由很多行图像按规律排列组成,且每一行由左右两个边缘点组成。因此,禽蛋图像区域面积的检测可转化为每一行上禽蛋图像的面积。即禽蛋图像在某行上的面积有多大。显然在某一行上,禽蛋图像的大小取决于左右边缘点的位置信息,位置差即为两者之间的相点像素点数。因此在整个图像上,区域面积A可用式(1)求出:

>A=(x,y)objectdxdy=Σi=pt0.ypt1.y(ptiR.x-ptiL.x+1)---(1)>

式中ptiL、ptiR分别为特征区域第i行的左边缘点和右边缘点(下同),ptiR.x-ptiL.x+1表示第i行的像素和,pt0、pt1分别为特征区域的最高点与最低点。

程序思路为:

int A=0;

for(i=0;i<m_strArray.GetSize();i++)

{

   A+=((L_Point_R*)(m_strArray.GetAt(i)))->right_point.x-

         ((L_Point_R*)(m_strArray.GetAt(i)))->left_point.x+1;

}

S133、禽蛋图像形心的确定。

对于已完成边缘提取与细化的禽蛋图像,可以计算其形心点O的坐标xO和yO

>xo=(x,y)objectxdxdy(x,y)objectdxdy---(2)>

>yo=(x,y)objectydxdy(x,y)objectdxdy---(3)>

利用(2)、(3)式求形心,也须知道整个蛋特征区域内的信息,亦即增加了计算数据量。为此简化为仅需特征区域的边界信息求其形心的方法:

>Σx=(x,y)objectxdxdyΣi=pt0.ypt1.y(ptiR.x-ptiL.x+1)(ptiR.x+ptiL.x)/2---(4)>

>Σy=(x,y)objectydxdyΣi=pt0.ypt1.yi×(ptiR.x-ptiL.x+1)---(5)>

因此,由式(1)、(2)、(3)、(4)、(5)形心坐标可简化为:

>xo=ΣxA>     >yo=ΣyA---(6)>

综上所述,可以根据蛋特征区域边界信息求出蛋的形心坐标,从而加快了计算速度。另外,由于避免了禽蛋图像表面污斑等信息的影响,还可以提高形心坐标的精度。图11为形心检测的效果图。

S14、利用边缘点及形心计算纵径与最大横径。

本步骤S14具体包括下述子步骤S141~S143。

S141、最大纵径检测

假设O(x0,y0)为检测到的禽蛋图像的形心。m_strPoint[2*m]依次存储的是起点为pt0,按逆时针顺序存储的计算机边缘点,m为图像边缘点所占的行数。形心到边缘点的距离公式为:

>Si=(x0-m_strPoint[i].x)2+(y0-m_strPoint[i].y)2---(7)>

定义离形心距离最远的一个边缘点为纵径的一个端点A(x1,y1),即

S(x1,y1)=max(Si)   i=0,1,...,2m-1   (8)

纵径A点检测程序,结果保存在点point中,检测结果如图12所示。

CPoint point(0,0);

double max=(x0-m_strPoint[0].x)2+(y0-m_strPoint[0].y)2

for(int i=0;i<2*m;i++)

{

  double s=(x0-m_strPoint[i].x)2+(y0-m_strPoint[i].y)2

  if s>max;

       {

         point=m_strPoint[i];

         max=s;

       }

}

在所有边缘点中,到端点A距离最大的点定义为纵径的另一端点B(x2,y2)。查找另一端点B的程序为:

CPoint point(x,y);

double max=0;

for(int i=0;i<2*m;i++)

{

  double s=(x1-m_strPoint[i].x)2+(y1-m_strPoint[i].y)2

  if s>max;

       {

         point=m_strPoint[i];

         max=s;

       }

}

这样point点中保存的点即为长轴的一个端点B(x2,y2),AB连线即为定义的禽蛋图像纵径,其长度LAB可由式(9)计算,单位是像素。

>LAB=(x1-x2)2+(y1-y2)2---(9)>

图13中AB即为新算法检测出的纵径示意图。

S142、最大横径检测

如图13虚线部分所示,两虚线均平行于纵径且外切于边缘,切点分别是E、F,则E、F两点之间的垂直距离定义禽蛋图像的最大横径。其数值LEF可由式(10)计算。由图13可知E点是弧ACB上到轴AB距离最大的点。F点是弧BDA上到AB距离最大的点。

下面简单介绍一下E、F点的查找方法。

LEF=dis1+dis2   (10)

为了分别计算dis1和dis2,则要把边缘划分为弧ACB和弧BFA两段。假设AB在图像坐标系中的方程为

>y-kx-b=0,k=y1-y2x1-x2,b=y1-kx1---(11)>

由几何知识不难发现弧ACB与弧BDA上的点代入式(12)计算时,会发现f(x,y)异号。不妨假设弧ACB上的点大于零,则BDA上的点代入时结果都小于零。

f(x,y)=y-kx-b   (12)

>f(x,y)>0(x,y)ACBf(x,y)<0(x,y)BDA---(13)>

用式(13)区分了两弧段后,这样再根据点到直线的距离公式(14)来查找两弧段到纵径的最大距离。

>dis=|y-kx-b|k2+1---(14)>

实现程序为:

CPoint pointE(0,0),pointF(0,0);

double dis1=0,dis2=0,dis=0;

for(int i=0;i<2*m;i++)

{

   double s=m_strPoint[i].y-k*m_strPoint[i].x;

   dis=abs(m_strPoint[i].y-k*m_strPoint[i].x)/sqrt(k*k+1);

   if(s>0)

   {

       If(dis>dis1)

       {

           dis1=dis;

           pointE=m_strPoint[i];

       }

   }

   else

   {

      if(dis>dis2)

      {

          dis2=dis;

          pointF=s_strPoint[i];

      }

  }

}

S143、尺寸及蛋形指数检测

根据经验数据建立禽蛋实际最大横径值Dvert与LEF之间的关系模型并用于检测禽蛋的实际最大横径。

Dvert=k·LEF+b   (15)

k和b分别为待定常数。

下面是试验过程中所建立的模型:

Dvert=0.2425·LEF+5.745   (16)

在以后的检测中,通过式(16)计算出禽蛋实际最大横径值Dvert,该值即定义为禽蛋的尺寸。禽蛋的蛋形指数则定义为禽蛋纵径与最大横径之比值,LAB与LEF之比值就是禽蛋的蛋形指数。

以上为本发明的最佳实施方式,依据本发明公开的内容,本领域的普通技术人员能够显而易见地想到一些雷同、替代方案,均应落入本发明保护的范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号