Image Compression
Group Members: James Aviles
Assignment following 'Project A' on Timothy Sauer's Website
Contents
Code used
Code to compress with JPEG Quantization matrix
Code to compress with Linear Quantization matrix
Code to compress color image with Linear Quantization
Code to compress color image in luminace / color difference coordinates using JPEG quantization
Computer problem 3 Part A
extract 8x8 block from image
X = imread('tago.png'); % assign image to variable X = double(X); % make the matrix a double r = X(:,:,1); % Seperate the RGB values g = X(:,:,2); b = X(:,:,3); X = 0.216*r + 0.7152*g + 0.0722*b; %converts to grey xb = X(81:88,81:88); % take a block from the image imagesc(uint8(xb)); colormap(gray) % display that block % note: uint8() converts back from % double to integer
Part B
apply 2D-DCT
C = dct(xb); % Define matrix C to the size xb xc = C*xb*C'; % Perform 2D-DCT imagesc(uint8(xc)); colormap(gray) % display new block
Part C + D + E
Part C: Quantisize using Linear Quantization with p = 1,2,4 print out each YQ
Part D: reconstruct block with inverse 2D-DCT
Part E: reconstruct image and compare
Q = [8 16 24 32 40 48 56 64 %Linear Quantiziation matrix 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]; Q = 1 * Q; % multiply by p value xc = quant(xb,C,Q) %Quantisize xc = dequant(xc,C,Q) %Dequantisize imagesc(uint8(xc)); colormap(gray) %Display block
xc =
-105 2 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
xc =
Columns 1 through 7
31.3222 30.4776 28.9169 26.8777 24.6705 22.6313 21.0706
30.8999 30.0553 28.4945 26.4553 24.2482 22.2090 20.6482
30.1195 29.2749 27.7142 25.6750 23.4678 21.4286 19.8679
29.1000 28.2553 26.6946 24.6554 22.4482 20.4090 18.8483
27.9964 27.1517 25.5910 23.5518 21.3446 19.3054 17.7447
26.9768 26.1321 24.5714 22.5322 20.3250 18.2858 16.7251
26.1964 25.3518 23.7910 21.7518 19.5447 17.5055 15.9447
25.7741 24.9294 23.3687 21.3295 19.1223 17.0831 15.5224
Column 8
20.2259
19.8036
19.0232
18.0036
16.9000
15.8805
15.1001
14.6778
defining C, quantisizing, and dequantisizing are condensed into the image compression function imagecomp(X,Q)
imglinear('file',P) is a function that iterates through all the steps using the linear quantization matrix for Q and allows to do so with a chosen file and 'P' value. Looping through the whole file compressing block by block
Code to compress with Linear Quantization matrix
Y1 = imglinear('tago.png',1);
yb1 = Y1(81:88,81:88);
Q =
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
imagesc(uint8(yb1)); colormap(gray)
Y2 = imglinear('tago.png',2);
yb2 = Y2(81:88,81:88);
Q =
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
imagesc(uint8(yb2)); colormap(gray)
Y4 = imglinear('tago.png',4);
yb4 = Y4(81:88,81:88);
Q =
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
imagesc(uint8(yb4)); colormap(gray)
Y1 = imglinear('tago.png',8);
yb1 = Y1(81:88,81:88);
Q =
64 128 192 256 320 384 448 512
128 192 256 320 384 448 512 576
192 256 320 384 448 512 576 640
256 320 384 448 512 576 640 704
320 384 448 512 576 640 704 768
384 448 512 576 640 704 768 832
448 512 576 640 704 768 832 896
512 576 640 704 768 832 896 960
imagesc(uint8(yb1)); colormap(gray)
Y2 = imglinear('tago.png',16);
yb2 = Y2(81:88,81:88);
Q =
Columns 1 through 6
128 256 384 512 640 768
256 384 512 640 768 896
384 512 640 768 896 1024
512 640 768 896 1024 1152
640 768 896 1024 1152 1280
768 896 1024 1152 1280 1408
896 1024 1152 1280 1408 1536
1024 1152 1280 1408 1536 1664
Columns 7 through 8
896 1024
1024 1152
1152 1280
1280 1408
1408 1536
1536 1664
1664 1792
1792 1920
imagesc(uint8(yb2)); colormap(gray)
Y2 = imglinear('tago.png',32);
yb2 = Y2(81:88,81:88);
Q =
Columns 1 through 6
256 512 768 1024 1280 1536
512 768 1024 1280 1536 1792
768 1024 1280 1536 1792 2048
1024 1280 1536 1792 2048 2304
1280 1536 1792 2048 2304 2560
1536 1792 2048 2304 2560 2816
1792 2048 2304 2560 2816 3072
2048 2304 2560 2816 3072 3328
Columns 7 through 8
1792 2048
2048 2304
2304 2560
2560 2816
2816 3072
3072 3328
3328 3584
3584 3840
imagesc(uint8(yb2)); colormap(gray)
Computer Problem 4
repeat with JPEG Quantization for p = 1
Code to compress with JPEG Quantization matrix
YJ = imgjpeg('tago.png',1);
ybJ = YJ(81:88,81:88);
Q =
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
imagesc(uint8(ybJ)); colormap(gray)
YJ = imgjpeg('tago.png',2);
ybJ = YJ(81:88,81:88);
Q =
32 22 20 32 48 80 102 122
24 24 28 38 52 116 120 110
28 26 32 48 80 114 138 112
28 34 44 58 102 174 160 124
36 44 74 112 136 218 206 154
48 70 110 128 162 208 226 184
98 128 156 174 206 242 240 202
144 184 190 196 224 200 206 198
imagesc(uint8(ybJ)); colormap(gray)
YJ = imgjpeg('tago.png',4);
ybJ = YJ(81:88,81:88);
Q =
64 44 40 64 96 160 204 244
48 48 56 76 104 232 240 220
56 52 64 96 160 228 276 224
56 68 88 116 204 348 320 248
72 88 148 224 272 436 412 308
96 140 220 256 324 416 452 368
196 256 312 348 412 484 480 404
288 368 380 392 448 400 412 396
imagesc(uint8(ybJ)); colormap(gray)
YJ = imgjpeg('tago.png',8);
ybJ = YJ(81:88,81:88);
Q =
128 88 80 128 192 320 408 488
96 96 112 152 208 464 480 440
112 104 128 192 320 456 552 448
112 136 176 232 408 696 640 496
144 176 296 448 544 872 824 616
192 280 440 512 648 832 904 736
392 512 624 696 824 968 960 808
576 736 760 784 896 800 824 792
imagesc(uint8(ybJ)); colormap(gray)
YJ = imgjpeg('tago.png',16);
ybJ = YJ(81:88,81:88);
Q =
Columns 1 through 6
256 176 160 256 384 640
192 192 224 304 416 928
224 208 256 384 640 912
224 272 352 464 816 1392
288 352 592 896 1088 1744
384 560 880 1024 1296 1664
784 1024 1248 1392 1648 1936
1152 1472 1520 1568 1792 1600
Columns 7 through 8
816 976
960 880
1104 896
1280 992
1648 1232
1808 1472
1920 1616
1648 1584
imagesc(uint8(ybJ)); colormap(gray)
YJ = imgjpeg('tago.png',32);
ybJ = YJ(81:88,81:88);
Q =
Columns 1 through 6
512 352 320 512 768 1280
384 384 448 608 832 1856
448 416 512 768 1280 1824
448 544 704 928 1632 2784
576 704 1184 1792 2176 3488
768 1120 1760 2048 2592 3328
1568 2048 2496 2784 3296 3872
2304 2944 3040 3136 3584 3200
Columns 7 through 8
1632 1952
1920 1760
2208 1792
2560 1984
3296 2464
3616 2944
3840 3232
3296 3168
imagesc(uint8(ybJ)); colormap(gray)
Computer Problem 5
Carry out computer problem 3 but with a color image by using linear quantization on R,G,B colors seperatley
Code to compress color image with Linear Quantization
Z = clrlinear('tago.png',1);
yc1 = Z(81:88,81:88);
Q =
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
imagesc(uint8(yc1));
Z = clrlinear('tago.png',2);
yc1 = Z(81:88,81:88);
Q =
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
imagesc(uint8(yc1));
Z = clrlinear('tago.png',4);
yc1 = Z(81:88,81:88);
Q =
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
imagesc(uint8(yc1));
Z = clrlinear('tago.png',8);
yc1 = Z(81:88,81:88);
Q =
64 128 192 256 320 384 448 512
128 192 256 320 384 448 512 576
192 256 320 384 448 512 576 640
256 320 384 448 512 576 640 704
320 384 448 512 576 640 704 768
384 448 512 576 640 704 768 832
448 512 576 640 704 768 832 896
512 576 640 704 768 832 896 960
imagesc(uint8(yc1));
Z = clrlinear('tago.png',16);
yc1 = Z(81:88,81:88);
Q =
Columns 1 through 6
128 256 384 512 640 768
256 384 512 640 768 896
384 512 640 768 896 1024
512 640 768 896 1024 1152
640 768 896 1024 1152 1280
768 896 1024 1152 1280 1408
896 1024 1152 1280 1408 1536
1024 1152 1280 1408 1536 1664
Columns 7 through 8
896 1024
1024 1152
1152 1280
1280 1408
1408 1536
1536 1664
1664 1792
1792 1920
imagesc(uint8(yc1));
Z = clrlinear('tago.png',32);
yc1 = Z(81:88,81:88);
Q =
Columns 1 through 6
256 512 768 1024 1280 1536
512 768 1024 1280 1536 1792
768 1024 1280 1536 1792 2048
1024 1280 1536 1792 2048 2304
1280 1536 1792 2048 2304 2560
1536 1792 2048 2304 2560 2816
1792 2048 2304 2560 2816 3072
2048 2304 2560 2816 3072 3328
Columns 7 through 8
1792 2048
2048 2304
2304 2560
2560 2816
2816 3072
3072 3328
3328 3584
3584 3840
imagesc(uint8(yc1));
Computer Problem 6
Carry out computer problem 3 but transform RGB to luminance / color difference coordinates and using JPEG quantization
Code to compress color image in luminace / color difference coordinates using JPEG quantization
U1 = yuvjpeg('tago.png',1);
yu1 = U1(81:88,81:88);
Q =
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
Q2 =
17 18 24 47 99 99 99 99
18 21 26 66 99 99 99 99
24 26 56 99 99 99 99 99
47 66 99 99 99 99 99 99
99 99 99 99 99 99 99 99
99 99 99 99 99 99 99 99
99 99 99 99 99 99 99 99
99 99 99 99 99 99 99 99
imagesc(uint8(yu1));
U1 = yuvjpeg('tago.png',2);
yu1 = U1(81:88,81:88);
Q =
32 22 20 32 48 80 102 122
24 24 28 38 52 116 120 110
28 26 32 48 80 114 138 112
28 34 44 58 102 174 160 124
36 44 74 112 136 218 206 154
48 70 110 128 162 208 226 184
98 128 156 174 206 242 240 202
144 184 190 196 224 200 206 198
Q2 =
34 36 48 94 198 198 198 198
36 42 52 132 198 198 198 198
48 52 112 198 198 198 198 198
94 132 198 198 198 198 198 198
198 198 198 198 198 198 198 198
198 198 198 198 198 198 198 198
198 198 198 198 198 198 198 198
198 198 198 198 198 198 198 198
imagesc(uint8(yu1));
U1 = yuvjpeg('tago.png',4);
yu1 = U1(81:88,81:88);
Q =
64 44 40 64 96 160 204 244
48 48 56 76 104 232 240 220
56 52 64 96 160 228 276 224
56 68 88 116 204 348 320 248
72 88 148 224 272 436 412 308
96 140 220 256 324 416 452 368
196 256 312 348 412 484 480 404
288 368 380 392 448 400 412 396
Q2 =
68 72 96 188 396 396 396 396
72 84 104 264 396 396 396 396
96 104 224 396 396 396 396 396
188 264 396 396 396 396 396 396
396 396 396 396 396 396 396 396
396 396 396 396 396 396 396 396
396 396 396 396 396 396 396 396
396 396 396 396 396 396 396 396
imagesc(uint8(yu1));
U1 = yuvjpeg('tago.png',8);
yu1 = U1(81:88,81:88);
Q =
128 88 80 128 192 320 408 488
96 96 112 152 208 464 480 440
112 104 128 192 320 456 552 448
112 136 176 232 408 696 640 496
144 176 296 448 544 872 824 616
192 280 440 512 648 832 904 736
392 512 624 696 824 968 960 808
576 736 760 784 896 800 824 792
Q2 =
136 144 192 376 792 792 792 792
144 168 208 528 792 792 792 792
192 208 448 792 792 792 792 792
376 528 792 792 792 792 792 792
792 792 792 792 792 792 792 792
792 792 792 792 792 792 792 792
792 792 792 792 792 792 792 792
792 792 792 792 792 792 792 792
imagesc(uint8(yu1));
U1 = yuvjpeg('tago.png',16);
yu1 = U1(81:88,81:88);
Q =
Columns 1 through 6
256 176 160 256 384 640
192 192 224 304 416 928
224 208 256 384 640 912
224 272 352 464 816 1392
288 352 592 896 1088 1744
384 560 880 1024 1296 1664
784 1024 1248 1392 1648 1936
1152 1472 1520 1568 1792 1600
Columns 7 through 8
816 976
960 880
1104 896
1280 992
1648 1232
1808 1472
1920 1616
1648 1584
Q2 =
Columns 1 through 6
272 288 384 752 1584 1584
288 336 416 1056 1584 1584
384 416 896 1584 1584 1584
752 1056 1584 1584 1584 1584
1584 1584 1584 1584 1584 1584
1584 1584 1584 1584 1584 1584
1584 1584 1584 1584 1584 1584
1584 1584 1584 1584 1584 1584
Columns 7 through 8
1584 1584
1584 1584
1584 1584
1584 1584
1584 1584
1584 1584
1584 1584
1584 1584
imagesc(uint8(yu1));
U1 = yuvjpeg('tago.png',32);
yu1 = U1(81:88,81:88);
Q =
Columns 1 through 6
512 352 320 512 768 1280
384 384 448 608 832 1856
448 416 512 768 1280 1824
448 544 704 928 1632 2784
576 704 1184 1792 2176 3488
768 1120 1760 2048 2592 3328
1568 2048 2496 2784 3296 3872
2304 2944 3040 3136 3584 3200
Columns 7 through 8
1632 1952
1920 1760
2208 1792
2560 1984
3296 2464
3616 2944
3840 3232
3296 3168
Q2 =
Columns 1 through 6
544 576 768 1504 3168 3168
576 672 832 2112 3168 3168
768 832 1792 3168 3168 3168
1504 2112 3168 3168 3168 3168
3168 3168 3168 3168 3168 3168
3168 3168 3168 3168 3168 3168
3168 3168 3168 3168 3168 3168
3168 3168 3168 3168 3168 3168
Columns 7 through 8
3168 3168
3168 3168
3168 3168
3168 3168
3168 3168
3168 3168
3168 3168
3168 3168
imagesc(uint8(yu1));