none
[VB2008] 單純的邊緣偵測, 如何用VB呈現 RRS feed

  • 問題

  • 請問...

    有關於邊緣偵測  Sobel , Prewitt 等處理影像畫面的技術

    有沒有人能 直接用程式 處理一張圖片來教教我..

    有可能我對於VB裡面的函式庫不熟或是對VB整個不熟..

    可是我找了很多資料,看了很多關於邊緣處理的技術原理

    然後程式跑出來  就是黑畫面  哈.....

    Public Class Form6

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim adobHS(,) As Long = {{-1, -2, -1}, {0, 0, 0}, {1, 2, 1}}
            Dim adobVS(,) As Long = {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}}
            Dim result1 As Double = 0
            Dim result2 As Double = 0
            Dim resultmax As Double = 0
            Dim FWY, FWX As Integer
            Dim i As Integer
            Dim j As Integer
            Dim bmp1 As Bitmap
            bmp1 = New Bitmap("C:\Users\Ben\Desktop\B_01.bmp")
            Dim bmp2 As New Bitmap(bmp1.Width, bmp1.Height)

            For i = 0 To bmp1.Width - 1 Step 1
                For j = 0 To bmp1.Height - 1 Step 1
                    Dim C As Color = bmp1.GetPixel(i, j)
                    Dim K As Byte = (CInt(C.R * 0.299) + (C.G * 0.587) + (C.B * 0.114))

                    result1 = 0.0F
                    result2 = 0.0F
                    For FWY = 0 To 2 Step 1
                        For FWX = 0 To 2 Step 1
                            result1 += (adobHS(FWX, FWY) * K)
                            System.Math.Abs(result1)
                            result2 += (adobVS(FWX, FWY) * K)
                            System.Math.Abs(result2)
                        Next
                    Next

                    If result1 > result2 Then
                        resultmax = result1
                    Else
                        resultmax = result2
                    End If
                    Dim a As Byte = C.A
                    Dim r As Byte = C.R
                    Dim b As Byte = C.B
                    Dim g As Byte = C.G
                    r = resultmax
                    g = resultmax
                    b = resultmax
                    Dim newcolor = Color.FromArgb(a, r, g, b)
                    bmp2.SetPixel(i, j, newcolor)
                Next
            Next
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            PictureBox1.Image = bmp2
        End Sub
    End Class

    這是我打的   所以我到底是遮罩出了問題嗎  ..   搞快一個禮拜了完全沒進度  一直在黑畫面......

    • 已編輯 BB陳 2017年6月27日 下午 12:47
    2017年6月27日 下午 12:13

解答

  • 其實你已經完成一半了。

    現在要調整的是先將圖片所有像素轉成灰階,用一個二維陣列存灰階值。

    再來就是

     For FWY = 0 To 2 Step 1
                        For FWX = 0 To 2 Step 1
                            result1 += (adobHS(FWX, FWY) * K)
                            System.Math.Abs(result1)
                            result2 += (adobVS(FWX, FWY) * K)
                            System.Math.Abs(result2)
                        Next
                    Next

    這個程式改寫,迴圈不能用0-2,而是用圖片的寬高

     result1和 result2要用遮罩進行卷積

    最後和你接下來的程式一樣。

    2017年6月29日 下午 02:56

所有回覆

  • 看看這篇文件有沒有幫助:

    Canny Edge Detection in WPF (Vb.net)

    2017年6月28日 上午 12:51
  • 根據你的程式碼,最後的圖片的確是黑的。

    因為你每個像素轉成灰階後,立刻與你的遮罩進行運算,也就是酖一個數值乘上遮罩值後相加,結果=0。

    你的遮罩是沒有問題。但邊緣偵測要先把圖片的所有像素轉成灰階後,記錄在陣列中,然後這些灰階陣列再以九宮格將數值提出,與遮罩進行卷積運算。

      


    • 已標示為解答 BB陳 2017年6月29日 上午 11:30
    • 已取消標示為解答 BB陳 2017年6月29日 上午 11:30
    2017年6月28日 下午 12:47
  • 語法不是很熟,所以轉過來用很吃力

    還是要感謝

    謝謝你!!!

    2017年6月29日 上午 10:58
  • 我有發現了,可是我還是做不到邊緣的偵測....

    能不能請教你 怎麼用VB邊緣偵測??

    感謝!!

    2017年6月29日 上午 10:59
  • 其實你已經完成一半了。

    現在要調整的是先將圖片所有像素轉成灰階,用一個二維陣列存灰階值。

    再來就是

     For FWY = 0 To 2 Step 1
                        For FWX = 0 To 2 Step 1
                            result1 += (adobHS(FWX, FWY) * K)
                            System.Math.Abs(result1)
                            result2 += (adobVS(FWX, FWY) * K)
                            System.Math.Abs(result2)
                        Next
                    Next

    這個程式改寫,迴圈不能用0-2,而是用圖片的寬高

     result1和 result2要用遮罩進行卷積

    最後和你接下來的程式一樣。

    2017年6月29日 下午 02:56