Project 5 - Image Compression
Matthew Herman
Contents
- Computer Problems 11.2 #3-6
- 11.2 Computer Problem 3
- Obtain a grayscale image file of your choice, and use the imread command to import into MATLAB. Crop the resulting matrix so into MATLAB. Crop the resulting matrix so that each dimension is a multiple of 8. If necessary, converting a color RGB image to gray scale can be accomplished by the standard formula (11.15).
- (a) Extract an 8 × 8 pixel block, for example, by using the MATLAB command xb=x(81:88,81:88). Display the block with the imagesc command.
- (b) Apply the 2D-DCT.
- (c) Quantize by using linear quantization with p = 1,2, and 4. Print out each YQ.
- (d) Reconstruct the block by using the inverse 2D-DCT, and compare with the original. Use MATLAB commands colormap(gray) and imagesc(X,[0 255]).
- (e) Carry out (a)–(d) for all 8 × 8 blocks, and reconstitute the image in each case.
- 11.2 Computer Problem
- Carry out the steps of Computer Problem 3, but quantize by the JPEG-suggested matrix (11.25) with p = 1.
- compress with JPEG matrix
- 11.2 Computer Problem
- Obtain a color image file of your choice. Carry out the steps of Computer Problem 3 for colors R, G, and B separately, using linear quantization, and recombine as a color image.
- RGB with JPEG matrix
- 6. Obtain a color image, and transform the RGB values to luminance/color difference coordinates. Carry out the steps of Computer Problem 3 for Y , U, and V separately by using JPEG quantization, and recombine as a color image.
- Trying with larger image (1200x1200)
Computer Problems 11.2 #3-6
11.2 Computer Problem 3
Obtain a grayscale image file of your choice, and use the imread command to import into MATLAB. Crop the resulting matrix so into MATLAB. Crop the resulting matrix so that each dimension is a multiple of 8. If necessary, converting a color RGB image to gray scale can be accomplished by the standard formula (11.15).
x = imread('boat.png'); figure(1) imagesc(x) title('Original image 512x512')
(a) Extract an 8 × 8 pixel block, for example, by using the MATLAB command xb=x(81:88,81:88). Display the block with the imagesc command.
% Full image figure(2) 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); imagesc(xgray); colormap(gray); title('Image in grayscale') % 8x8 image figure(3) xb=x(81:88,81:88);
(b) Apply the 2D-DCT.
f1 = @fun_dct; C = f1(xb) % function C=fun_dct(X) % [m,n]=size(X);n=m; % 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);
C =
Columns 1 through 7
0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536
0.4904 0.4157 0.2778 0.0975 -0.0975 -0.2778 -0.4157
0.4619 0.1913 -0.1913 -0.4619 -0.4619 -0.1913 0.1913
0.4157 -0.0975 -0.4904 -0.2778 0.2778 0.4904 0.0975
0.3536 -0.3536 -0.3536 0.3536 0.3536 -0.3536 -0.3536
0.2778 -0.4904 0.0975 0.4157 -0.4157 -0.0975 0.4904
0.1913 -0.4619 0.4619 -0.1913 -0.1913 0.4619 -0.4619
0.0975 -0.2778 0.4157 -0.4904 0.4904 -0.4157 0.2778
Column 8
0.3536
-0.4904
0.4619
-0.4157
0.3536
-0.2778
0.1913
-0.0975
(c) Quantize by using linear quantization with p = 1,2, and 4. Print out each YQ.
p = 1; Q1 = p*8./hilb(8); p = 2; Q2 = p*8./hilb(8); p = 4; Q4 = p*8./hilb(8); Xd=double(xb); Xc=Xd-128; Y=C*Xc*C'; Q1 Yq1=round(Y./Q1) Q2 Yq2=round(Y./Q2) Q4 Yq4=round(Y./Q4)
Q1 =
8 16 24 32 40 48 56 64
16 24 32 40 48 56 64 72
24 32 40 48 56 64 72 80
32 40 48 56 64 72 80 88
40 48 56 64 72 80 88 96
48 56 64 72 80 88 96 104
56 64 72 80 88 96 104 112
64 72 80 88 96 104 112 120
Yq1 =
-114 1 0 0 0 0 0 0
-2 0 -1 0 0 0 0 0
0 1 0 -1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Q2 =
16 32 48 64 80 96 112 128
32 48 64 80 96 112 128 144
48 64 80 96 112 128 144 160
64 80 96 112 128 144 160 176
80 96 112 128 144 160 176 192
96 112 128 144 160 176 192 208
112 128 144 160 176 192 208 224
128 144 160 176 192 208 224 240
Yq2 =
-57 1 0 0 0 0 0 0
-1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Q4 =
32 64 96 128 160 192 224 256
64 96 128 160 192 224 256 288
96 128 160 192 224 256 288 320
128 160 192 224 256 288 320 352
160 192 224 256 288 320 352 384
192 224 256 288 320 352 384 416
224 256 288 320 352 384 416 448
256 288 320 352 384 416 448 480
Yq4 =
-29 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
(d) Reconstruct the block by using the inverse 2D-DCT, and compare with the original. Use MATLAB commands colormap(gray) and imagesc(X,[0 255]).
imagesc(xb); colormap(gray); title('8x8 block of grayscale image') Ydq1=Yq1.*Q1; Xdq1=C'*Ydq1*C; Xe1=Xdq1+128; Xf1=uint8(Xe1); Ydq2=Yq2.*Q2; Xdq2=C'*Ydq2*C; Xe2=Xdq2+128; Xf2=uint8(Xe2); Ydq4=Yq4.*Q4; Xdq4=C'*Ydq4*C; Xe4=Xdq4+128; Xf4=uint8(Xe4); figure(4) imagesc(Xf1) colormap(gray) title('Grayscale block p=1') figure(5) imagesc(Xf2) colormap(gray) title('Grayscale block p=2') figure(6) imagesc(Xf4) colormap(gray) title('Grayscale block p=4')
(e) Carry out (a)–(d) for all 8 × 8 blocks, and reconstitute the image in each case.
function Xf=compress(image,p) % x == image file x = imread(image); % p == loss parameter [m,n]=size(x);n=m; Q = p*8./hilb(8); x = double(x); r = x(:,:,1); g = x(:,:,2); b = x(:,:,3); xgray=0.2126*r+0.7152*g+0.0722*b; for i = 1:8:m for j = 1:8:n Xb = xgray(i:i+7,j:j+7); C = fun_dct(Xb); Xd=double(Xb); Xc=Xd-128; Y=C*Xc*C'; Yq=round(Y./Q); Ydq = Yq.*Q; Xd = C'*Ydq*C; Xe=Xd+128; Xf(i:i+7,j:j+7)=Xe; end end imagesc(uint8(Xf)) colormap(gray)
figure(7) p1 = compress('boat.png',1); title('Grayscale p=1') figure(8) p2 = compress('boat.png',2); title('Grayscale p=2') figure(9) p4 = compress('boat.png',4); title('Grayscale p=4') figure(10) p16 = compress('boat.png',16); title('Grayscale p=16')
11.2 Computer Problem
Carry out the steps of Computer Problem 3, but quantize by the JPEG-suggested matrix (11.25) with p = 1.
compress with JPEG matrix
function Xf=compressJPEG(image,p) % x == image file x = imread(image); % p == loss parameter [m,n]=size(x);n=m; Qy=p*[16 11 10 16 24 40 51 61; ... 12 12 14 19 26 58 60 55; ... 14 13 16 24 40 57 69 56; ... 14 17 22 29 51 87 80 62; ... 18 22 37 56 68 109 103 77; ... 24 35 55 64 81 104 113 92; ... 49 64 78 87 103 121 120 101; ... 72 92 95 98 112 100 103 99]; x = double(x); r = x(:,:,1); g = x(:,:,2); b = x(:,:,3); xgray=0.2126*r+0.7152*g+0.0722*b; for i = 1:8:m for j = 1:8:n Xb = xgray(i:i+7,j:j+7); C = fun_dct(Xb); Xd=double(Xb); Xc=Xd-128; Y=C*Xc*C'; Yq=round(Y./Qy); Ydq = Yq.*Qy; Xd = C'*Ydq*C; Xe=Xd+128; Xf(i:i+7,j:j+7)=Xe; end end imagesc(uint8(Xf)) colormap(gray)
figure(11) JPEG1 = compressJPEG('boat.png',1); title('JPEG p=1') figure(12) JPEG2 = compressJPEG('boat.png',2); title('JPEG p=2') figure(13) JPEG4 = compressJPEG('boat.png',4); title('JPEG p=4') figure(14) JPEG16 = compressJPEG('boat.png',16); title('JPEG p=16')
11.2 Computer Problem
Obtain a color image file of your choice. Carry out the steps of Computer Problem 3 for colors R, G, and B separately, using linear quantization, and recombine as a color image.
function Xf=compressRGB(image,p) % x == image file x = imread(image); % p == loss parameter [m,n]=size(x);n=m; Q = p*8./hilb(8); x = double(x);
r = x(:,:,1); g = x(:,:,2); b = x(:,:,3);
for i = 1:8:m for j = 1:8:n Xr = r(i:i+7,j:j+7); Xg = g(i:i+7,j:j+7); Xb = b(i:i+7,j:j+7);
Cr = fun_dct(Xr);
Cg = fun_dct(Xg);
Cb = fun_dct(Xb); Xdr = double(Xr);
Xdg = double(Xg);
Xdb = double(Xb); Xcr = Xdr-128;
Xcg = Xdg-128;
Xcb = Xdb-128; Yr = Cr*Xcr*Cr';
Yg = Cg*Xcg*Cg';
Yb = Cb*Xcb*Cb'; Yqr = round(Yr./Q);
Yqg = round(Yg./Q);
Yqb = round(Yb./Q); Ydqr = Yqr.*Q;
Ydqg = Yqg.*Q;
Ydqb = Yqb.*Q; Xdr = Cr'*Ydqr*Cr;
Xdg = Cg'*Ydqg*Cg;
Xdb = Cb'*Ydqb*Cb; Xer = Xdr+128;
Xeg = Xdg+128;
Xeb = Xdb+128; Xf(i:i+7,j:j+7,1) = Xer;
Xf(i:i+7,j:j+7,2) = Xeg;
Xf(i:i+7,j:j+7,3) = Xeb;
end
end
imagesc(uint8(Xf))x = imread('boat.png'); figure(15) imagesc(x) title('Original color image 512x512') figure(16) RGB1 = compressRGB('boat.png',1); title('RGB p=1') figure(17) RGB2 = compressRGB('boat.png',2); title('RGB p=2') figure(18) RGB4 = compressRGB('boat.png',4); title('RGB p=4') figure(19) RGB16 = compressRGB('boat.png',16); title('RGB p=16')
RGB with JPEG matrix
function Xf=compressJPEGRGB(image,p) % x == image file x = imread(image); % p == loss parameter [m,n]=size(x);n=m; Q=p*[16 11 10 16 24 40 51 61; ... 12 12 14 19 26 58 60 55; ... 14 13 16 24 40 57 69 56; ... 14 17 22 29 51 87 80 62; ... 18 22 37 56 68 109 103 77; ... 24 35 55 64 81 104 113 92; ... 49 64 78 87 103 121 120 101; ... 72 92 95 98 112 100 103 99]; x = double(x);
r = x(:,:,1); g = x(:,:,2); b = x(:,:,3);
for i = 1:8:m for j = 1:8:n Xr = r(i:i+7,j:j+7); Xg = g(i:i+7,j:j+7); Xb = b(i:i+7,j:j+7);
Cr = fun_dct(Xr);
Cg = fun_dct(Xg);
Cb = fun_dct(Xb); Xdr = double(Xr);
Xdg = double(Xg);
Xdb = double(Xb); Xcr = Xdr-128;
Xcg = Xdg-128;
Xcb = Xdb-128; Yr = Cr*Xcr*Cr';
Yg = Cg*Xcg*Cg';
Yb = Cb*Xcb*Cb'; Yqr = round(Yr./Q);
Yqg = round(Yg./Q);
Yqb = round(Yb./Q); Ydqr = Yqr.*Q;
Ydqg = Yqg.*Q;
Ydqb = Yqb.*Q; Xdr = Cr'*Ydqr*Cr;
Xdg = Cg'*Ydqg*Cg;
Xdb = Cb'*Ydqb*Cb; Xer = Xdr+128;
Xeg = Xdg+128;
Xeb = Xdb+128; Xf(i:i+7,j:j+7,1) = Xer;
Xf(i:i+7,j:j+7,2) = Xeg;
Xf(i:i+7,j:j+7,3) = Xeb;
end
end
imagesc(uint8(Xf))figure(20) JPEGRGB1 = compressJPEGRGB('boat.png',1); title('JPEG RGB p=1') figure(21) JPEGRGB2 = compressJPEGRGB('boat.png',2); title('JPEG RGB p=2') figure(22) JPEGRGB4 = compressJPEGRGB('boat.png',4); title('JPEG RGB p=4') figure(23) JPEGRGB16 = compressJPEGRGB('boat.png',16); title('JPEG RGB p=16')
6. Obtain a color image, and transform the RGB values to luminance/color difference coordinates. Carry out the steps of Computer Problem 3 for Y , U, and V separately by using JPEG quantization, and recombine as a color image.
function Xf=compressYUV(image,p) % x == image file x = imread(image); % p == loss parameter [m,n]=size(x);n=m; Q=p*[16 11 10 16 24 40 51 61; ... 12 12 14 19 26 58 60 55; ... 14 13 16 24 40 57 69 56; ... 14 17 22 29 51 87 80 62; ... 18 22 37 56 68 109 103 77; ... 24 35 55 64 81 104 113 92; ... 49 64 78 87 103 121 120 101; ... 72 92 95 98 112 100 103 99]; x = double(x);
r = x(:,:,1); g = x(:,:,2); b = x(:,:,3);
Y = 0.299*r+0.587*g+0.144*b; U = b - Y; V = r - Y;
for i = 1:8:m for j = 1:8:n XY = Y(i:i+7,j:j+7); XU = U(i:i+7,j:j+7); XV = V(i:i+7,j:j+7);
CY = fun_dct(XY);
CU = fun_dct(XU);
CV = fun_dct(XV); XdY = double(XY);
XdU = double(XU);
XdV = double(XV); XcY = XdY-128;
XcU = XdU-128;
XcV = XdV-128; YY = CY*XcY*CY';
YU = CU*XcU*CU';
YV = CV*XcV*CV'; YqY = round(YY./Q);
YqU = round(YU./Q);
YqV = round(YV./Q); YdqY = YqY.*Q;
YdqU = YqU.*Q;
YdqV = YqV.*Q; XdY = CY'*YdqY*CY;
XdU = CU'*YdqU*CU;
XdV = CV'*YdqV*CV; XeY = XdY+128;
XeU = XdU+128;
XeV = XdV+128; %red
R = XeY + XeV;
%blue
B = XeU + XeY;
%green
G = (XeY - 0.299*R - 0.114*B)/0.587; Xf(i:i+7,j:j+7,1) = R;
Xf(i:i+7,j:j+7,2) = G;
Xf(i:i+7,j:j+7,3) = B;
end
end
imagesc(uint8(Xf))figure(24) YUV1 = compressYUV('boat.png',1); title('YUV p=1') figure(25) YUV2 = compressYUV('boat.png',2); title('YUV p=2') figure(26) YUV4 = compressYUV('boat.png',4); title('YUV p=4') figure(27) YUV16 = compressYUV('boat.png',16); title('YUV p=16')
Trying with larger image (1200x1200)
figure(28) x = imread('trees.png'); imagesc(x) title('Original color image 1200x1200') figure(29) bigYUV1 = compressYUV('trees.png',1); title('YUV p=1') figure(30) bigYUV2 = compressYUV('trees.png',2); title('YUV p=2') figure(31) bigYUV4 = compressYUV('trees.png',4); title('YUV p=4') figure(32) bigYUV16 = compressYUV('trees.png',16); title('YUV p=16')