本次博客是我习得图像处理中的距离变换理论后,而作的算法实现笔记
首先得理解图像像素中的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
实现一个更为复杂的实例:
运行并添加条件格式后的样子