有没有办法从编码图像和视频中轻松提取DCT系数(和量化参数)?任何解码器软件都必须使用它们来解码块DCT编码的图像和视频.所以我很确定解码器知道它们是什么.有没有办法将它们暴露给使用解码器的人?
我正在实施一些直接在DCT域中工作的视频质量评估算法.目前,我的大部分代码都使用OpenCV,因此如果有人知道使用该框架的解决方案,那将会很棒.我不介意使用其他库(也许是libjpeg,但这似乎只适用于静止图像),但我主要担心的是尽可能少地执行格式化工作(我不想重新发明轮子并写入我自己的解码器).我希望能够打开OpenCV可以打开的任何视频/图像(H.264,MPEG,JPEG等),如果它是块DCT编码,则可以获得DCT系数.
在最坏的情况下,我知道我可以编写自己的块DCT代码,通过它运行解压缩的帧/图像,然后我将回到DCT域.这不是一个优雅的解决方案,我希望我能做得更好.
目前,我使用相当常见的OpenCV样板来打开图像:
IplImage *image = cvLoadImage(filename);
// Run quality assessment metric
Run Code Online (Sandbox Code Playgroud)
我用于视频的代码同样微不足道:
CvCapture *capture = cvCaptureFromAVI(filename);
while (cvGrabFrame(capture))
{
IplImage *frame = cvRetrieveFrame(capture);
// Run quality assessment metric on frame
}
cvReleaseCapture(&capture);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都获得了IplImageBGR格式的3通道.有什么方法可以得到DCT系数吗?
我已经实现了一种称为离散余弦变换的图像/视频变换技术.该技术用于MPEG视频编码.我的算法基于以下URL中提出的想法:
http://vsr.informatik.tu-chemnitz.de/~jan/MPEG/HTML/mpeg_tech.html
现在我可以变换黑白图像的8x8部分,例如:
0140 0124 0124 0132 0130 0139 0102 0088 0140 0123 0126 0132 0134 0134 0088 0117 0143 0126 0126 0133 0134 0138 0081 0082 0148 0126 0128 0136 0137 0134 0079 0130 0147 0128 0126 0137 0138 0145 0132 0144 0147 0131 0123 0138 0137 0140 0145 0137 0142 0135 0122 0137 0140 0138 0143 0112 0140 0138 0125 0137 0140 0140 0148 0143
在这个图像中,右上角有所有重要信息.转换后的块看起来像这样:
1041 0039 -023 0044 0027 0000 0021 -019 -050 0044 -029 0000 …
我正在寻找在Matlab中为Python实现的时间序列idealfilter的等价物.
我的目标是使用离散余弦变换实现理想滤波器,如在Python中的欧拉视频放大纸中使用,以便从标准视频获得人类的心跳.我正在使用他们的视频作为我的输入,我已经实现了带通滤波器方法,但我无法在我的脚本中找到理想的滤波器方法.
他们声称他们使用0.83 - 1.0Hz的DCT实现了理想的滤波器.
我的问题是Matlab中的理想滤波器接收截止频率作为输入,但我不认为它是用dct实现的.
相反,scipy.fftpack中的DCT滤波器不会将频率截止作为输入.
如果我必须在某种类型的继承中使用这些,请告诉我.
如果存在这样的函数等价物,我想尝试使用它以查看它是否产生与它们获得的结果类似的结果.
我介绍了如何在图像和视频压缩标准中使用DCT(离散余弦变换).
但是为什么DCT仅比dft或dst等其他变换更受欢迎?
在研究JPEG文件的这篇文章时,我在上述文件的第7.3节中遇到了" 八法则 ".
尽管使用SmartScale扩展引入了1到16的其他块大小,超出原始JPEG标准中的固定大小8,但事实仍然是8的块大小仍然是默认值,而所有其他大小的DCT根据标准8x8 DCT进行缩放.
" 八法则 "解释了为什么大小8是DCT大小的正确默认值和参考值.
我的问题是
从历史上看,是否进行了一项研究,评估了样本中的大量图像,得出的结论是8x8图像块包含足够的冗余数据以支持使用DCT的压缩技术?像8M(4Kx4K)这样非常大的图像尺寸在大多数数字图像/视频中迅速成为常态,这种假设是否仍然有效?
将宏块限制为8x8的另一个历史原因是较大宏块的计算上禁止的图像数据大小.使用现代超标量体系结构(例如CUDA),限制不再适用.
此前类似的问题存在- 1,2和3.但他们都没有打扰任何关于这个神秘的基本" 八法则 "的细节/链接/参考.
1.原始研究的参考/摘录/细节将受到高度赞赏,因为我想用具有非常大尺寸图像的现代数据集重复它以测试8x8宏块的最佳有效性.
2.如果最近进行了类似的研究,也欢迎提及它.
我确实理解SmartScale是有争议的.没有任何明显的潜在好处1,充其量只能与jpeg标准2的其他向后兼容扩展相媲美.我的目标是了解选择8x8作为DCT块大小(在jpeg图像压缩标准中)的原始原因是否仍然相关,因此我需要知道八个定律是什么.
我想在Python中对一个图像应用离散余弦变换(以及反向),我想知道最好的方法是什么以及如何做.我看过PIL和OpenCV,但我仍然不明白如何使用它.
我试图在C中实现正向和反向离散余弦变换(DCT).代码是通过dct()函数将单个输入像素块转换为变换矩阵,然后通过idct返回到原始像素值( )功能.请参阅附带的代码.我的输出形式idct是连续值244,116,244,116等.从idct值的外观,它看起来不像我的程序工作..有人可以帮助我,让我知道结果是什么应该期待每个功能后?显然,在idct之后,我应该得到prety接近原始输入矩阵.
谢谢
# include <stdio.h>
# define PI 3.14
void dct(float [][]); // Function prototypes
void idct(float [][]); // Function prototypes
void dct(float inMatrix[8][8]){
double dct,
Cu,
sum,
Cv;
int i,
j,
u,
h = 0,
v;
FILE * fp = fopen("mydata.csv", "w");
float dctMatrix[8][8],
greyLevel;
for (u = 0; u < 8; ++u) {
for (v = 0; v < 8; ++v) {
if (u == 0) {
Cu = 1.0 / sqrt(2.0);
} else {
Cu = …Run Code Online (Sandbox Code Playgroud) 这里我的DCT算法类有"applyDCT"和"applyIDCT"方法.技术上,在0到255之间的2x2随机整数表上进行正向DCT(离散余弦变换)之后,然后立即对这些数字进行反向DCT,我们应该回到我们首先得到的原始整数.就我而言,情况并非如此.我在这做错了什么?
public class DCT {
private static final int N = 2;
private double[] c = new double[N];
public DCT() {
this.initializeCoefficients();
}
private void initializeCoefficients() {
for (int i=1;i<N;i++) {
c[i]=1;
}
c[0]=1/Math.sqrt(2.0);
}
public double[][] applyDCT(double[][] f) {
double[][] F = new double[N][N];
for (int u=0;u<N;u++) {
for (int v=0;v<N;v++) {
double sum = 0.0;
for (int i=0;i<N;i++) {
for (int j=0;j<N;j++) {
sum+=Math.cos(((2*i+1)/(2.0*N))*u*Math.PI)*Math.cos(((2*j+1)/(2.0*N))*v*Math.PI)*f[i][j];
}
}
sum*=((c[u]*c[v])/4.0);
F[u][v]=sum;
}
}
return F;
}
public double[][] applyIDCT(double[][] F) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用python实现JPEG压缩.当我尝试对tiff图像应用DCT,量化,IDCT过程时,我发现scipy.fftpack.dct/idct有些奇怪.
由于scipy包中只有1D dct/idct,所以我正在为2D dct做这个
import numpy as np
from scipy.fftpack import dct, idct
def dct2(block):
return dct(dct(block.T).T)
def idct2(block):
return idct(idct(block.T).T)
Run Code Online (Sandbox Code Playgroud)
我使用简单的3x3矩阵测试了2D dct/idct.我希望在这个测试用例中得到一个True矩阵.
a = np.random.randint(0,255,9).reshape(3,3)
print a == idct2(dct2(a))
Run Code Online (Sandbox Code Playgroud)
然而事实证明,在idct2(dct2(a))之后,结果通过与原始矩阵相比的常数因子来缩放.
我想问一下是否有办法实现一组2D dct/idct,这样在idct(dct(a))操作之后我可以获得与输入相同的输出.