一種壓縮圖片的方法---Machine learning 之 K-Means


背景描述:

  RGB編碼:對於一個直接用24bit表示每一個而像素的圖像來說,每一個pixel使用8-bit無符號整數(0-255)來表示紅or綠or藍。

壓縮目的:

  將128x128大小的圖片由原來的24bit表示-壓縮成->16bit表示每一個像素的圖像。

壓縮方法:

  對於每一個pixel, 使用 K-Means選擇16bits來表示原來的24bits。當然,具體是通過計算每一個像素空間的16bits大小的聚類來表示原來的24bits。

實現步驟:

  1.將原來的128x128大小的圖片讀入到一個3維矩陣A中。舉個例子 A(50, 33, 3)表示原圖片中rowNum = 50 columnNum = 33 RGB中的B維 所對應的

顏色值(0-255)。這樣我們就得到了一個 X = (m x 3)matrix of piexl colors( where m = 128 * 128 = 16384)。

  2.運行K-Means算法,取K= 16, 這樣將每一個pixel聚類到一個Cluster k上(關於K-means初始K個點的選擇 其實就是隨機在X中選出K個點作為 centroid的)。用k這個centroid point的location來代表原來的像素值。這里K=16,我們可以用四位來表示16種分類的可能。那么也就需要4bits就可以記錄當前piexl的壓縮后的分類。(當然,最后還需要有一個對照表 k(16個顏色(?為啥不用4bits來映射,2進制轉換太繁瑣!這里直接映射就好了)) -> RGB(24bits))。

壓縮效果:

  壓縮前大小:128*128*24 = 393216 bits;

  壓縮后大小:128*128*4 + 16*24 = 65920 bits;

  壓縮因子接近 6!

  代碼在gitlab Machine learning ex7中。 

核心思路:

  K-means進行圖片壓縮,壓縮的並不是顏色。原來用24位表示顏色,現在也用24位表示顏色。只不過編碼方式發生了改變,將原來的24bits種顏色變成了16bits種顏色。而這個過程正是采用的k-means聚類。那么顏色之間的區分度就變得不是那么明顯,導致分辨率下降。

Have fun , good luck!

And this is my picture kebe compressed:

 K-Means結果可視化

  如圖每一個顏色代表一個cluster(共計16種)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM