将 DCT 系数可视化为图像的好方法
Nice Way to Visualize DCT Coefficients as an Image
下图是我拍的:
将其分成 8X8
个图块,对每个图块进行 2D 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
这给了我下面的图片:
完整代码在这里:
http://nbviewer.ipython.org/github/ihadanny/my-py-notebooks/blob/master/img_processing_04.ipynb
有更好的主意吗?
你可以改变这些值,这样所有的值都是正的;然后取单个对数(顺便说一句,这是转换为 dB 的基础),并将其绘制为颜色。
找到了:我要找的是直方图均衡化。实施非常简单:
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
单个图块的结果:
对于整张图片:
(注意简单的瓷砖和有很多细节的瓷砖之间的区别)
下图是我拍的:
将其分成 8X8
个图块,对每个图块进行 2D 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
这给了我下面的图片:
完整代码在这里: http://nbviewer.ipython.org/github/ihadanny/my-py-notebooks/blob/master/img_processing_04.ipynb
有更好的主意吗?
你可以改变这些值,这样所有的值都是正的;然后取单个对数(顺便说一句,这是转换为 dB 的基础),并将其绘制为颜色。
找到了:我要找的是直方图均衡化。实施非常简单:
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
单个图块的结果:
对于整张图片:
(注意简单的瓷砖和有很多细节的瓷砖之间的区别)