none
要如何計算圖形的黑點與白點數量? RRS feed

  • 問題

  •   Dim x As Integer = bmp.Width '取得原圖寬度
            Dim y As Integer = bmp.Height     '取得原圖長度
            Dim pic5 As New Bitmap(x, y) '產生新圖 設定大小跟原圖一樣大
            Dim i, j As Integer
            Dim colorY As Double
            For j = 0 To y - 1
                For i = 0 To x - 1

                    'rgb轉成灰階)
                    colorY = 0.333F * (CInt(bmp.GetPixel(i, j).R) + CInt(bmp.GetPixel(i, j).G) + CInt(bmp.GetPixel(i, j).B))
                    If (bmp.GetPixel(i, j).R < TextBox1.Text) Then
                        pic5.SetPixel(i, j, Color.FromArgb(0, 0, 0)) '黑點
                    Else
                        pic5.SetPixel(i, j, Color.FromArgb(255, 255, 255)) '白點
                    End If
                Next
                PictureBox1.Image = pic5
            Next
           
        End Sub
    '我把圖形二值化後就剩白色與黑色,是問我要如何計算其數量?
    2011年6月29日 上午 07:11

解答

  •     Dim intBlack As Integer = 0, intWhite As Integer = 0
    
        For j = 0 To y - 1
          For i = 0 To x - 1
    
            'rgb轉成灰階)
            colorY = 0.333F * (CInt(bmp.GetPixel(i, j).R) + CInt(bmp.GetPixel(i, j).G) + CInt(bmp.GetPixel(i, j).B))
            If (bmp.GetPixel(i, j).R < TextBox1.Text) Then
              pic5.SetPixel(i, j, Color.FromArgb(0, 0, 0)) '黑點
              intBlack += 1
            Else
              pic5.SetPixel(i, j, Color.FromArgb(255, 255, 255)) '白點
              intWhite += 1
            End If
          Next
          PictureBox1.Image = pic5
        Next
    


    2011年6月29日 上午 08:17

所有回覆

  •     Dim intBlack As Integer = 0, intWhite As Integer = 0
    
        For j = 0 To y - 1
          For i = 0 To x - 1
    
            'rgb轉成灰階)
            colorY = 0.333F * (CInt(bmp.GetPixel(i, j).R) + CInt(bmp.GetPixel(i, j).G) + CInt(bmp.GetPixel(i, j).B))
            If (bmp.GetPixel(i, j).R < TextBox1.Text) Then
              pic5.SetPixel(i, j, Color.FromArgb(0, 0, 0)) '黑點
              intBlack += 1
            Else
              pic5.SetPixel(i, j, Color.FromArgb(255, 255, 255)) '白點
              intWhite += 1
            End If
          Next
          PictureBox1.Image = pic5
        Next
    


    2011年6月29日 上午 08:17
  • 才算個黑白點而已,竟然要快1分鐘= =?為什麼會這樣?

    是因為vb的效率比較低嗎?用C++會差很多嗎?

    2011年6月29日 上午 08:30
  • Bitmap.LockBits 方法 (Rectangle, ImageLockMode, PixelFormat)

    http://msdn.microsoft.com/zh-tw/library/5ey6h79d%28VS.80%29.aspx

    因為用了GetPixel和SetPixel慢,LockBits會比較快,C++/C#用指標會更快囉...

     


    2011年6月29日 上午 08:49
  • ...

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=LockBits


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月29日 下午 02:47
  • 你用BMP.GetPixel

    我猜的的運作原理應該是打開BMP檔 在去讀那個位置的RGB    在把檔案關掉   所以這樣的話光打開檔案在關閉花掉的時間就夠多了

    你可以像打開記事本的方法  在一個BYTE 一個BYTE去讀   這樣就不會有問題了

    我是不知道你的圖有多大  我大學在做GIS時  分析1024*768的圖   應該花不到兩秒就好了

    你可以上GOOGLE看BMP檔的格式  我記得前53個BYTE都是表頭檔 之後才是檔案     每行的資料都要被四整除   不夠的會自己補

    如1024 MOD 4   這就不要補  你就一直讀下去

    6*2的圖

    6 MOD 4   就要在補兩個byte   所以你讀完六次的brg 後的兩個byte是沒用的

    brgbrgbrgbrgxx

    brgbrgbrgbrgxx

    由下到上 由左至右

    2011年7月1日 上午 07:58