Contents

Problem 5 - Images

x = imread('E:\Math447\p5\pic.jpg');
x=x(:, 1:2560,:);
figure(1); imagesc(x);
title('Original image in color')

% Convert the image to grayscale
x=double(x);
r=x(:,:,1);g=x(:,:,2);b=x(:,:,3);
xgray=0.2126*r+0.7152*g+0.0722*b;
xgray=uint8(xgray);

% Initial C matrix
n=8;
for i=2:n
    for j=1:n
        C(i,j)=sqrt(2/n)*cos((i-1)*(j-1/2)*pi/n);
    end
end
C(1,1:n)=ones(1,n)/sqrt(n);

% Convert an 8*8 pixel block back to image
z8 = zeros(size(xgray)/8);
[mm,nn] = size(z8);
for i=1:mm;
    for j=1:nn;
        rb=r(i*8-7:i*8, j*8-7:j*8);   % red
        gb=g(i*8-7:i*8, j*8-7:j*8);   % green
        bb=b(i*8-7:i*8, j*8-7:j*8);   % blue

		% Conversion and centering
		rd=double(rb); rc=rd-128;
		gd=double(gb); gc=gd-128;
		bd=double(bb); bc=bd-128;

		% Apply the 2D-DCT
		ry=C*rc'*C';
        gy=C*gc'*C';
        by=C*bc'*C';

		% Quantization when p = 1
		p=1;
		Q=p*8./hilb(8);
		ryq=round(ry./Q);
		gyq=round(gy./Q);
		byq=round(by./Q);

		% Dequantization, inverse DCT and offset 128
		rydq=ryq.*Q;   rxdq=C'*rydq*C;   rxe=rxdq+128;
		gydq=gyq.*Q;   gxdq=C'*gydq*C;   gxe=gxdq+128;
		bydq=byq.*Q;   bxdq=C'*bydq*C;   bxe=bxdq+128;

		% Merge 8*8 pixel blocks
		Xe(i*8-7:i*8, j*8-7:j*8, 1)=rxe;
		Xe(i*8-7:i*8, j*8-7:j*8, 2)=gxe;
		Xe(i*8-7:i*8, j*8-7:j*8, 3)=bxe;
	end
end

% Image output
figure(2); imagesc(uint8(Xe));
title('Image when p = 1')

% Convert an 8*8 pixel block back to image
z8 = zeros(size(xgray)/8);
[mm,nn] = size(z8);
for i=1:mm;
    for j=1:nn;
        rb=r(i*8-7:i*8, j*8-7:j*8);   %red
        gb=g(i*8-7:i*8, j*8-7:j*8);   %green
        bb=b(i*8-7:i*8, j*8-7:j*8);   %blue

		% Conversion and centering
		rd=double(rb); rc=rd-128;
		gd=double(gb); gc=gd-128;
		bd=double(bb); bc=bd-128;

		% Apply the 2D-DCT
		ry=C*rc'*C';
        gy=C*gc'*C';
        by=C*bc'*C';

		% Quantization when p = 10
		p=10;
		Q=p*8./hilb(8);
		ryq=round(ry./Q);
		gyq=round(gy./Q);
		byq=round(by./Q);

		% Dequantization, inverse DCT and offset 128
		rydq=ryq.*Q;   rxdq=C'*rydq*C;   rxe=rxdq+128;
		gydq=gyq.*Q;   gxdq=C'*gydq*C;   gxe=gxdq+128;
		bydq=byq.*Q;   bxdq=C'*bydq*C;   bxe=bxdq+128;

		% Merge 8*8 pixel blocks
		Xe(i*8-7:i*8, j*8-7:j*8, 1)=rxe;
		Xe(i*8-7:i*8, j*8-7:j*8, 2)=gxe;
		Xe(i*8-7:i*8, j*8-7:j*8, 3)=bxe;
	end
end

% Image output
figure(3); imagesc(uint8(Xe));
title('Image when p = 10')

% Convert an 8*8 pixel block back to image
z8 = zeros(size(xgray)/8);
[mm,nn] = size(z8);
for i=1:mm;
    for j=1:nn;
        rb=r(i*8-7:i*8, j*8-7:j*8);   % red
        gb=g(i*8-7:i*8, j*8-7:j*8);   % green
        bb=b(i*8-7:i*8, j*8-7:j*8);   % blue

		% Conversion and centering
		rd=double(rb); rc=rd-128;
		gd=double(gb); gc=gd-128;
		bd=double(bb); bc=bd-128;

		% Apply the 2D-DCT
		ry=C*rc'*C';
        gy=C*gc'*C';
        by=C*bc'*C';

		% Quantization when p = 20
		p=20;
		Q=p*8./hilb(8);
		ryq=round(ry./Q);
		gyq=round(gy./Q);
		byq=round(by./Q);

		% Dequantization, inverse DCT and offset 128
		rydq=ryq.*Q;   rxdq=C'*rydq*C;   rxe=rxdq+128;
		gydq=gyq.*Q;   gxdq=C'*gydq*C;   gxe=gxdq+128;
		bydq=byq.*Q;   bxdq=C'*bydq*C;   bxe=bxdq+128;

		% Merge 8*8 pixel blocks
		Xe(i*8-7:i*8, j*8-7:j*8, 1)=rxe;
		Xe(i*8-7:i*8, j*8-7:j*8, 2)=gxe;
		Xe(i*8-7:i*8, j*8-7:j*8, 3)=bxe;
	end
end

% Image output
figure(4); imagesc(uint8(Xe));
title('Image when p = 20')