无纺布折痕检测(3)· 基于灰度投影的折痕检测

无纺布折痕检测(3)· 基于灰度投影的折痕检测

- 算法思路 -

(1)构造滤波器与原图卷积增强图像 (2)灰度投影,构建垂直灰度投影函数,并与平滑后的函数进行 差分运算,超过一定阈值即为缺陷所在位置的列坐标 (3)计算缺陷区域并显示

使用第一篇构造的滤波器与图像卷积运算,突出图像竖直方向的折痕,如下图。

使用gray_projections算子,得到图像的水平灰度投影HorProjection以及垂直灰度投影VertProjection

HorProjection:从上到下,依次计算图像水平方向上,所有点灰度值的平均值。

VertProjection:从左到右,依次计算图像垂直方向上,所有点灰度值的平均值。

右键控制变量VertProjection,点击“像函数一样绘图”

如下图所示,因为折痕所在部分的投影灰度值会与其他部分产生突变,所以,红圈部分即为折痕垂直投影灰度。

平滑垂直灰度投影函数后,显示垂直投影曲线与平滑曲线,如下图所示,通过将两者曲线差分,超过一定阈值,即为缺陷的灰度投影值。

在垂直方向膨胀运算,计算得到折痕所在区域

完整代码:

dev_update_off () read_image (Image1030179715f15e264af3b, 'C:/Users/SWD-AR02/Desktop/10_3017_9715f15e264af3b.png') *------(1)构造滤波器与原图卷积增强图像 *构造滤波器 filter :=[5,5,5,-1,-5,1,5,1,-1,-5,1,5,1,-1,-5,1,5,1,-1,-5,1,5,1,-1,-5,1,5,1] *图像卷积 convol_image (Image1030179715f15e264af3b, ImageResult, filter, 'mirrored') *------(2)灰度投影,构建垂直灰度投影函数,并与平滑后的函数进行差分运算,超过一定阈值即为缺陷所在位置的列坐标 *设置差分阈值 ThresholdValue :=15 *灰度投影 gray_projections (ImageResult, ImageResult, 'simple', HorProjection, VertProjection) *创建函数 create_funct_1d_array(VertProjection,Function) *平滑函数 smooth_funct_1d_mean(Function, 12, 3, SmoothedFunction) *离散平滑函数 funct_1d_to_pairs (SmoothedFunction, XValues, YValues) *垂直灰度投影值与平滑后灰度值差分运算 sub:=(VertProjection-YValues) *使用符号函数,计算得到缺陷Y坐标 flawYValues:=find(sgn(sub-ThresholdValue),1) *------(3)计算缺陷区域 *计算缺陷所在区域 if(flawYValues[0]#-1) *生成图像中心位置行坐标 tuple_gen_const(|flawYValues|, 107, Newtuple) *以图像中心所在位置为行坐标,缺陷位置为列坐标,生成区域点 gen_region_points(Region, Newtuple, flawYValues) *在列方向膨胀操作,得出包含缺陷的区域 dilation_rectangle1(Region, RegionDilation, 5, 300) endif *与原图求交集,得出缺陷所在区域 intersection(RegionDilation,Image1030179715f15e264af3b,RegionIntersection) *结果显示 dev_set_draw ('margin') dev_display (Image1030179715f15e264af3b) dev_display (RegionIntersection)

猜你喜欢

转载自blog.csdn.net/u014090257/article/details/128019952