【问题标题】:DCT equation in openCVopenCV中的DCT方程
【发布时间】:2018-02-25 22:49:28
【问题描述】:

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

lenna by imdct

lenna by my_function

您可以通过 imdct 看到 lenna,这是内部函数,而通过 my_function 看到的 lenna 是我在 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

【问题讨论】:

  • 嗨,欢迎来到 Stackoverflow。请在此guide 之后加强您的问题,以便我们为您提供帮助。很快,请详细说明以下几点: 1. 添加MWE,以便我们可以直接重现您的问题。 2. 添加 Scilab 的版本以及您使用的任何工具箱或脚本,这些工具箱或脚本未包含在 scilab 的默认版本中。 3. 此外,您可能需要重新表述您的问题,因为不清楚您是否需要有关编程或偏微分方程的帮助

标签: opencv compression jpeg scilab dct


【解决方案1】:

问题似乎在于对结果系数使用不同的归一化。

OpenCV 库使用这个方程进行正向变换(N=8,在你的情况下):

基础g定义为

在哪里

(对不起,丑陋的图像,但SO不提供任何排版方程的支持。)

【讨论】:

    【解决方案2】:

    注意 dct 函数有多种定义(DCT-I、DCT-II、DCT-III 和 DCT-IV 标准化和非标准化)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 2012-06-06
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多