[0059] 步骤8包括如下步骤:
[0060] 步骤8-1对羽毛叶部分的灰度图像img_classify_test进行uniform LBP均匀局部二值模式处理得到其LBP图像,;
[0061] 步骤8-2,将步骤8-1得到的LBP图像划分为m×m的小区域cell,m值取16,统计每个小区域cell的灰度直方图,并做归一化处理;
[0062] 步骤8-3,将得到的每个小区域cell的灰度直方图连接成为一个特征向量,该特征向量即羽毛片的纹理特征;
[0063] 步骤8-4,将HSV颜色空间的H分量划分为8个等级,S、V分量划分为4个等级,H分量的变化范围为0-180,S、V分量的变化范围为0-255;HSV颜色空间中H、S、V分别表示色调Hue、饱和度Saturation、明度Value;
[0064] 步骤8-5,调用opencv中的CvtColor函数,将羽毛叶部分的彩色图像img_classify color转换到HSV颜色空间,调用opencv中的CvtPixToPlane函数分割HSV颜色空间的多通道,调用opencv中的cvCalcHist函数统计转换到HSV颜色空间的图像的直方图;
[0065] 步骤8-6,根据H、S、V三个平面的等级对应的128种可能组合,对每一种组合统计直方图中的数据,得到羽毛叶部分的彩色图像的颜色特征;
[0066] 步骤8-7,由8-1~8-6得到的羽毛片的纹理特征和颜色特征,调用CvSVM::predict在步骤3得到的级别分类模型中分类,将轮廓无缺陷的羽毛片图像标记为0或1,标记为0的羽毛片图像分类结束,输出分类结果为三级羽毛,标记为1的羽毛片图像继续执行步骤9。
[0067] 步骤9包括如下步骤:
[0068] 步骤9-1,利用opencv中的Rect函数框出阈值分割结果图像img_classify_threshold的外接矩形,通过步骤6-2得到的分割点分割该外接矩形,获得羽毛叶部分的二值图像,对该二值图像调用opencv的Canny函数提取羽毛叶边缘,得到图像img_binary_test;
[0069] 步骤9-2,在图像img_binary_test的坐标系中,查找当x2=0时,img_binary_test[x2][y2]=255的两个点(x2表示坐标点的x轴取值,y2表示坐标点的y轴取值,用图像坐标取图像对应点的像素值),取中间点p_start2,查找当x2=img_binary_test.width-1时(img_binary_test.width是图像img_binary_test的宽度),img_binary_test[x2][y2]=255的第一个点为p_end2,p_start和p_end2两点确定了羽毛杆中心线L2;
[0070] 步骤9-3,对图像img_binary_test,调用opencv的HoughLinep算法检测直线,参数设置为:最小投票数为90,直线长度最短为50,直线间隙不小于10;
[0071] 步骤9-4,对步骤9-3得到的所有直线,分别计算与中心线L2的斜率差,取其中最小的斜率差值作为该羽毛片的形状1分类特征值;
[0072] 步骤9-5,根据步骤4的形状1分类模型,调用opencv中的CvSVM::predict函数分别将标记为1的羽毛片图像分为全圆和方形两类,对方形结果的羽毛片图像继续执行步骤10,全圆结果的羽毛片图像分类结束并输出分类结果为一级全圆羽毛。
[0073] 步骤10包括如下步骤:
[0074] 步骤10-1,对羽毛叶部分的二值图像img_classify_binary调用opencv中的findContours函数,得到羽毛叶部分的二值图像img_classify_binary羽毛叶部分的边缘contour;
[0075] 步骤10-2,在羽毛叶部分的二值图像img_classify_binary的坐标系中,计算步骤10-1得到的边缘中纵坐标y值最小的点的坐标;(遍历10-1得到的contour中的所有的点,比较每个点的y坐标的大小,得到y值最小的点min_point)
[0076] 步骤10-3,分别计算步骤10-2得到的点到中心线L2的距离,将d和标准进行比对,将图像标记为大方、中方、小方。利用点到直线距离的计算公式,计算min_point到中心线L2的距离d,,将d和标准进行比对,标记为大方、中方、小方,输出分类结果,分类结束。
[0077] 本发明通过一些数字图像处理的方法来对图像进行预处理,检测角点和羽毛轮廓信息,使用LBP和颜色直方图提取纹理特征和颜色特征,并用Hough直线检测算法提取形状特征,并用svm算法建立分类模型,另外,利用图像中的轮廓信息利用对羽毛进行进一步的形状判断,给出最终的分类结果。该方法主要针对经过加工处理的羽毛片,通过对羽毛片图像的预处理,提取出分类的目标区域羽毛叶部分,对羽毛叶基于轮廓区分出轮廓有缺陷和无缺陷两类,在此分类结果上,通过纹理特征和颜色特征的提取,基于SVM分类器实现一二级和三级羽毛的分类,最后基于轮廓的直线检测和羽毛叶左右的宽度与工业标准的比对,实现羽毛片形状的分类。本发明能够对给定的羽毛叶自动分类,解决了传统工业中人工分类效率低下的问题,具有工业实用价值。
[0078] 有益效果:
[0079] 1)对缺陷的检测不再是对缺陷的定位,而是基于羽毛叶全局的特征提取,提高了缺陷检测的准确率;
[0080] 2)将级别分类分为羽毛叶轮廓缺陷检测和羽毛叶内部缺陷检测,降低了缺陷检测的难度;
[0081] 3)填补了工业羽毛片分类中形状分类的空白;
[0082] 4)该方法具有较高的通用性和实用性,可以将其实施在实际的应用上。
附图说明
[0083] 下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
[0084] 图1为本发明流程图。
[0085] 图2为羽毛片阈值分割结果示意图
[0086] 图3为滑动窗口分割羽毛杆和羽毛叶的示意图
[0087] 图4为羽毛杆中心线示意图
具体实施方式
[0088] 本发明的方法可分为十大步骤,如图1所示,包括如下步骤:
[0089] 步骤1,输入训练集羽毛片图像,对图像进行预处理,得到新图像,如图2所示;
[0090] 步骤2,采用基于滑动窗口的方法对新图像分割羽毛杆和羽毛叶,得到羽毛叶部分的灰度图像;
[0091] 步骤3,对羽毛叶部分的灰度图像提取纹理特征和颜色特征,利用分类器建立级别分类模型;
[0092] 步骤4,在新图像中,提取形状特征,利用分类器建立形状1分类模型,训练过程结束;
[0093] 步骤5,输入需要分类的羽毛片图像,对其进行预处理,得到羽毛片的外接矩形范围内的新图像img_feather及阈值分割结果图像img_classify_threshold;
[0094] 步骤6,根据步骤5得到的结果,基于滑动窗口的方法,分割羽毛杆和羽毛叶,得到分割点split_point,以及羽毛叶部分的灰度图像img_classify_test;
[0095] 步骤7,将需要分类的羽毛片图像分为轮廓有缺陷和无缺陷两部分,轮廓有缺陷的羽毛片图像分类结束,对轮廓无缺陷的羽毛片图像继续执行步骤8;
[0096] 步骤8,对轮廓无缺陷的羽毛片图像提取羽毛片的纹理特征和颜色特征,利用步骤3中的级别分类模型进行级别分类,将轮廓无缺陷的羽毛片图像标记为0或1,标记为0的羽毛片图像分类结束,输出分类结果为三级羽毛,标记为1的羽毛片图像继续执行步骤9;
[0097] 步骤9,检测标记为1的羽毛片图像的直线,提取羽毛杆中心线L2,将直线检测的结果用于形状分类,根据步骤4的形状1分类模型,调用opencv中的CvSVM::predict函数分别将标记为1的羽毛片图像分为全圆和方形两类,对方形结果的羽毛片图像继续执行步骤10,全圆结果的羽毛片图像分类结束并输出分类结果为一级全圆羽毛;
[0098] 步骤10,对方形的羽毛片图像,度量羽毛叶裁剪边与中心线的距离,分别标记为大方、中方和小方。
[0099] 步骤1包括如下步骤:
[0100] 步骤1-1,对输入的训练集羽毛片图像采用高斯滤波进行平滑处理,消除图像背景的噪声;
[0101] 步骤1-2,对步骤1-1平滑后的图像先腐蚀再膨胀,(腐蚀和膨胀操作的内核大小选取3*3的矩阵)消除图像羽毛内部的斑点或空缺;
[0102] 步骤1-3,采用otsu算法对经过步骤1-2处理后的图像计算前景和背景分割的阈值pos,采用阈值pos对经过步骤1-2处理后的图像进行阈值分割,得到阈值分割结果图像,记为img_threshold;
[0103] 步骤1-4,计算阈值分割结果图像img_threshold的羽毛片部分的外接矩形,并将该外接矩形范围内的原羽毛片图像保存为新图像。
[0104] 步骤2包括如下步骤:
[0105] 步骤2-1,在阈值分割结果图像img_threshold的坐标系中,设置一个滑动窗口,其宽度为20,统计窗口内像素值为255的像素点个数,从左侧向右侧滑动,工作流程如图3所示;
[0106] 步骤2-2,将滑动前后窗口内像素值为255的像素点个数分别记为new_count1和old_count1,记new_count1和old_count1的差值为diff_count1,滑动窗口每次移动5个像素的位置,选取羽毛叶和羽毛杆的分割阈值,当相邻两次滑动的像素点个数差值大于分割阈值时,一般分割阈值设置为50,即当diff_count1>50时,当前滑动窗口的位置表示羽毛叶和羽毛杆的分割点;
[0107] 步骤2-3,利用阈值分割结果图像img_threshold作为掩码图像,和原训练集羽毛片图像做与操作得到图像a,提取图像a前景羽毛部分图像,将该部分图像中除羽毛片部分以外的背景像素值设为0,利用opencv视觉库(Open Source Computer Vision Library,开源发行的跨平台计算机视觉库)中的Rect函数框出羽毛片的外接矩形,通过步骤2-2得到的分割点分割该外接矩形,获得羽毛叶部分的彩色图像img_color,对彩色图像img_color灰度化处理得到羽毛叶部分的灰度图像img_test。
[0108] 步骤3包括如下步骤:
[0109] 步骤3-1,对羽毛叶部分的灰度图像img_test进行uniform LBP处理(即均匀局部二值模式处理,LBP英文全称:Local Binary Patterns)得到LBP图像img_lbp;
[0110] 步骤3-2,将LBP图像img_lbp划分为m×m的小区域cell,m值取16,统计每个小区域cell的灰度直方图,并做归一化处理;
[0111] 步骤3-3,将得到的每个小区域cell的灰度直方图连接成为一个特征向量,即整幅图的LBP纹理特征向量;纹理特征向量的大小为15232(对每个图像而言,一共有16*16个cell,每个cell的LBP特征维度为59)。
[0112] 步骤3-4,将HSV颜色空间的H分量划分为8个等级,S、V分量划分为4个等级,H分量的变化范围为0-180,S、V分量的变化范围为0-255;HSV颜色空间中H、S、V分别表示色调Hue、饱和度Saturation、明度Value;
[0113] 步骤3-5,调用opencv中的CvtColor函数,将羽毛叶部分的彩色图像img_color转换到HSV颜色空间,调用opencv中的CvtPixToPlane函数分割HSV颜色空间的多通道,调用opencv中的cvCalcHist函数统计彩色图像img_color转换到HSV颜色空间的图像的直方图;
[0114] 步骤3-6,根据H、S、V三个平面的等级对应的128种可能组合,对每一种组合统计直方图中的数据,得到羽毛叶部分的彩色图像的颜色特征,颜色特征大小为128,至此,用于训练的样本的级别分类特征提取结束;
[0115] 步骤3-7,标记用于建立形状分类模型的羽毛片图像(已知羽毛片形状为全圆或方形),全圆羽毛片为一二级,方形羽毛片为三级,将全圆羽毛片图像标记为1,将方形羽毛片图像标记为0;
[0116] 步骤3-8,调用opencv中的svm分类器,训练步骤3-6得到的样本,得到级别分类模型并存为SVM_LEVEL_DATA.xml。
[0117] 步骤4包括如下步骤:
[0118] 步骤4-1,利用opencv中的Rect函数框出阈值分割结果图像img_threshold的外接矩形,通过步骤2-2得到的分割点分割该外接矩形,获得羽毛叶部分的二值图像,对该二值图像调用opencv的Canny函数提取羽毛叶边缘,得到图像img_contour_test;
[0119] 步骤4-2,在图像img_contour_test的坐标系中,查找当x1=0时,img_contour_test[x1][y1]=255的两个点p1和p2,其中,x1表示坐标点的x轴取值,y1表示坐标点的y轴取值,用图像坐标取图像对应点的像素值,取中间点p_start1,查找当x1=img_contour_test.width-1时,img_contour_test[x1][y1]=255的第一个点为p_end1,p_start1和p_end1两点确定了羽毛杆中心线L1,如图4所示,p_end1即图中的p_end,img_contour_test.width表示图像img_contour_test的宽度;
[0120] 步骤4-3,对图像img_contour_test,调用opencv的HoughLinep算法检测直线,参数设置为:最小投票数为90,直线长度最短为50,直线间隙不小于10;
[0121] 步骤4-4,对步骤4-3得到的所有直线,分别计算与中心线L1的斜率差,取其中最小的斜率差值作为该羽毛片的形状1分类特征值,得到1分类样本;
[0122] 步骤4-5,标记用于建立形状分类模型的羽毛片图像,全圆羽毛片图像标记为1,方形羽毛片图像标记为0;
[0123] 步骤4-6,调用opencv中的svm分类器,训练步骤4-4得到的样本,得到形状1分类模型并存为SVM_SHAPE_DATA.xml。
[0124] 步骤5包括如下步骤:
[0125] 步骤5-1,对输入的需要分类的羽毛片图像采用高斯滤波进行平滑处理,消除图像背景的噪声;
[0126] 步骤5-2,对步骤5-1平滑后的图像先腐蚀再膨胀(腐蚀和膨胀操作的内核大小选取3*3的矩阵),消除图像羽毛片内部的斑点或空缺;
[0127] 步骤5-3,采用otsu算法对经过步骤5-2处理后的图像计算前景和背景分割的阈值pos,采用阈值pos对经过步骤5-2处理后的图像进行阈值分割,得到阈值分割结果图像img_classify_threshold;
[0128] 步骤5-4,计算阈值分割结果图像的羽毛部分的外接矩形,并将该外接矩形范围内的原羽毛图像保存为新图像img_feather。
[0129] 步骤6包括如下步骤:
[0130] 步骤6-1,在阈值分割结果图像img_classify_threshold的坐标系中,设置一个滑动窗口,其宽度为20,统计窗口内像素值为255的像素点个数;
[0131] 步骤6-2,将滑动前后窗口内像素值为255的像素点个数分别记为new_count2和old_count2,记new_count2和old_count2的差值为diff_count2,滑动窗口每次移动5个像素的位置,选取羽毛叶和羽毛杆的分割阈值,当相邻两次滑动的像素点个数差值大于分割阈值时,一般分割阈值设置为50,即当diff_count2>50时,判定当前滑动窗口的位置表示羽毛叶和羽毛杆的分割点;
[0132] 步骤6-3,利用阈值分割结果图像img_classify_threshold作为掩码图像,和待分类羽毛片的原始图像做与操作得到图像b,提取图像b前景羽毛片部分图像,将该部分图像中除羽毛片部分以外的背景像素值设为0,利用opencv视觉库中的Rect函数框出羽毛片的外接矩形,通过步骤6-2得到的分割点split_point分割该外接矩形,获得羽毛叶部分的彩色图像img_classify_color,对彩色图像img_classify_color灰度化处理得到羽毛叶部分的灰度图像img_classify_test。
[0133] 步骤7包括如下步骤:
[0134] 步骤7-1,利用opencv中的Rect函数框出阈值分割结果图像img_classify_threshold的外接矩形,通过分割点split_point分割该外接矩形,获得羽毛叶部分的二值图像img_classify_binary;
[0135] 步骤7-2,平滑二值图像img_classify_binary(对img_classify_binary进行三次高斯平滑滤波处理,高斯滤波的内核大小为3*3);
[0136] 步骤7-3,对平滑处理后的二值图像img_classify_binary,采用Harris角点检测算法检测图像中的角点(调用opencv的cornerHarris函数检测角点,函数参数设置为:blockSize=15,ksize=5,k=0.01,intborderType=BORDER_DEFAULT,),得到最大的角点值maxStrength及该点在二值图像img_classify_binary中的坐标max_loc;
[0137] 步骤7-4,如果最大的角点值maxStrength和坐标max_loc满足阈值条件(maxStrengh>0.1且max_loc.x
[0138] 步骤8包括如下步骤:
[0139] 步骤8-1对羽毛叶部分的灰度图像img_classify_test进行uniform LBP均匀局部二值模式处理得到其LBP图像,;
[0140] 步骤8-2,将步骤8-1得到的LBP图像划分为m×m的小区域cell,m值取16,统计每个小区域cell的灰度直方图,并做归一化处理;
[0141] 步骤8-3,将得到的每个小区域cell的灰度直方图连接成为一个特征向量,该特征向量即羽毛片的纹理特征;
[0142] 步骤8-4,将HSV颜色空间的H分量划分为8个等级,S、V分量划分为4个等级,H分量的变化范围为0-180,S、V分量的变化范围为0-255;HSV颜色空间中H、S、V分别表示色调Hue、饱和度Saturation、明度Value;
[0143] 步骤8-5,调用opencv中的CvtColor函数,将羽毛叶部分的彩色图像img_classify color转换到HSV颜色空间,调用opencv中的CvtPixToPlane函数分割HSV颜色空间的多通道,调用opencv中的cvCalcHist函数统计转换到HSV颜色空间的图像的直方图;
[0144] 步骤8-6,根据H、S、V三个平面的等级对应的128种可能组合,对每一种组合统计直方图中的数据,得到羽毛叶部分的彩色图像的颜色特征;
[0145] 步骤8-7,由8-1~8-6得到的羽毛片的纹理特征和颜色特征,调用CvSVM::predict在步骤3得到的级别分类模型中分类,将轮廓无缺陷的羽毛片图像标记为0或1,标记为0的羽毛片图像分类结束,输出分类结果为三级羽毛,标记为1的羽毛片图像继续执行步骤9。
[0146] 步骤9包括如下步骤:
[0147] 步骤9-1,利用opencv中的Rect函数框出阈值分割结果图像img_classify_threshold的外接矩形,通过步骤6-2得到的分割点分割该外接矩形,获得羽毛叶部分的二值图像,对该二值图像调用opencv的Canny函数提取羽毛叶边缘,得到图像img_binary_test;
[0148] 步骤9-2,在图像img_binary_test的坐标系中,查找当x2=0时,img_binary_test[x2][y2]=255的两个点p1’和p2’(x2表示坐标点的x轴取值,y2表示坐标点的y轴取值,用图像坐标取图像对应点的像素值),取中间点p_start2,查找当x2=img_binary_test.width-1时(width是图像img_binary_test的宽度),img_binary_test[x2][y2]=255的第一个点为p_end2,如图四所示,p_end2对应图中的p_end,p1’和p2’对应图中的p1和p2,p_start和p_end2两点确定了羽毛杆中心线L2;
[0149] 步骤9-3,对图像img_binary_test,调用opencv的HoughLinep算法检测直线,参数设置为:最小投票数为90,直线长度最短为50,直线间隙不小于10;
[0150] 步骤9-4,对步骤9-3得到的所有直线,分别计算与中心线L2的斜率差,取其中最小的斜率差值作为该羽毛片的形状1分类特征值;
[0151] 步骤9-5,根据步骤4的形状1分类模型,调用opencv中的CvSVM::predict函数分别将标记为1的羽毛片图像分为全圆和方形两类,对方形结果的羽毛片图像继续执行步骤10,全圆结果的羽毛片图像分类结束并输出分类结果为一级全圆羽毛。
[0152] 步骤10包括如下步骤:
[0153] 步骤10-1,对羽毛叶部分的二值图像img_classify_binary调用opencv中的findContours函数,得到羽毛叶部分的二值图像img_classify_binary羽毛叶部分的边缘contour;
[0154] 步骤10-2,在羽毛叶部分的二值图像img_classify_binary的坐标系中,计算步骤10-1得到的边缘中纵坐标y值最小的点的坐标;(遍历10-1得到的contour中的所有的点,比较每个点的y坐标的大小,得到y值最小的点min_point)
[0155] 步骤10-3,分别计算步骤10-2得到的点到中心线L2的距离,将d和标准进行比对,将图像标记为大方、中方、小方。利用点到直线距离的计算公式,计算min_point到中心线L2的距离d,将d和标准(标准的一种具体形式如表1所示)进行比对,标记为大方、中方、小方,输出分类结果,分类结束。
[0156] 表1
[0157]形状 d的取值范围
大方 ≥5.5mm
中方 4.0-5.4mm
小方 3.0-3.9mm
[0158] 本发明提供了一种计算机中基于轮廓和纹理的对羽毛片进行分类的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方案,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。