大家好,我是公衆号3分鐘學堂的郭立員,今天給大家帶來一個二值化轉黑白圖的案例分享。
效果展示
本期文章主要涉及到一些關于顔色的基礎原理,對于沒有這方面基礎知識的同學來說,可能需要多看兩遍。
圖片是由像素點組成的,每個像素點的顔色是由三原色組成,所謂三原色就是紅色、綠色、藍色。它們通過“疊加”得到新的顔色,舉個例子看下圖。
通過圖片演示可以看到當多個顔色重疊一起時,會得到一個新的顔色,比如紅色和綠色在一起就可以得到黃色。如果紅綠藍在一起就是白色。
上圖中所用的紅綠藍顔色都是最純的,專業術語叫做飽和度最高。既然有最高、最純的說法,那就說明紅綠藍顔色是有等級之分的。
來看上圖,紅色一點點消失,這個過程就是由最純到最不純。在電腦顯示上,我們人為的給三原色的每種顔色分成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倍的阈值比較大小。
最後一步:把新的顔色數據生成圖片,得到一張黑白圖。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!