2015-02-07 71 views
0

很好的方式,我把這個圖片: lizzards可視化DCT係數作爲圖像

將其分爲80X80瓷磚,做了一個二維DCT變換爲每一分,並將其切碎只在每個軸上的前30個係數。現在我試圖將結果可視化爲一個圖像,這將有助於我對DCT飛機的直覺。

問題:

  • (0,0)的DCT係數的方式比其他的都要大
  • 我想看看正負係數之間的差異。

迄今爲止最好的變換,我發現是這樣的:

def visualize_dct(d): 
    d = np.log(abs(d).clip(0.1)) 
    maxi, mini = d.max(), d.min() 
    d = 255*(d - mini)/(maxi-mini) 
    return d 

這給了我這個圖片:

dct_visualized

更好的想法?

完整的代碼在這裏: http://nbviewer.ipython.org/github/ihadanny/my-py-notebooks/blob/master/img_processing_04.ipynb

回答

1

找到了它:我正在尋找的是直方圖均衡。實現相當直截了當:

def visualize_dct(d): 
    d = d + abs(d.min()) 
    h = np.histogram(d, bins=1000, range=(0, d.max())) 
    c = 255.0*np.cumsum(h[0])/sum(h[0]) 
    new_img = np.zeros(d.shape) 
    for index,value in np.ndenumerate(d): 
     new_img[index] = c[999.0*value/d.max()]  
    return new_img 

結果單個瓷磚:

tile ​​

和整個圖像:

whole_image whole_image_dct

(公告差異簡單的瓷磚之間和有很多細節的瓷磚)

0

你可能會改變的值,因此全部成爲正面;然後取個別對數(順便說一下,這是轉換爲dB的基礎),並將其作爲顏色進行繪製。

+0

嘗試了你的建議,它看起來很平::(你的意思是? d = d + abs(d.min())+ 1.0; d = np.log(d); maxi,mini = d.max(),d.min(); d = 255 *(d-mini)/(maxi-mini); – ihadanny 2015-02-07 17:38:08