- 算法思路 -
(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)