CSharp 代碼示例每日一講:彩色圖像轉換黑白?

其實將彩色圖像轉換成黑白圖像原理非常的簡單,實現起來也很容易。簡單的說就是黑白圖像的每個像素在RBG顏色中都具有相對應的值。用代碼循環把圖像中每一位RGB顏色轉換成對應的黑白顏色就可以。

一、彩色轉換黑白

C# Code

var originalbmp = new Bitmap(Bitmap.FromFile(OFD.FileName)); // Load the image

var newbmp = new Bitmap(Bitmap.FromFile(OFD.FileName)); // New image

for (int row = 0; row < originalbmp.Width; row++) // Indicates row number

{

for (int column = 0; column < originalbmp.Height; column++) // Indicate column number

{

var colorValue = originalbmp.GetPixel(row, column); // Get the color pixel

var averageValue = ((int)colorValue.R + (int)colorValue.B + (int)colorValue.G)/3; // get the average for black and white

newbmp.SetPixel(row, column, Color.FromArgb(averageValue, averageValue, averageValue)); // Set the value to new pixel

}

}

newbmp.Save(OFD.FileName.Replace(".", "_BlackAnd White")); // Save the black ad white image

Process.Start(OFD.FileName.Replace(".", "_BlackAnd White")); // Open the image

}

原始圖像:

CSharp 代碼示例每日一講:彩色圖像轉換黑白?

轉換後的圖像:

CSharp 代碼示例每日一講:彩色圖像轉換黑白?

怎麼樣?是不是非常容易呢。

這真是黑白圖像嗎?

其實從技術上說我們剛剛轉換成的圖像根本就不是黑白圖像,應該是叫“灰度圖像”,顏色值是單一從(0到256)。

而真正的黑白圖像只由(0,1)兩種值。

兩者區別參看下圖:

CSharp 代碼示例每日一講:彩色圖像轉換黑白?

灰度圖(人們通常說的黑白照片)

CSharp 代碼示例每日一講:彩色圖像轉換黑白?

技術上真正的黑白圖

應該很容易的看出區別吧,好了,有人該說了,這也太難看了,這樣的黑白圖片有什麼用處呢?

黑白圖片用途

其實黑白圖片在模式識別,圖像處理,及數據存儲方面都有很多的用處。

黑白圖片顏色值只有兩種,處理起來簡單、明確。

很容易壓縮,存儲空間很可以很小。

模式識別中,把彩色轉成黑白,去除噪點就方便很多,輪廓識別也更容易處理。

等等。。。等等。

灰度轉換成黑白圖片

比如灰度顏色是(0到255),我們轉換成(0,1),

算法:大與某個值(比如:120)則轉換成1,反正轉換成0,那麼這個值(120)就是說的閥值。

如何獲取一個圖像轉換的閥值不是一個容易的事,因為圖像的明亮度不同,有的圖像一片黑,有點很亮。所以這根據圖像計算圖像的動態閥值是很複雜的算法。

有個日本人提出一種算法:

對於圖像I(x,y),前景(即目標)和背景的分割閾值記作T,屬於前景的像素點數佔整幅圖像的比例記為ω0,其平均灰度μ0;背景像素點數佔整幅圖像的比例為ω1,其平均灰度為μ1。圖像的總平均灰度記為μ,類間方差記為g。

假設圖像的背景較暗,並且圖像的大小為M×N,圖像中像素的灰度值小於閾值T的像素個數記作N0,像素灰度大於閾值T的像素個數記作N1,則有:

ω0=N0/ M×N (1)

ω1=N1/ M×N (2)

N0+N1=M×N (3)

ω0+ω1=1 (4)

μ=ω0*μ0+ω1*μ1 (5)

g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6)

將式(5)代入式(6),得到等價公式:

g=ω0ω1(μ0-μ1)^2 (7) 這就是類間方差

採用遍歷的方法得到使類間方差g最大的閾值T,即為所求。

大家有興趣可以網絡上搜索一下。


分享到:


相關文章: