如何在Python中使用OpenCV获取图像的DCT

4 投票
2 回答
11120 浏览
提问于 2025-04-17 19:34

我一直在尝试找出如何对图像进行离散余弦变换(DCT)。在获取图像并进行了一些过滤后,我想计算DCT。以下是我的代码片段:

imgcv1 = cv2.split(imgcv)[0] 
cv2.boxFilter(imgcv1, 0, (7,7), imgcv1, (-1,-1), False, cv2.BORDER_DEFAULT)
#resize image to 32x32
cv2.resize( imgcv1, (32, 32 ) ,imgcv1)

我试着按照这里的描述进行操作,但没有成功。当我尝试类似这样的代码时:

dst = cv2.dct(imgcv1)

我遇到了一个错误,错误信息是:

cv2.error: /build/buildd/opencv-2.3.1/modules/core/src/dxt.cpp:2247: error: (-215) type == CV_32FC1 || type == CV_64FC1 in function dct

从错误信息来看,我理解到输入的数据不是32位浮点数,而是8位的。我该如何转换它,并把它作为32位浮点数传递呢?我不太确定问题出在哪里。非常感谢你的帮助。我该如何获得DCT呢?我对openCV和python还很陌生。我在其他2、3个相关的讨论中搜索过,但都没有解决我的问题。

2 个回答

0

假设你的图像是灰度的,这个函数在计算离散余弦变换(DCT)时效果很好。

import cv2 as cv2
import numpy as np

def doDct(inputMatrix):
    fltMatrix = np.float32(inputMatrix)/255.0
    fltDct = cv2.dct(fltMatrix)
    return np.uint8(fltMatrix * 255)
2

我找到了解决办法。正如我所说,我们需要把数据转换成浮点数,而且这个浮点数的范围要在0到1之间。然后在计算完DCT之后,我们可以再把它转换回来:

imf = np.float32(imgcv1)/255.0  # float conversion/scale
dct = cv2.dct(imf)              # the dct
imgcv1 = np.uint8(dct*255.0)    # convert back to int

撰写回答