DistanceTransform(距离变换)

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

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


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

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

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

将模板使用为如下形式

   

Fp点是运算的当前点

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

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


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

将模板使用为如下形式


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

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

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

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


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



算法实现代码

Option Explicit
Dim MaxR As Integer
Dim MaxC As Integer
Dim Maximum As Integer
Dim Mat() As Integer

Sub 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 R
End Sub

Sub 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) = MinV
End Sub

Sub 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) = MinV
End Sub

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


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




  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值