我使用函数imdct在Scilab (相当于MATLAB)中编写JPEG压缩。在这个函数中使用的是openCV的DCT函数,我不知道在dct函数中使用的是哪个方程。
你可以在scilab中看到imdct的lenna,这是一个内部函数,而my_function的lenna是我的函数。
我将代码添加到scilab中
function vystup = dct_rovnice(vstup)
[M,N] = size(vstup)
for u=1:M
for v=1:N
cos_celkem = 0;
for m=1:M
for n=1:N
pom = double(vstup(m,n));
cos_citatel1 = cos(((2*m) * u * %pi)/(2*M));
cos_citatel2 = cos(((2*n) * v * %pi)/(2*N));
cos_celkem = cos_celkem + (pom * cos_citatel1 * cos_citatel2);
end
end
c_u = 0;
c_v = 0;
if u == 1 then
c_u = 1 / sqrt(2);
else
c_u = 1;
end
if v == 1 then
c_v = 1 / sqrt(2);
else
c_v = 1;
end
vystup(u,v) = (2/sqrt(n*m)) * c_u * c_v * cos_celkem;
end
end
endfunction
function vystup = dct_prevod(vstup)
Y = vstup(:,:,1);
Cb = vstup(:,:,2);
Cr = vstup(:,:,3);
[rows,columns]=size(vstup)
vystup = zeros(rows,columns,3)
for y=1:8:rows-7
for x=1:8:columns-7
blok_Y = Y(y:y+7,x:x+7)
blok_Cb = Cb(y:y+7,x:x+7)
blok_Cr = Cr(y:y+7,x:x+7)
blok_dct_Y = dct_rovnice(blok_Y)
blok_dct_Cb = dct_rovnice(blok_Cb)
blok_dct_Cr = dct_rovnice(blok_Cr)
vystup(y:y+7,x:x+7,1)= blok_dct_Y
vystup(y:y+7,x:x+7,2)= blok_dct_Cb
vystup(y:y+7,x:x+7,3)= blok_dct_Cr
end
end
vystup = uint8(vystup)
endfunction你可以看到方程式我用了EQUATION
发布于 2018-03-01 05:40:11
注意,dct函数有几种定义(DCT-I、DCT-II、DCT-III和DCT-IV标准化和非标准化)
此外,您是否尝试过Scilab内置函数dct (来自FFTW),它可以直接应用于图像。
发布于 2018-03-14 18:50:57
问题似乎在于使用不同的归一化结果系数。
OpenCV库使用此公式进行正向转换(在本例中为N=8):

基础g定义为

哪里

(对于难看的图像,很抱歉,但因此不提供任何排版公式的支持。)
https://stackoverflow.com/questions/48979328
复制相似问题