【數字圖像處理】使用kmeans算法對TrueColor圖片進行優化

實驗的主要內容是將truecolor的圖片經過一個優化算法獲得其256色的最優表示。本實驗採用kmean作算法對像素的色彩進行聚類的計算,分類獲得一個色彩數爲256的CodeBook,和一個包含有CodeBook索引的矩陣,原圖片的顏色值都從CodeBook中獲取,colorMap矩陣保存其中像素顏色的索引值,這樣經過索引恢復出一個近似的圖片文件,達到比傳統的GIF圖像更好的效果。python




 

由上圖可見,256色的GIF圖像有明顯的顆粒感,這是由於圖像髮色數太低形成的顏色不連貫。算法



 

上圖是經過優化算法計算的256色的圖片,從圖片上能夠看出,顏色過渡平滑,幾乎看不出顆粒感,相較於256色的GIF圖像有明顯的優點。app


 

從圖片上能夠很好的看出,GIF採用的ColorMap對圖像有明顯的失真,細節圖中顆粒感明顯,對比採用優化算法的細節圖,一樣是256色,優化算法處理以後的圖片能夠和採用24bitTrueColor的JPG圖片相媲美,從圖像中幾乎看不出失真。優化



源代碼:code

main.py索引

 

from colorMap import *

fileName='lena.jpg'
clusterNum=256
codeBook,colorMap=kmeansImg(fileName,clusterNum)
rimg=recoveryImg(codeBook,colorMap)
cv2.imwrite('./r.jpg',rimg)
cv2.imshow('rimg',rimg)
img=cv2.imread('lena.jpg')
cv2.imshow('img',img)
cv2.waitKey()
from scipy.cluster.vq import *
from numpy import *
import cv2

def kmeansImg(fileName,clusterNum):
    img=cv2.imread(fileName)
    rl=img.shape[0]
    cl=img.shape[1]
    img=reshape(img,(img.shape[0]*img.shape[1],img.shape[2]))
    codeBook,dis1=kmeans(img,clusterNum)
    colorMap,dis2=vq(img,codeBook)
    colorMap=reshape(colorMap,(rl,cl))
    return codeBook,colorMap

def recoveryImg(codeBook,colorMap):
    img=[]
    for r in range(colorMap.shape[0]):
        for l in range(colorMap.shape[1]):
            img.append(list(codeBook[colorMap[r,l]]))
    img=array(img)
    img=reshape(img,(colorMap.shape[0],colorMap.shape[1],3))
    return img    
        
相關文章
相關標籤/搜索