📄 一维影像匹配运行主窗体.frm
字号:
Form3.Picture1.CurrentX = ymx
Form3.Picture1.CurrentY = ymy
Form3.Picture1.Print ntming
Form1.Command2.Enabled = False
Form1.Command3.Enabled = True
Form2.Command1.Enabled = False
End Sub
Private Sub Command3_Click()
Dim i As Integer, j As Integer, guodu2 As Integer, guodu1 As Integer
Dim dx() As Single '用于保存左右像片在x方向的水平位移的数值
Dim yqdao() As Single, zyqcha() As Single '用于保存灰度函数的倒数和左右相片相应灰度差的数值
Dim nzhongl As Integer, nzhongh As Integer '用于保存窗口中心的行和列
Dim cun As Integer '用于求取影象目标点的过度变量
Dim nbiaol As Integer, nbiaoh As Integer '每个水平像素单元在倾斜影象中相对于左上角的行列号
Dim caix1 As Single, caiy1 As Single '采样点周围的四个像元素的中心坐标的数值
Dim caix2 As Single, caiy2 As Single, caix3 As Single, caiy3 As Single
Dim caix4 As Single, caiy4 As Single, hui3 As Single, hui4 As Single
Dim hui1 As Single, hui2 As Single '采样点周围的四个像素的灰度的数值
Dim x1 As Single, y1 As Single '双线性插值时所用到的两个参数的数值
Dim k1 As Integer, k2 As Integer
Dim fenzi As Double, fenmu As Double '用于求解dx所用到的两个参数
Dim xypt() As Single, yypt() As Single '用于替换求得的右影象窗口的坐标的数值
Dim nqk As Integer, qkt As Single '用于记录求得的相关系数的个数
Dim yqnm() As Single, wuyong As Integer '用于记录右窗口nm*nm的影象阵列的灰度的数值
ReDim yqnm(nm, nm)
ReDim yq(nm, nm + 2)
ReDim xyp(nm, nm + 2)
ReDim yyp(nm, nm + 2)
ReDim yqdao(nm, nm)
ReDim zyqcha(nm, nm)
ReDim xypt(nm, nm + 2)
ReDim yypt(nm, nm + 2)
cun = Int((yys - ymyp) / jiange) + 1 ''''''去所求得的右窗口的中心点坐标
ymyp = yys - cun * jiange + jiange / 2
cun = Int((ymxp - xys) / jiange) + 1
ymxp = xys + cun * jiange - jiange / 2
Call x_xt(ymxp, ymyp, a11, b11, c11, a21, b21, c21, a31, b31, c31)
nzhongl = Int((nm + 2) / 2) + 1
nzhongh = Int(nm / 2) + 1
xyp(nzhongh, nzhongl) = ymxp
yyp(nzhongh, nzhongl) = ymyp
'''''''''''''''''''''''''''''求取水平影象上的窗口个个像素点的灰度的数值''''''''''''''''''''''''''''''''
guodu1 = nzhongl - 1
guodu2 = 1
For j = 1 To nzhongl - 1 '''''''''求取以粗匹配的同名点为中心的影像窗口的各个像素的坐标
For i = 1 To nm
xyp(i, j) = xyp(nzhongh, nzhongl) - guodu1 * jiange1
Next i
guodu1 = guodu1 - 1
Next j
For j = nzhongl + 1 To nm + 2
For i = 1 To nm
xyp(i, j) = xyp(nzhongh, nzhongl) + guodu2 * jiange1
Next i
guodu2 = guodu2 + 1
Next j
For i = 1 To nm
xyp(i, nzhongl) = xyp(nzhongh, nzhongl)
Next i
guodu1 = nzhongh - 1
guodu2 = 1
For i = 1 To nzhongh - 1
For j = 1 To nm + 2
yyp(i, j) = yyp(nzhongh, nzhongl) + guodu1 * jiange1
Next j
guodu1 = guodu1 - 1
Next i
For i = nzhongh + 1 To nm
For j = 1 To nm + 2
yyp(i, j) = yyp(nzhongh, nzhongl) - guodu2 * jiange1
Next j
guodu2 = guodu2 + 1
Next i
For j = 1 To nm + 2
yyp(nzhongh, j) = yyp(nzhongh, nzhongl)
Next j
''''''''''''''''''''''''''''''''''''坐标计算结束''''''''''''''''''''''''''''''
For i = 1 To nm ''''''''''对窗口中的坐标的数值进行替换
For j = 1 To nm + 2
xypt(i, j) = xyp(i, j)
yypt(i, j) = yyp(i, j)
Next j
Next i
For i = 1 To nm ''''''对取得的窗口在倾斜影象中进行灰度的重新采样
For j = 1 To nm + 2
Call xt_x(xyp(i, j), yyp(i, j), a11, b11, c11, a21, b21, c21, a31, b31, c31)
If Int((xyp(i, j) - (xys + jiange / 2)) / jiange) <> (xyp(i, j) - (xys + jiange / 2)) / jiange Or _
Int((yyp(i, j) - (yys + jiange / 2)) / jiange) <> (yyp(i, j) - (yys + jiange / 2)) / jiange Then
nbiaol = Int((xyp(i, j) - xys) / jiange) + 1
nbiaoh = Int((yys - yyp(i, j)) / jiange) + 1
caix2 = xys + nbiaol * jiange - jiange / 2
caiy2 = yys - nbiaoh * jiange + jiange / 2
caix1 = caix2 - jiange
caiy1 = caiy2
caix3 = caix2
caiy3 = caiy2 + jiange
caix4 = caix1
caiy4 = caiy3
huidul = Form3.Picture1.Point(caix1, caiy1)
Call huidujisuan(huidul, huidu)
hui1 = huidu
huidul = Form3.Picture1.Point(caix2, caiy2)
Call huidujisuan(huidul, huidu)
hui2 = huidu
huidul = Form3.Picture1.Point(caix3, caiy3)
Call huidujisuan(huidul, huidu)
hui3 = huidu
huidul = Form3.Picture1.Point(caix4, caiy4)
Call huidujisuan(huidul, huidu)
hui4 = huidu
x1 = xyp(i, j) - caix1
y1 = caiy2 - yyp(i, j)
Call chongcaiyang(x1, y1, hui1, hui2, hui3, hui4, yq(i, j))
Else
huidul = Form3.Picture1.Point(xyp(i, j), yyp(i, j))
Call huidujisuan(huidul, huidu)
yq(i, j) = huidu
End If
Next j
Next i
'''''''''''''''''''''''''''''''''用于最小二乘法计算的循环'''''''''''''''''''''''''''''''''''''''
Do
For k1 = 1 To nm '求左右窗口对应像素单元的灰度差的数值
For k2 = 1 To nm
zyqcha(k1, k2) = zq(k1, k2) - yq(k1, k2 + 1)
Next k2
Next k1
For k1 = 1 To nm '求右相片的灰度函数的倒数的数值
For k2 = 1 To nm
yqdao(k1, k2) = (yq(k1, k2 + 2) - yq(k1, k2)) / (2 * jiange1)
Next k2
Next k1
For k1 = 1 To nm
For k2 = 1 To nm
fenzi = fenzi + yqdao(k1, k2) * zyqcha(k1, k2)
Next k2
Next k1
For k1 = 1 To nm
For k2 = 1 To nm
fenmu = fenmu + yqdao(k1, k2) ^ 2
Next k2
Next k1
nqk = nqk + 1 '''''''''用于统计相关系数的个数的数值
ReDim Preserve dx(nqk)
dx(nqk) = fenzi / fenmu ''''''''计算偏移量
For i = 1 To nm
For j = 1 To nm + 2
xyp(i, j) = xypt(i, j) + dx(nqk)
yyp(i, j) = yypt(i, j)
xypt(i, j) = xyp(i, j)
yypt(i, j) = yyp(i, j)
Next j
Next i
For i = 1 To nm ''''''''对求的灰度进行重新的采样
For j = 1 To nm + 2
Call xt_x(xyp(i, j), yyp(i, j), a11, b11, c11, a21, b21, c21, a31, b31, c31)
If Int((xyp(i, j) - (xys + jiange / 2)) / jiange) <> (xyp(i, j) - (xys + jiange / 2)) / jiange Or _
Int((yyp(i, j) - (yys + jiange / 2)) / jiange) <> (yyp(i, j) - (yys + jiange / 2)) / jiange Then
nbiaol = Int((xyp(i, j) - xys) / jiange) + 1
nbiaoh = Int((yys - yyp(i, j)) / jiange) + 1
caix2 = xys + nbiaol * jiange - jiange / 2
caiy2 = yys - nbiaoh * jiange + jiange / 2
caix1 = caix2 - jiange
caiy1 = caiy2
caix3 = caix2
caiy3 = caiy2 + jiange
caix4 = caix1
caiy4 = caiy3
huidul = Form3.Picture1.Point(caix1, caiy1)
Call huidujisuan(huidul, huidu)
hui1 = huidu
huidul = Form3.Picture1.Point(caix2, caiy2)
Call huidujisuan(huidul, huidu)
hui2 = huidu
huidul = Form3.Picture1.Point(caix3, caiy3)
Call huidujisuan(huidul, huidu)
hui3 = huidu
huidul = Form3.Picture1.Point(caix4, caiy4)
Call huidujisuan(huidul, huidu)
hui4 = huidu
x1 = xyp(i, j) - caix1
y1 = caiy2 - yyp(i, j)
Call chongcaiyang(x1, y1, hui1, hui2, hui3, hui4, yq(i, j))
Else
huidul = Form3.Picture1.Point(xyp(i, j), yyp(i, j))
Call huidujisuan(huidul, huidu)
yq(i, j) = huidu
End If
Next j
Next i
For i = 1 To nm
For j = 1 To nm
yqnm(i, j) = yq(i, j + 1)
Next j
Next i
ReDim Preserve qk(nqk) ''''''''计算相关系数的大小
Call xiangguanxishu(zq(), yqnm(), qkt)
qk(nqk) = qkt
If nqk > 1 Then ''''''''对迭代条件的判断
If Abs(qk(nqk)) < Abs(qk(nqk - 1)) Then
' If qk(nqk) < qk(nqk - 1) Then
Exit Do
End If
End If
Loop
For i = 1 To nqk ''''''''对粗匹配的结果进行改正
ymxp = ymxp + dx(i)
Next i
Call xt_x(ymxp, ymyp, a11, b11, c11, a21, b21, c21, a31, b31, c31)
Form1.Hide
Form2.Show
Form3.Show
Form3.Text3.Text = nqk
Form3.Picture1.DrawWidth = 3 ''''''''精匹配结果的输出
Form3.Picture1.Line (ymxp - 0.1, ymyp)-(ymxp + 0.1, ymyp), vbBlue
Form3.Picture1.Line (ymxp, ymyp - 0.1)-(ymxp, ymyp + 0.1), vbBlue
End Sub
'用于计算左右影象窗口相关系数的过程
Public Sub xiangguanxishu(xzq() As Single, xyq() As Single, qkt As Single)
Dim k1 As Integer, k2 As Integer '计算左右影象相关系数时所用到的一些变量
Dim qpz As Single, qpy As Single, qfz As Single, qfy As Single
Dim qxie As Single
For k1 = 1 To nm '求左影象窗口的灰度的均值
For k2 = 1 To nm
qpz = qpz + zq(k1, k2)
Next k2
Next k1
qpz = qpz / (nm ^ 2)
For k1 = 1 To nm '求右影象窗口的灰度的均值
For k2 = 1 To nm
qpy = qpy + yq(k1, k2)
Next k2
Next k1
qpy = qpy / (nm ^ 2)
For k1 = 1 To nm '求左影象的方差的数值
For k2 = 1 To nm
qfz = qfz + zq(k1, k2) ^ 2
Next k2
Next k1
qfz = qfz / (nm ^ 2) - qpz ^ 2
For k1 = 1 To nm '求右影象的方差的数值
For k2 = 1 To nm
qfy = qfy + yq(k1, k2) ^ 2
Next k2
Next k1
qfy = qfy / (nm ^ 2) - qpy ^ 2
For k1 = 1 To nm '求左右影象的协方差的数值
For k2 = 1 To nm
qxie = qxie + zq(k1, k2) * yq(k1, k2)
Next k2
Next k1
qxie = qxie / (nm ^ 2) - qpz * qpy
If qfz * qfy > 0 Then '计算相关系数的大小
qkt = qxie / (Sqr(qfz * qfy))
Else
qkt = 0
End If
End Sub
Private Sub Timer1_Timer()
Dim ttt As Integer, shid1 As Integer
shid = shid + 1
If shid = 1 Then
Picture1.Picture = LoadPicture(App.Path + "\主图片.JPG")
ElseIf shid = 2 Then
Picture1.Picture = LoadPicture(App.Path + "\图1.JPG")
ElseIf shid = 3 Then
Picture1.Picture = LoadPicture(App.Path + "\图3.JPG")
Else
ttt = 0
End If
If shid > 4 And shid < 5 Then
shid1 = 5
ElseIf shid > 5 Then
shid1 = 0
shid = 0
Else
ttt = 0
End If
If shid1 = 5 Then
Picture1.Picture = LoadPicture(App.Path + "\主图片.JPG")
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -