none
請問一下,關於圖片的灰階處裡...... RRS feed

  • 問題

  • 請問一下站上的各位大大,小弟最近作題目遇到了一些瓶頸

    題目的要求是把圖片灰階化!!

    小弟在google上也找了很多相關資料.....

    例如....將圖片的黑白色階作為陣列分析...等等之類的

    謝謝大大的不吝指教 ^^"

    小弟第一次在貴站發文 如有冒失之處還請大大指點 謝謝 ^^"

    2006年11月16日 上午 10:45

解答

所有回覆

  • 可以將像素讀出後利用公式轉成灰階

    Y = 0.299R + 0.587G + 0.114B

    2006年11月16日 下午 01:36
  • 嗯.....謝謝楊毛大大^^

    昨天達文C 去圖書館K了一些書之後 研究出一個公式為 (R+G+B)/3

    請問一下大大這樣可行嗎??

    謝謝大大^^"

    2006年11月17日 上午 12:42
  • 他列的是 RGB 轉 YUV 的公式


    RGB色系轉到YUV色系
    Y為灰度值、U和V為色調值。它和RGB的換算公式為
        Y =  0.299R + 0.587G + 0.114B
        U = -0.148R - 0.289G + 0.437B
        V =  0.615R - 0.515G - 0.100B
        R = Y + 1.140V
        G = Y - 0.395U - 0.581V
        B = Y + 2.032U

    上網搜尋一下這個公式,直接貼到 google 就行,可以找到很多說明。

    2006年11月17日 上午 01:14
    版主
  • 恩 沒錯, 這是我上課的範例 你可以參考

       OpenFileDialog ofd = new OpenFileDialog();
       if(ofd.ShowDialog() == DialogResult.OK)
       {
        Bitmap bmp1 = new Bitmap(ofd.FileName);
        Bitmap bmp2 = (Bitmap)bmp1.Clone();
        for(int row=0; row<bmp1.Height; row++)
        {
         for(int col=0; col<bmp1.Width; col++)
         {
          Color c = bmp2.GetPixel(col, row);
          int y = (int)(0.299 * c.R  + 0.587 * c.G + 0.114 * c.B);

          c = Color.FromArgb(y,y,y);
          bmp2.SetPixel(col, row, c);
         }
        }

        this.pictureBox1.Image = bmp1;
        this.pictureBox2.Image = bmp2;
       }

    2006年11月17日 上午 01:40
  • 嗯.....那達文C再請教一下璉璉大大

    達文C想把圖片灰階,想說利用抓點改變色階的方式做灰階

    不知道可不可行.....

    還有另外一個疑問.....

    那要如何抓取圖片的像素呢??

    要先把圖片格式化成每一個點嗎??

    感謝大大!!

    2006年11月17日 上午 03:25
  • 謝謝楊毛大大~!!

    不過小弟學藝不精......對C很陌生(看到大括號)

    有了解一點....

    小弟了解的結果是....

    把圖片裡的每一個點做色彩運算→int y = (int)(0.299 * c.R  + 0.587 * c.G + 0.114 * c.B);

    是這樣子嗎??

    2006年11月17日 上午 03:30
  • 搜尋 GetPixel ,這是基本法。

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=GetPixel&localechoice=31748&SiteID=14&searchscope=allforums

    文章裡面有討論到加速的方法。

    2006年11月17日 上午 04:59
    版主
  • ㄏㄏ 我忘了這是virtual basic討論區...sorry
    不過其實大部分的地方差不多, 只是語言不同, 重點是GetPixel取顏色, 再計算
    y = (int)(0.299 * c.R  + 0.587 * c.G + 0.114 * c.B);就是將rgb顏色分別取出 再計算其比例可取得灰度

    這是visual basic的版本

            Dim ofd As New OpenFileDialog
            If ofd.ShowDialog() = DialogResult.OK Then
                Dim bmp1 As New Bitmap(ofd.FileName)
                Dim bmp2 As Bitmap = bmp1.Clone()
                Dim row, col As Integer
                For row = 0 To bmp1.Height - 1
                    For col = 0 To bmp1.Width - 1
                        Dim c As Color = bmp2.GetPixel(col, row)
                        Dim y As Integer = (0.299 * c.R + 0.587 * c.G + 0.114 * c.B)
                        c = Color.FromArgb(y, y, y)
                        bmp2.SetPixel(col, row, c)

                    Next
                Next
                PictureBox1.Image = bmp1
                PictureBox2.Image = bmp2
            End If

    希望有幫助

    2006年11月17日 上午 05:16
  • New OpenFileDialog?? what's that??

    找過msdn了....可是好像不是VB的東西@@??.....

    再問問高手好嚕^^"

    謝謝大大!!! 小弟感激不盡~!!

    2006年11月17日 下午 03:23
  • ... 你用 VB6 ?

    第一次來看過:張貼文章應注意事項及應提供資訊

    2006年11月17日 下午 03:55
    版主
  • 可是達文C還是不了解如何用getpixel的方法.....

    和VB版本有關係嗎??

    達文C用的是VB6 最近準備技藝競賽用.....

    可否請璉璉大大說明^^??

    謝謝!!

    2006年11月17日 下午 04:19
  • ... 你浪費了大家的時間... 前面所有的回文都是針對 VBNET 。貼文前都不看公告 張貼文章應注意事項及應提供資訊

    VB6 仍然有 Point 取得點的顏色,用 PSet 設定點的顏色,請安裝線上手冊,瀏覽 PictureBox 的方法。

    2006年11月18日 上午 01:18
    版主
  • sorry 大大 小弟下次會注意的!!

    point....pset 恩 了解了^^ 回去試看看~!!

    謝謝大大的指教!!

     

    2006年11月18日 上午 02:53