您現在的位置是:首頁 > 手機遊戲首頁手機遊戲

安卓彩色圖片轉黑白圖(二值化)

簡介①紅綠藍都是最純,得到白色顏色

紅綠藍怎麼變成黑色

以下內容

轉載

自按鍵精靈開發者:

郭立員

感謝大大的支援與熱心分享!

今天給大家帶來一個二值化轉黑白圖的案例分享。

效果展示

安卓彩色圖片轉黑白圖(二值化)

原理講解

本期文章主要涉及到一些關於顏色的基礎原理,對於沒有這方面基礎知識的同學來說,可能需要多看兩遍。

圖片是由畫素點組成的,每個畫素點的顏色是由三原色組成,所謂三原色就是紅色、綠色、藍色。它們透過“疊加”得到新的顏色,舉個例子看下圖。

安卓彩色圖片轉黑白圖(二值化)

透過圖片演示可以看到當多個顏色重疊一起時,會得到一個新的顏色,比如紅色和綠色在一起就可以得到黃色。如果紅綠藍在一起就是白色。

上圖中所用的紅綠藍顏色都是最純的,專業術語叫作飽和度最高。既然有最高、最純的說法,那就說明紅綠藍顏色是有等級之分的。

安卓彩色圖片轉黑白圖(二值化)

來看上圖,紅色一點點消失,這個過程就是由最純到最不純。在電腦顯示上,我們人為的給

三原色

的每種顏色分成256個等級,用0-255來表示。

一個顏色最純就是就是255,最不純就是0,共計256種色階。而三原色是紅綠藍3種顏色組成,那麼混合能夠得到顏色種類就是 256*256*256,約為一千七百萬種的顏色。

安卓彩色圖片轉黑白圖(二值化)

看上圖,

當綠色逐漸變純色以後,紅綠中間相交的部分也在發生變化,由紅色變成橙色再變成黃色。

這就是為什麼會有一千七百多萬種顏色的原因,每種原色增加一個色階,就是一種新的顏色,當然由於相鄰色階直接變化很微小,肉眼分辨不出來,但是對於顯示器來說它們是不同的。

當我們把紅綠藍三原色都弄到極限它們會得到什麼顏色呢?

①紅綠藍都是最純,得到白色顏色。

②紅綠藍都是最不純,得到黑色顏色。

講完顏色的基礎原理我們終於可以講黑白圖二值化了,顏色是有一千七百多萬種可能性,二值化呢就是把這些顏色分類,變成兩類顏色,並且用兩種顏色代替,通常我們用黑白表示,也可以是紅藍、黑金之類的。

說到二值化可能會想到程式設計上的二進位制,也就是0和1。其實用01表示也是可以的。

下面有一個關鍵點叫作閾值,就是我們劃分顏色的臨界點,我們顏色有上千萬種可能性,那麼怎麼劃分成兩種顏色呢?

就需要一個閾值,大於閾值的用白色表示,小於閾值的用黑色表示。

閾值的演算法是我們可以隨意定,一種常見的演算法,就是根據顏色的“亮度”,就是把顏色紅綠藍三個原色的色階加在一起然後除以3,這個就是顏色的亮度。

比如紅色150,綠色80,藍色10,那麼亮度就是(150+80+40)/3等於90。

這種亮度的計算結果範圍是最亮255+255+255除以3,那麼是255,最暗是0+0+0除以3,那麼是0。也就是說亮度的範圍也是0-255。

如果以亮度作為閾值的,比方說亮度90,大於90就變成白色,小於90就變成黑色。這樣就可以把上千萬種顏色變成兩種顏色了,得到我們說的圖片二值化。

操作過程

第一步:預先想好一個閾值

第二步:獲取圖片顏色中紅綠藍的值。

Dim PixelData =Image。GetPicData(Path)

第三步:遍歷所有畫素點的紅綠藍的值。

TracePrint PixelData[1][1][3] //R顏色值

TracePrint PixelData[1][1][2] //G顏色值

TracePrint PixelData[1][1][1] //B顏色值

第四步:把紅藍綠分量相加再除以3,把結果和閾值進行比較,大於閾值的讓紅綠藍都等於255,顏色變成白色,小於等於閾值的讓紅綠藍都等於0,顏色變成黑色。

當然為了減少運算量,也可以不除以3,而是把閾值乘以3得到一個3倍閾值,即紅綠藍三色相加和3倍的閾值比較大小。

最後一步:把新的顏色資料生成圖片,得到一張黑白圖。

程式碼展示:

Dim path=“/sdcard/pictures/pic2。png” //原圖

Dim path1=“/sdcard/pictures/heibaitu。jpg” //黑白圖

Dim xy=Image。Size(Path)

Dim x=xy[1]

Dim y=xy[2]

TracePrint x,y

For i = 1 To x

For j = 1 To y

If PixelData[i][j][1] + PixelData[i][j][2] + PixelData[i][j][3] < 240 Then

For k = 1 To 3

PixelData[i][j][k]=0

Next

Else

PixelData[i][j][k]=255

End If

Image。SavePixelData PixelData, Path1

再分享一個彩色轉灰度圖

Dim path1=“/sdcard/pictures/heibaitu2。jpg” //黑白圖

Dim PixelData1 =Image。GetPicData(Path)

PixelData1[i][j][k]=int((PixelData[i][j][1] + PixelData[i][j][2] + PixelData[i][j][3])/3)

Image。SavePixelData PixelData1, Path1

更多精彩內容,歡迎關注

微信公眾號:按鍵精靈公眾號

按鍵精靈論壇:bbs.anjian.com

Top