Дискретное косинусное преобразование (ДКП) изображения

Я работаю над функцией в 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

person user2827482    schedule 29.09.2013    source источник
comment
Ваш код работает с исправлением, указанным ниже. Но я предлагаю вам прочитать циклы, иначе у вас возникнут проблемы с работой с большим количеством данных.   -  person Mykola Servetnyk    schedule 16.12.2014


Ответы (1)


Во внутреннем цикле по x и y вы не читаете из правильного места в image_t. Вы скопировали локальный блок в место с k,l в качестве верхнего левого угла для использования в обработке, но во внутреннем цикле вы всегда читаете из того же блока, который начинается с 1,1, как верхний левый угол в image_t.

person mikeTronix    schedule 29.09.2013
comment
Спасибо за эту работу. У меня есть другой вопрос, пожалуйста. Если я хочу сделать idct сейчас, какие модификации я должен сделать. Вот мой код. - person user2827482; 29.09.2013
comment
Обратным DCT для вашего DCT типа II является DCT типа III. Достаточно просто немного изменить математику. См. разделы DCT-II и DCT-III по адресу: en.wikipedia.org/wiki/Discrete_cosine_transform. - person mikeTronix; 29.09.2013