使用Rprof显示dtt包中的dct是一段运行速度非常慢的R代码中的主要攻击者.在stats包中交换它为fft(这不是相同的转换,但应该花费相同的时间来计算)我的运行时间显着改善.事实上,我的Rprof线路中有2/3是先前的dct呼叫,而且在进行切换后仅有3行约600个fft呼叫.
dtt包中的dct实现是不是使用快速离散傅立叶变换完成的?如果是这样,是否有一个包有一个?(我知道可以将数据加倍,然后从那些fft系数中提取dct的系数,但是直接的快速dct肯定会更好,并且确实应该在某个地方).
我想使用scipy的DCT-II,因为它已经编码并且速度很快.看一下这个文档,它似乎是一维实现.是否可以以这种方式使用它作为3D实现?我不确定数学.2D和3D实现相当于在计算中使用不同尺寸乘以1D的2或3倍?
我已经在 Google 上搜索了一段时间,想找到一个相当高效的 8x8(或 nxn)DCT 算法的伪代码,但我找不到任何东西!
我采用了幼稚的方法,并且执行起来花费了太长时间。
如果您可以发布一些伪代码或参考一本好书/文档/网站,那将会很有帮助。
C 或 C++ 示例会更好!
JPEG压缩过程中生成DCT系数的标准方程为DCT公式:

我知道这个实现很昂贵(慢),而且有更快的方法。这种生成 DCT 系数的更快方法是否有明确的公式?
我在Matlab中使用一个函数来计算图像的DCT(离散余弦变换).我不知道我的代码中有什么不起作用,但我得到了一个具有相同编号的输出图像.我想在DCT中使用这个公式.
请任何想法.
function image_comp = dctII(image, b)
[h w] = size(image);
image = double(image) - 128;
block = zeros(b,b);
image_t=zeros(size(image));
for k=1:b:h
for l=1:b:w
image_t(k:k+b-1,l:l+b-1)= image(k:k+b-1,l:l+b-1);
for u=1:b
for v=1:b
if u == 0
Cu = 1/sqrt(2);
else
Cu = 1;
end
if v == 0
Cv = 1/sqrt(2);
else
Cv = 1;
end
Res_sum=0;
for x=1:b;
for y=1:b
Res_sum = Res_sum + ((image_t(x,y))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b)));
end
end
dct= (1/4)*Cu*Cv*Res_sum;
block(u,v) = dct;
end
end
image_comp(k:k+b-1,l:l+b-1)=block(u,v);
end
end
end
Run Code Online (Sandbox Code Playgroud) 我正在使用ImageHash库来生成图像的感知哈希。该库声称能够生成不同大小的哈希值(64、128、256),但我不知道如何获得 128 哈希值。
哈希大小由库重新缩放时的图像大小决定,例如:
def average_hash(image, hash_size=8):
image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS)
Run Code Online (Sandbox Code Playgroud)
这里的默认值为 8(8x8 图像 = 64 像素 -> 灰度 -> 64 位)。
然而,128 位哈希值是如何创建的呢?
第二件事,pHash 的默认大小是 32,如此处所述,但稍后将仅计算左上角 8x8 部分的 DCT,因此又是 64 位。DCT 的计算方法为scipy.fftpack:
def phash(image, hash_size=32):
image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS)
pixels = numpy.array(image.getdata(), dtype=numpy.float).reshape((hash_size, hash_size))
dct = scipy.fftpack.dct(pixels)
dctlowfreq = dct[:8, 1:9]
avg = dctlowfreq.mean()
diff = dctlowfreq > avg
return ImageHash(diff)
Run Code Online (Sandbox Code Playgroud)
如何更改哈希大小?
无论使用哪个值,计算将始终基于左上角 8x8,因此始终为 64!
发生的奇怪的事情是,如果我从 8 大小的 pHash 开始(从头开始调整图像大小),我得到 56 …
我试图了解块大小的影响和选择DCT压缩系数的最佳策略.基本上我想问一下我在这里写的内容:
让我们假设最原始的压缩.制作图像块.在每个博客上执行DCT并清零一些系数.
根据我的理解,块越小越好.较小的块意味着像素更相关,因此DCT光谱中的能量更"紧凑".在快速变化的图像(高频)中应该更加强调.
假设我们将一定百分比的系数归零,那么什么会产生最佳图像质量,小块或大块?假设我们保持10%,25%,50%,75%,你会说这是不同百分比的不同答案吗?
另一个问题是如何选择不受影响的系数.我要说我必须根据地点而不是能源做出决定.你会从左上角拿一个方格吗?我已经在DCT频谱中平均了很多块,并得出结论最好的是从左上角取三角形.你怎么看?
希望我们能够进行有效的讨论.
假设您使用dct函数,然后不对数据进行操作并使用反转变换; 倒置数据不会与预转换数据相同吗?为什么浮点问题?是报告的问题还是正常行为?
In [21]: a = [1.2, 3.4, 5.1, 2.3, 4.5]
In [22]: b = dct(a)
In [23]: b
Out[23]: array([ 33. , -4.98384545, -4.5 , -5.971707 , 4.5 ])
In [24]: c = idct(b)
In [25]: c
Out[25]: array([ 12., 34., 51., 23., 45.])
Run Code Online (Sandbox Code Playgroud)
任何人都有解释为什么?当然,一个简单的c*10**-1方法可以解决这个问题,但是如果你重复调用函数来在几个维度上使用它,那么错误就会变大:
In [37]: a = np.random.rand(3,3,3)
In [38]: d = dct(dct(dct(a).transpose(0,2,1)).transpose(2,1,0)).transpose(2,1,0).transpose(0,2,1)
In [39]: e = idct(idct(idct(d).transpose(0,2,1)).transpose(2,1,0)).transpose(2,1,0).transpose(0,2,1)
In [40]: a
Out[40]:
array([[[ 0.48709809, 0.50624831, 0.91190972],
[ 0.56545798, 0.85695062, 0.62484782],
[ 0.96092354, 0.17453537, 0.17884233]],
[[ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 1D DCT 运算对图像实施 2D 离散余弦变换。如果我将其与dct2MATLAB 函数进行比较,我的输出是不正确的。我不明白我的代码出了什么问题以及发生在哪里。
如果有人可以指出错误或任何其他建议,那将非常有帮助。
这是我用 MATLAB 编写的代码
% main function
signal=rand(100);
signal_dct=myDCT(signal);
figure; imshow((signal_dct));
% function to calculate 2D DCT of an image
function res=myDCT(signal)
signal=double(signal);
l=size(signal,1);
res=zeros(l); %initialize the final result matrix
for k=1:l %calculate 1D DCT of each row of image
res(k,:)=mdct(signal(k,:));
end
for k=1:l %calculate 1D DCT of each column of image
res(:,k)=mdct(res(:,k));
end
end
%% function to calculate 1D DFT of a 1D signal
function res=mdct(signal)
l=size(signal,1);
for i=1:l
if …Run Code Online (Sandbox Code Playgroud)