在图像处理和计算机视觉领域,低对比度场景下的直线划伤提取是一项具有挑战性的任务。在许多实际应用中,直线划伤或裂缝可能在背景中与周围区域的对比度较弱,且存在断续现象。为了有效地提取这些低对比度的直线划伤,我们可以利用图像中的轮廓信息和方向性分析,来准确地识别和提取这些划伤痕迹。
1. 算法概述
本算法通过以下几个步骤提取低对比度场景中的直线划伤:
- 轮廓提取:通过
lines_gauss
函数提取图像中的轮廓片段。 - 轮廓筛选:根据轮廓的长度和直线度筛选出有效的轮廓。
- 角度分析:分析提取的直线轮廓的角度分布,确保提取到的线条具有一致的角度。
- 区域方向性融合:根据每个轮廓的方向性延伸区域,并进行区域的融合。
- 目标直线区域选择:通过一定的长度标准选择符合要求的直线区域。
- 显示结果:将提取到的直线划伤区域可视化。
2. 算法实现
2.1 图像加载与轮廓提取
首先,我们使用 lines_gauss
函数对图像进行轮廓提取。此函数可以提取出图像中的直线轮廓,特别适用于低对比度场景下的轮廓检测。
read_image (Image, ImageFiles[imgi])
lines_gauss (Image, Lines, 1.0, 2, 5, 'light', 'false', 'bar-shaped', 'false')
通过这一步,图像中的轮廓将被提取出来,便于后续分析。
2.2 轮廓筛选
接着,我们对提取出的轮廓进行筛选,依据轮廓的长度和直线度来选择有效的轮廓。通过 select_shape_xld
函数进行筛选,只保留那些符合条件的轮廓。
select_shape_xld (Lines, Lines0, ['contlength', 'anisometry_points'], 'and', [5, 5], [1e4, 1e4])
这一步保证了我们只选择出具有较长且较直的轮廓片段,以去除无关的小噪声区域。
2.3 角度分析
由于在实际场景中,直线划伤通常沿某个方向分布,所以我们需要对每条轮廓的角度进行分析。通过 elliptic_axis_points_xld
函数获取每条直线的角度信息,并将其按角度范围进行划分。
elliptic_axis_points_xld (Lines0, _, _, Phis)
我们将角度范围划分为 -90 到 90 度,步长为 30 度(即±15度),以便对不同方向的轮廓进行分类。
2.4 方向性区域融合
对于每个方向上的轮廓,我们通过 segment_contours_xld
函数进行分段,并使用 fit_line_contour_xld
来拟合每段轮廓,从而得到直线的起止点。然后,我们生成直线的区域,并沿着每个方向延伸区域。
gen_empty_obj (RegHSLines)
for ang := -rad(75) to rad(75) by rad(30)
curAng := ang
select_shape_xld (Lines0, TempLines, 'phi_points', 'and', curAng - rad(15), curAng + rad(15))
segment_contours_xld (TempLines, TempSmallLines, 'lines', 3, 2, 1)
fit_line_contour_xld (TempSmallLines, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
gen_region_line (RegionLines, RowBegin, ColBegin, RowEnd, ColEnd)
elliptic_axis (RegionLines, RFeaRas, RFeaRbs, RFeaPhis)
area_center (RegionLines, _, RFeaRows, RFeaCols)
gen_rectangle2 (RegSEs, RFeaRows, RFeaCols, RFeaPhis, RFeaRas + 20.5, RFeaRbs + 1.5)
union1 (RegSEs, RegSE)
connection (RegSE, RegSEs)
intersection (RegSEs, RegionLines, RegLines)
concat_obj (RegHSLines, RegLines, RegHSLines)
endfor
在这一步中,我们不仅对轮廓进行方向性选择,还进行了轮廓的拟合和区域延伸,以便更好地处理低对比度下的直线划伤。
2.5 目标直线区域选择
最后,我们根据预定的长度标准(例如 150 像素)来选择目标直线区域,并生成其最小外接矩形,以便对目标直线区域进行可视化显示。
select_shape (RegHSLines, RegHS, 'contlength', 'and', 150, 1e6)
smallest_rectangle2 (RegHS, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1 + 5, Length2 + 10)
通过这一步,算法能够准确地定位出符合要求的直线区域,并为其绘制最小外接矩形。
2.6 显示结果
最后,算法将显示原始图像以及提取到的直线区域。
dev_display (Image)
dev_display (Rectangle)
通过这一步,我们可以直观地看到提取出的直线划伤区域,并进行后续的处理或分析。
3. 算法效果与应用
该算法能够成功地从低对比度的场景中提取出直线划伤,特别是在工业检测、表面缺陷分析等领域具有广泛的应用前景。通过有效的轮廓提取和方向性分析,即使在背景噪声较多、对比度较低的情况下,也能准确地定位出直线划伤。
原图与提取结果对比:
原图:
提取结果:
原图:
提取结果:
4. 工程下载
通过网盘分享的文件:低对比度下直线提取.7z
链接: https://pan.baidu.com/s/1hIYcax2Vjf7RVxJV5E2rbA?pwd=jkcf 提取码: jkcf