2011-02-15 58 views
4

在別人點燃我沒有檢查其他帖子之前,我已經這樣做了。我有一個關於將圖像轉換爲灰度的技術之一的具體問題。在C#中將圖像轉換爲純黑色和白色的最快方法是什麼?

我已閱讀過SO上的其他帖子,基本上從教程this site複製了技巧3(ColorMatrix)。它非常非常快速地工作。

我遇到的問題是,我需要的是一個純粹的BW圖像。 (即:如果平均(R,B,G)> 200 =>白色,否則黑色)。我以直接的方式實現了它,實際上它只需要教程中灰度算法的10倍。

我不擅長圖像處理,並想知道是否有任何方法修改教程中的片段,將圖像轉換爲純黑白圖像。如果不是,任何有效的方法都可以。

編輯:

下面是我使用了黑色和白色(無腦的方法)的代碼:

public Bitmap make_bw(Bitmap original) { 

    Bitmap output = new Bitmap(original.Width, original.Height); 

    for (int i = 0; i < original.Width; i++) { 

     for (int j = 0; j < original.Height; j++) { 

      Color c = original.GetPixel(i, j); 

      int average = ((c.R + c.B + c.G)/3); 

      if (average < 200) 
       output.SetPixel(i, j, Color.Black); 

      else 
       output.SetPixel(i, j, Color.White); 

     } 
    } 

    return output;  

} 
+5

使用黑白顯示器爲您的電腦:P – 2011-02-15 06:53:28

+0

你並不真的需要一個彩色矩陣轉換爲1位(純黑白色)圖像。試試第二種解決方案,看看它是否更快。 (如果沒有,請發佈您的代碼。) – 2011-02-15 06:56:00

+0

cal你粘貼一些代碼表現不好?如果你只添加一個「if」,那麼如何增加10倍的時間呢? – 2011-02-15 06:56:14

回答

2

這傢伙提出了三個測試,緊固件是這裏提到的ColorMatrixExternal link about image conversion

但評議之一聲稱,直接和unsafe像素接入方法是慢的原因是爲了在位圖.Width.Height呼叫和複製這些值來局部變量進行直接訪問的像素基本上更快。

我測試了這個,看起來不安全的方法比使用ColorMatrix快大約2.5倍。但它也可能涉及更多,顯然它需要在項目中允許使用unsafe代碼,這可能不合意。

2

我使用這個簡單的代碼:

public Bitmap GrayScaleFilter(Bitmap image) 
{ 
    Bitmap grayScale = new Bitmap(image.Width, image.Height); 

    for (Int32 y = 0; y < grayScale.Height; y++) 
     for (Int32 x = 0; x < grayScale.Width; x++) 
     { 
      Color c = image.GetPixel(x, y); 

      Int32 gs = (Int32)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11); 

      grayScale.SetPixel(x, y, Color.FromArgb(gs, gs, gs)); 
     } 
    return grayScale; 
} 
相關問題