您現在的位置是:首頁 > 手機遊戲首頁手機遊戲
安卓彩色圖片轉黑白圖(二值化)
- 2022-05-21
紅綠藍怎麼變成黑色
以下內容
轉載
自按鍵精靈開發者:
郭立員
感謝大大的支援與熱心分享!
今天給大家帶來一個二值化轉黑白圖的案例分享。
效果展示
原理講解
本期文章主要涉及到一些關於顏色的基礎原理,對於沒有這方面基礎知識的同學來說,可能需要多看兩遍。
圖片是由畫素點組成的,每個畫素點的顏色是由三原色組成,所謂三原色就是紅色、綠色、藍色。它們透過“疊加”得到新的顏色,舉個例子看下圖。
透過圖片演示可以看到當多個顏色重疊一起時,會得到一個新的顏色,比如紅色和綠色在一起就可以得到黃色。如果紅綠藍在一起就是白色。
上圖中所用的紅綠藍顏色都是最純的,專業術語叫作飽和度最高。既然有最高、最純的說法,那就說明紅綠藍顏色是有等級之分的。
來看上圖,紅色一點點消失,這個過程就是由最純到最不純。在電腦顯示上,我們人為的給
三原色
的每種顏色分成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