【问题标题】:Calculating DCT with OpenCV用 OpenCV 计算 DCT
【发布时间】: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


【解决方案1】:

您似乎显示了 DCT 的复杂输出。而且,因为您尝试保存 2 通道图像(DCT 输出 2 通道 - 一个用于实部,一个用于虚部),它只保存了实部(某种程度上接近幅度)。

因此,从您的 DCT 输出中,使用幅度()和相位()函数来提取有用的信息。分别显示,

而且,最重要的是,请仔细阅读 DCT (http://en.wikipedia.org/wiki/Discrete_cosine_transform),以便了解自己在做什么。

【讨论】:

  • 您从哪里获得有关 DCT() 输出的信息? Wikipedia 中所写的内容和实际执行的内容通常是非常不同的东西。我找到的所有 OpenCV 文档,甚至我发布的代码,都显示它返回与输入数组相同的形状,对于灰度图像,它将是一个通道,而不是两个。 opencv.willowgarage.com/documentation/cpp/…
  • 寻找发行版附带的opencv refman。它称为 opencv.pdf 或 opencv_refman.pdf,具体取决于您使用的版本。它比在线参考更详细。并且相同的形状不等于相同的通道数。试试 cout
  • 但是我用过,它给了我2通道、浮点、单精度数据。如 refman 中所述
  • @vasile...我不知道该告诉你什么。代码没有说谎,并且 cv2.dct() 输出一个 numpy ndarray ...它没有 channels() 函数。请注意,我使用的是 2.3 Python 包装器(cv 和 cv2)而不是 C++ API。也许最近的 Python 包装器的工作方式与您过去习惯的不同?
  • 我不使用python,但是,我使用了更多的ocv版本,包括2.3和2.3.1。您发布的图像清楚地表明,DCT 有复杂的(第一)和真实的(第二)部分。为 DCT 输出调用幅度(),并检查结果。我应该接近第二张图片(但不完全相同)。
【解决方案2】:

保存的图像实际上是相同的,但值被限制为 [0..255] 并在保存为 JPEG 之前转换为字节 (numpy.uint8)。负值设置为零,大于 255 的值设置为 255。

cv2.imshow("before_save", vis1)
vis1[vis1>255] = 255
vis1[vis1<0] = 0
cv2.imshow("saved", vis1.astype(np.uint8))

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2014-05-19
    • 2022-10-14
    • 2019-05-12
    • 2021-12-23
    相关资源
    最近更新 更多