将DCT系数可视化为图像的好方法

3

我使用下面的图像:

蜥蜴

将其分成8X8个方块,对每个方块进行2D DCT变换,并将它们分割为每个轴上的前30个系数。现在我正在尝试将结果可视化为一张图片,以便直观地理解DCT平面。

问题:

  • DCT系数(0,0)远大于其他所有系数
  • 我想看到正和负系数之间的区别。

到目前为止,我找到的最好的变换如下:

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

还有更好的想法吗?

2个回答

4

找到了:我要找的是直方图均衡化。 实现方法非常简单:

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 tile_dct

整个图像的结果:

whole_image whole_image_dct

(请注意简单瓷砖和具有许多细节的瓷砖之间的差异)


1
你可以将值进行移位,使所有值都为正数;然后取每个值的对数(顺便说一下,这是转换成分贝的基础),并将其作为颜色绘制。

尝试了你的建议,但效果很平淡 :( 你是指这个吗?d = d + abs(d.min()) + 1.0; d = np.log(d); maxi, mini = d.max(), d.min(); d = 255*(d - mini)/(maxi-mini); - ihadanny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接