openCV中的DCT方程

问题描述 投票:0回答:2

我使用函数imdct在Scilab(相当于MATLAB)中编写JPEG压缩。在这个函数中使用了来自openCV的函数DCT,我不知道在dct函数中使用了哪个等式。

lenna by imdct

lenna by my_function

您可以通过imdct看到lenna是内部函数,而lenna是my_function是我在scilab中的函数。

我在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的等式

opencv compression jpeg scilab dct
2个回答
0
投票

注意dct功能有几种定义(DCT-I,DCT-II,DCT-III和DCT-IV归一化和非规范化)

此外,您是否尝试过Scilab内置函数dct(来自FFTW),它可以直接应用于图像。


0
投票

问题似乎在于使用所得系数的不同归一化。

OpenCV库使用此等式进行正向变换(在您的情况下为N=8):

forward transform

基础g定义为

transform basis

哪里

lambda

(很抱歉这些丑陋的图像,但是SO并没有为排版公式提供任何支持。)

© www.soinside.com 2019 - 2024. All rights reserved.