边缘直线异常检测

 


摘要

塑封包装的纸盒在边界处有破损或者翘起等现象需检测为不良品


一、待检测图像

直线边缘有塑封膜的翘起, 如红色框图所示, 正常如绿色所示, 边界处是一根直线, 没有翘起

二、检测步骤

1.图像锐化

如何对边界进行锐化, 将异常塑封膜进行特征突出显示, 可构建不同方向的filter滤波核, 进而不同权值的叠加

//1. 单通道的grayImg
cv::Mat grayImg;
getGrayImg(srcImg, grayImg);

//2. 在竖直方向的filter2d
cv::Mat vertMat;
cv::filter2D(grayImg, vertMat, grayImg.depth(), vertKernel);
cv::convertScaleAbs(vertMat, vertMat);
//3. 在顺45方向的filter2d
cv::Mat vert45Mat;
cv::filter2D(grayImg, vert45Mat, grayImg.depth(), KernelBl);
cv::convertScaleAbs(vert45Mat, vert45Mat);

//4. 在逆45方向的filter2d
cv::Mat vertAn45Mat;
cv::filter2D(grayImg, vertAn45Mat, grayImg.depth(), KernelBr);
cv::convertScaleAbs(vertAn45Mat, vertAn45Mat);

//5. 各个方向锐化的相加
cv::Mat filterImg;
cv::addWeighted(vertMat, 0.5, vert45Mat, 0.5, 0, filterImg);
cv::addWeighted(filterImg, 0.5, vertAn45Mat, 0.5, 0, resFilterImg);

2.锐化原图

3.直线检测

锐化的图像类似直线, 可进行直线的拟合进行特征的检测。

3.1 霍夫直线

空间坐标系到极坐标的转化如下, 这个点在极坐标下对应的(ρ,θ)画出来一个周期是如下所示,以θ为x轴

A: 将参数空间(ρ,θ)量化,赋初值一个二维矩阵M,M(ρ,θ)就是一个累加器了;

B: 每一个点进行变换,变换到属于哪一组(ρ,θ),就把该组(ρ,θ)对应的累加器数加;

C: 分析得到的M(ρ,θ),设置一个阈值T,认为当M(ρ,θ)>T,就认为存在一条有意义的直线存在;

3.2 起始点的拟合直线

在横轴方向, 遍历第一个非零像素的y坐标, 进行直线的拟合直线的采用fitline函数, 具体实现如下

std::vector<cv::Point> indexPoints
for (size_t index = 0; index < size_t(pointsNum); index++) {
    startX = int(index *gapStep);
    noneZeroColLength = cv::countNonZero(srcImg.col(startX));

    if (noneZeroColLength == 0) {
        continue;
    }
    
    if (noneZeroColLength > lineFeatureParam.fristPixIndex) {
        cv::findNonZero(srcImg.col(startX), noneLinePoints);
        startColPoint = cv::Point(startX, noneLinePoints[lineFeatureParam.fristPixIndex].y);
        indexPoints.push_back(startColPoint);
    }
}

3.3 最小二乘法直线拟合

找到一条直线,使得所有已知的点到这条直线的欧式距离的和最下, y = k*x +b

 

3.4 直线特征分析

检测直线的斜率 偏移的像素点 左右位置的偏移 中间非零的像素数

/*锐化单根线的check*/
message LinePointCheck {
required float line_num = 1; //检测点的ration,如100的长度,check其中50个点
required float line_zero = 2; //检测零的ration,如100的长度,check其中50个点
required int32 line_gap = 3;
required float line_abnorm = 4; //在line_num的基础上,异常的概率
optional float line_k_ration = 5;
optional EspicalSlopeRation esp_k_ration_param = 6;
optional EspicalLineStraighDelta esp_straigh_param = 7; //相对的变化
}

总结

1. 如何进行锐化, 突出异常区域是关键

2. 采用第index个非零的点, 进行直线的拟合

3. 直线特征的检测


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值