2015-02-07 37 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