DistanceTransform(距离变换)

来源:互联网 发布:seo关键词的布局原则 编辑:程序博客网 时间:2024/05/25 08:12

本次博客是我习得图像处理中的距离变换理论后,而作的算法实现笔记

首先得理解图像像素中的D4,D8邻接概念


距离变换算法,首先是将原图二值话,而后将图像中非0值无穷大化(这里指设置一个尽可能大的一个值)

在进行距离变换时,需要建立一个D8(8-邻接)模板,在变换过程中模板需要通过两种形式进行全图像扫描变换

第一次扫描:是需要从左向右 自上而下的方向进行的

将模板使用为如下形式

   

Fp点是运算的当前点

该模板匹配过程中需要计算AL1->AL4 各点叠加相对Fp点D4距离值,其结果与Fp点值组成一个5个元素的集合,

Fp最终取值为该集合内的最小值(公式的理解)。


第二次扫描:是需要从右向左 自下而上的方向进行,这与第一次的扫描方向完全相反

将模板使用为如下形式


对于公式与模板的理解与第一次扫描相同

‘==============================================================================================

实例是用excel做的,用VBA实现算法

规划《图像处理、分析与机器视觉(第3版)》P14页示例


在Excel中算法实现后的样子(与书本一致)



算法实现代码

Option ExplicitDim MaxR As IntegerDim MaxC As IntegerDim Maximum As IntegerDim Mat() As IntegerSub DistanceFormat()    MaxR = 8: MaxC = 8: Maximum = 30000    Dim R As Integer, C As Integer    'Step1:建立目标区域等同大小的数组模板    ReDim Mat(1 To MaxR, 1 To MaxC) As Integer    For R = 1 To MaxR 'Mat数组拷贝目标区域0值,非0值记为Maximum        For C = 1 To MaxC            Mat(R, C) = IIf(Cells(R, C) = "0", 0, Maximum)        Next C    Next R    '====================================================    For R = 1 To MaxR        For C = 1 To MaxC            AL_Region R, C        Next C    Next R    '----------------------------------------------------    For R = MaxR To 1 Step -1        For C = MaxR To 1 Step -1            BR_Region R, C        Next C    Next R    '=====================================================    For R = 1 To MaxR 'Mat数组拷贝目标区域0值,非0值记为Maximum        For C = 1 To MaxC            Cells(R, C) = Mat(R, C)        Next C    Next REnd SubSub AL_Region(R As Integer, C As Integer)    Dim MinV As Integer    MinV = Mat(R, C)    'AL1    If C > 1 And R < MaxR Then '确保取值不过界        MinV = IIf(Mat(R + 1, C - 1) + 2 < MinV, Mat(R + 1, C - 1) + 2, MinV)    End If    'AL2    If C > 1 Then        MinV = IIf(Mat(R, C - 1) + 1 < MinV, Mat(R, C - 1) + 1, MinV)    End If    'AL3    If R > 1 And C > 1 Then        MinV = IIf(Mat(R - 1, C - 1) + 2 < MinV, Mat(R - 1, C - 1) + 2, MinV)    End If    'AL4    If R > 1 Then        MinV = IIf(Mat(R - 1, C) + 1 < MinV, Mat(R - 1, C) + 1, MinV)    End If    '------------------------------------------------------------------    Mat(R, C) = MinVEnd SubSub BR_Region(R As Integer, C As Integer)    Dim MinV As Integer    MinV = Mat(R, C)    'BR1    If R > 1 And C < MaxC Then '确保取值不过界        MinV = IIf(Mat(R - 1, C + 1) + 2 < MinV, Mat(R - 1, C + 1) + 2, MinV)    End If    'BR2    If C < MaxC Then        MinV = IIf(Mat(R, C + 1) + 1 < MinV, Mat(R, C + 1) + 1, MinV)    End If    'BR3    If C < MaxC And R < MaxR Then        MinV = IIf(Mat(R + 1, C + 1) + 2 < MinV, Mat(R + 1, C + 1) + 2, MinV)    End If    'BR4    If R < MaxR Then        MinV = IIf(Mat(R + 1, C) + 1 < MinV, Mat(R + 1, C) + 1, MinV)    End If    '------------------------------------------------------------------    Mat(R, C) = MinVEnd Sub

实现一个更为复杂的实例:


运行并添加条件格式后的样子




阅读全文
0 0
原创粉丝点击