目前分類:航空攝影 (3)

瀏覽方式: 標題列表 簡短摘要

'-------------uniform 匹配轉換 normal--------------------------------------------
Dim N_of_points = 1000
Dim ranX As New Random ' 近似 uniform 隨機函數
Dim prob(N_of_points) As Double '產生 uniform 點數
Dim prob_change(N_of_points) As Double ' 用來放 uniform轉換後成 normal的點數
Dim pps As Image '最後輸出圖存檔用

Dim cdf_N = Normal_CDF_table()
For pp = 0 To prob.Length - 1

prob(pp) = ranX.Next(0, 255)
Next

Dim p68 As Integer
Dim CDF_prob(255) As Double
Dim probG = getprob(prob, p68, CDF_prob)
Dim prob_iCDF As Double

Dim delta_min As Double
For pp = 0 To prob.Length - 1
For i = 0 To 255

If i = prob(pp) Then
prob_iCDF = CDF_prob(i)

'-------匹配與 normal_CDF最接近的值-----------------------
For jj = 0 To Normal_CDF_table.Length - 1

Dim delta = cdf_N(jj) - prob_iCDF

If Math.Abs(delta) delta_min = Math.Abs(delta) '''''匹配差量最小值者....eq1
' prob(pp) = jj
prob_change(pp) = jj
End If

Next
delta_min = 1 ' '.....用完一輪 要歸回初始值
'-------/匹配與 normal_CDF最接近的值/-----------------------
End If
Next
Next
'-------------/uniform 匹配轉換 normal/---------------------------------------------------------


'-----uniform 強制轉換成 normal 後處理---------------------
Dim p68_change As Integer
Dim CDF_prob_change(255) As Double
Dim probG_normal = getprob(prob_change, p68_change, CDF_prob_change)
For i = 82 To 255
probG_normal(i) = 0.0001
Next




'-----/uniform 強制轉換成 normal 後處理/---------------------




'---------畫圖顯示------------------------------------------

For i = 0 To probG.Length - 1
probG_normal(i) = probG_normal(i) * 1000
probG(i) = probG(i) * 3000
Next
TextBox_64_2.Clear()
TextBox_p68.Clear()
TextBox_p68.Text = p68.ToString + " about 68%"
TextBox_64_2.Text = p68_change.ToString + " about 68%"
' pps = C_plot_prob(PictureBox1, probG, p68)
' pps = plot_prob(probG_normal, p68)
pps = plot_prob(probG, probG_normal, p68, p68_change)

pps.Save("Prob_distribution.bmp") '存成圖片

'---------/畫圖顯示/------------------------------------------

prague12 發表在 痞客邦 留言(0) 人氣()

機率分布統計取得函數
x軸 設定取樣範圍是0~255 間距為1
y軸 機率值 0~1


'-------------------------------------------
Public Function getprob() As Single()

Dim op1 As New OpenFileDialog

'-------選取來源檔視窗-------------------
op1.Filter = ".raw|*.*"
Dim path As String

If op1.ShowDialog() = Windows.Forms.DialogResult.OK Then
path = op1.FileName

End If


Dim pic As New Bitmap(path) '讀圖 (檔案路徑 :Debug 目錄下 )
' Dim pic As New Bitmap("test.bmp") '讀圖 (檔案路徑 :Debug 目錄下 )
' Dim pic As New Bitmap("test.jpg") '讀圖 (檔案路徑 :Debug 目錄下 ) 任何圖片格式都可以讀成Bitmap 物件

Dim x As Integer = pic.Width '取得原圖寬度
Dim y As Integer = pic.Height '取得原圖長度
Dim pic2 As New Bitmap(x, y) '產生新圖 設定大小跟原圖一樣大

Dim colorG As Double
'-------/選取來源檔視窗/-------------------


'-------灰階運算--------------

' Dim pixelcolor As Color '測試用
' pixelcolor = pic.GetPixel(1, 1) ' 可以發現1個 Pixel 點 包含了(R,G,B)

Dim colorG_int_array(x - 1, y - 1) As UInt16
Dim histogram(255) As Long '灰度值分布數量統計
' Dim probility_G(255) As Single '灰度值機率分布

For j = 0 To y - 1
For i = 0 To x - 1
colorG = 0.299 * pic.GetPixel(i, j).R + 0.587 * pic.GetPixel(i, j).G + 0.114 * pic.GetPixel(i, j).B
Dim pointG = colorG - CInt(colorG) '四捨五入運算
If pointG > 0.5 Then
colorG = CInt(colorG) + 1
Else
colorG = CInt(colorG)
End If

colorG_int_array(i, j) = colorG
'--------------在出現的灰值上累計數量------------
For n = 0 To 255
If colorG = n Then
histogram(n) = histogram(n) + 1
End If
Next
'-------------/在出現的灰值上累計數量/--------------
Next
Next



'-------/灰階運算/--------------


'----------灰度機率統計--------------------------------------
Dim CDF_G(255) As Single

'Dim sum_p As Single = 0
Dim probility_G(255) As Single
For i = 0 To 255
probility_G(i) = histogram(i) / (x * y)
' sum_p = sum_p + probility_G(i)


'----------灰度CDF-------------
If i = 0 Then

CDF_G(i) = probility_G(i)
Else
CDF_G(i) = CDF_G(i - 1) + probility_G(i)

End If
'----------/灰度CDF/-----------------

Next

'----------灰度機率統計-----------------------------------------


Return probility_G
End Function

prague12 發表在 痞客邦 留言(0) 人氣()

空間共線條件轉換成像點

'------------------------------------------

    Public Function colinear_condition(ByVal fc As Double, ByVal air_x As Double, ByVal air_y As Double, ByVal air_z As Double, ByVal ground_x As Double, ByVal ground_y As Double, ByVal ground_z As Double, ByVal omega As Double, ByVal fi As Double, ByVal kapa As Double) As Double(,)


        Dim mid_image(1, 1) As Double ' 只是用來一次回傳多個值 x=m(1,0) ,y=m(0,1)
        Dim mid_x, mid_y As Double
        Dim m11, m12, m13, m21, m22, m23, m31, m32, m33 As Double
        Const per_degree_value = Math.PI / 180
        Dim omega_value = omega * per_degree_value
        Dim fi_value = fi * per_degree_value
        Dim kapa_value = kapa * per_degree_value
        '----------------------------------------------------------------
        ' m11 = Math.Cos(omega * per_degree_value) 'omega單位是'度'  >>   但函數要帶的是value,做個轉換
        m11 = Cos(omega_value) * Cos(kapa_value)
        m12 = Sin(omega_value) * Sin(fi_value) * Cos(kapa_value) + Cos(omega_value) * Sin(kapa_value)
        m13 = (-1) * Cos(omega_value) * Sin(fi_value) * Cos(kapa_value) + Sin(omega_value) * Sin(kapa_value)

        m21 = (-1) * Cos(fi_value) * Sin(kapa_value)
        m22 = -1 * Sin(omega_value) * Sin(fi_value) * Sin(kapa_value) + Cos(omega_value) * Cos(kapa_value)
        m23 = Cos(omega_value) * Sin(fi_value) * Sin(kapa_value) + Sin(omega_value) * Cos(kapa_value)

        m31 = Sin(fi_value)
        m32 = -1 * Sin(omega_value) * Cos(fi_value)
        m33 = Cos(omega_value) * Cos(fi_value)
        '------------------------------------------------------------------


        Dim dx = (ground_x - air_x)
        Dim dy = (ground_y - air_y)
        Dim dz = (ground_z - air_z)

        Dim mid_x_numerator = m11 * dx + m12 * dy + m13 * dz
        Dim mid_x_denominator = m31 * dx + m32 * dy + m33 * dz

        mid_x = (-1 * fc) * mid_x_numerator / mid_x_denominator

        Dim mid_y_numerator = m21 * dx + m22 * dy + m23 * dz
        'Dim mid_y_denominator = m31 * dx + m32 * dy + m33 * dz
        Dim mid_y_denominator = mid_x_denominator  '分母都是一樣的 少一點計算量

        mid_y = (-1 * fc) * mid_y_numerator / mid_y_denominator
        '------------------------------------------------------

        mid_image(1, 0) = mid_x
        mid_image(0, 1) = mid_y


        Return mid_image


    End Function

prague12 發表在 痞客邦 留言(0) 人氣()