%Buzási Bence
%TXEVVQ

img = imread('AlfredoBorba_TuscanLandscape.jpg');

QF = 100;
xmin = 0;
ymin = 0;
xmax = 8*floor(size(img,1)/8);
ymax = 8*floor(size(img,2)/8);

img_out = zeros(xmax, ymax, 3);
img_YCbCr = zeros(xmax, ymax, 3);

img = imcrop(img, [ymin xmin ymax xmax]);

kernel_matrix = TXEVVQ_kernel_creator();
kernel_inverse_matrix = TXEVVQ_kernel_inverse_creator();

for i = 0 : 8 : xmax-1
    for j = 0 : 8 : ymax-1
        window = img(i+1 : i+8, j+1 : j+8, :);
        [Y, Cb, Cr] = TXEVVQ_RGB_to_YCbCr(window);
        
        img_YCbCr(i+1 : i+8, j+1 : j+8, 1) = Y;
        img_YCbCr(i+1 : i+8, j+1 : j+8, 2) = Cb;
        img_YCbCr(i+1 : i+8, j+1 : j+8, 3) = Cr;
        
        [DCT_Y, DCT_Cb, DCT_Cr] = TXEVVQ_DCT(Y, Cb, Cr, kernel_matrix);
        [quantized_Y, quantized_Cb, quantized_Cr] = TXEVVQ_quantizer(DCT_Y, DCT_Cb, DCT_Cr, QF);
        [zigzag_Y, zigzag_Cb, zigzag_Cr] = TXEVVQ_zigzag(quantized_Y, quantized_Cb, quantized_Cr);
        [izigzag_Y, izigzag_Cb, izigzag_Cr] = TXEVVQ_izigzag(zigzag_Y, zigzag_Cb, zigzag_Cr);
        [reconstructed_Y, reconstructed_Cb, reconstructed_Cr]  = TXEVVQ_dequantizer(izigzag_Y, izigzag_Cb, izigzag_Cr, QF);
        [recomputed_Y, recomputed_Cb,recomputed_Cr]  = TXEVVQ_IDCT(reconstructed_Y, reconstructed_Cb, reconstructed_Cr, kernel_inverse_matrix);
        output = TXEVVQ_YCbCr_to_RGB(recomputed_Y, recomputed_Cb, recomputed_Cr);
        img_out(i+1 : i+8, j+1 : j+8, :) = output;
    end
end
%kernels
figure;
    for i = 1 : 8
        for j = 1 : 8
            subplot(8, 8, (i-1)*8+j);
            imshow(kernel_inverse_matrix(:,:,(i-1)*8 + j));
        end
    end
    
    figure;
    for i = 1 : 8
        for j = 1 : 8
            subplot(8, 8, (i-1)*8+j);
            surf(kernel_inverse_matrix(:,:,(i-1)*8 + j));
        end
    end

figure;
subplot(1,3,1);
imshow(uint8(img));
title('original img');
subplot(1,3,2);
imshow(uint8(img_YCbCr));
title('converted img');
subplot(1,3,3);
imshow(uint8(img_out));
title('uncompressed img');


