【发布时间】:2011-11-09 03:27:32
【问题描述】:
我正在尝试使用 OpenCV 中的 dct() 函数来计算离散余弦变换,但得到了奇怪的结果。
我的脚本是:
import os, sys
import cv, cv2
import numpy as np
fn1 = 'original.jpg'
img1 = cv2.imread(fn1, cv2.CV_LOAD_IMAGE_GRAYSCALE)
h, w = img1.shape[:2]
vis0 = np.zeros((h,w), np.float32)
vis0[:h, :w] = img1
vis1 = cv2.dct(vis0)
img2 = cv.CreateMat(vis1.shape[0], vis1.shape[1], cv.CV_32FC3)
cv.CvtColor(cv.fromarray(vis1), img2, cv.CV_GRAY2BGR)
cv.ShowImage('',img2)
cv2.waitKey()
cv.SaveImage('saved.jpg', img2)
这似乎运行没有错误,但 ShowImage() 显示的图像和 SaveImage() 保存的图像看起来非常不同。不幸的是,我似乎找不到任何 DCT 处理图像的示例图像,所以我不确定哪个是正确的(如果有的话)。
原图:
显示的 DCT 图像:
保存的 DCT 图像:
为什么显示的和保存的 DCT 图像之间存在如此大的差异?哪个是正确的?
【问题讨论】:
-
只是一个猜测,但在我看来,保存的 DCT 是正确的,并且显示的 DCT 看起来好像以某种方式丢失了大部分信息(好像所有像素 > epsilon 都已映射到1,出于某种原因)。可能保存的图像在 0-255 范围内,并且显示的图像已错误地将其裁剪为 0-1。
标签: python opencv computer-vision signal-processing