A New Image Compression Scheme Based on Locally Adaptive Coding Chair Professor Chin-Chen Chang Feng Chia University
Introduction Image compression technique w h Image Index table Vector Quantization Encoder
Introduction (Cont.) Image compression technique w h Image Index table Vector Quantization Decoder
Introduction (Cont.) VQ Histogram Index table Image
Locally adaptive scheme Introduction (Cont.) • Ex: a a b b c a c a b d c c e f b a List List b a a 0 0 1 … List List List List c c c a b a b a b c b a 002 012 102 002 012 102 002 012 102 002 012 102 0a100b100c110101101… 1: index existed in list 0: the symbol does not exist in list • Concept: Moving the Recently Used to the Front
The Proposed Method Divide the temporary codebook into two Parts (frequently-used and infrequently-used) Refine the frequently-used part of temporary codebook Divide image into non-overlapping blocks Generate temporary codebook Image I Refine the infrequently-used part of temporary codebook generated codebook Output Compress I by referencing the generated codebook Compression code
The Proposed Method (Cont.) • The proposed method includes two phases for codebook generation • Temporary codebook generation • Codebook refining
Temporary Codebook Generation • The codebook generation is based on the concept of locally adaptive coding Temporary Codebook w Bi = {84, 170, 166, 167, 83, …, 168} G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} h G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}} G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} ∵d(Bi , g2,1) = 2.24 TH = 25 ∴ add Bi into G2 and move G2 to be the first one Image Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} *d(•): Euclidean distance function
Temporary Codebook Generation (Cont.) Temporary Codebook Temporary Codebook G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}}
Temporary Codebook Generation (Cont.) Temporary Codebook w G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} Bj = {220, 212, 182, 179, 240, …, 246} h G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} Image Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} ∵ No any block satisfies d(Bj, gk) TH = 25 ∴ Create a new group Gn+1, add Bj into Gn+1, and move Gn+1 to be the first one
Temporary Codebook Generation (Cont.) Temporary Codebook Temporary Codebook G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} Gn+1 = { gn+1,1={220, 212, 182, 179, 240, …, 246}} G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} Gn+1 = { gn+1,1={220, 212, 182, 179, 240, …, 246}}
Codebook Refining IF ||Gi|| > THF = 3 Then Add Gi into Frequently-used part Else add Gi into Infrequently-used part Temporary Codebook ||Gn+1|| =1 Gn+1 = { gn+1,1={220, 212, 182, 179, 240, …, 246}} G2 = { g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} Frequently-used ||G2|| =3 Gn G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} ||G1|| =3 G3 G3 = { g3,1={184, 83, 194, 170, 166, …, 110}, g3,2={180, 80, 194, 166, 168, …, 114}, g3,3={185, 85, 190, 172, 160, …, 120}, g3,4={191, 88, 197, 170, 162, …, 107}} ||G3|| =4 Infrequently-used Gn+1 G2 Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} ||Gn|| =4 G1
Codebook Refining (Cont.) For frequently-used part c3={185, 84, 194, 170, 164, …, 113} Compute Gi’s centroid cn={243, 85, 176, 211, 164, …, 127} G3 = { g3,1={84, 83, 94, 170, 166, …, 210}, g3,2={80, 80, 94, 166, 168, …, 214}, g3,3={85, 85, 90, 172, 160, …, 220}, g3,4={91, 88, 97, 170, 162, …, 207}} : ∵d(c3, cn) = 32 THH = 35 ∴ Combine c3 and cn by c3’ = (c3 + cn)/2 Use the centroids to represent the codewords c3={185, 84, 194, 170, 164, …, 113} Gn = { gn,1={244, 83, 174, 210, 166, …, 127}, gn,2={243, 80, 175, 213, 168, …, 128}, gn,3={240, 85, 176, 209, 160, …, 126}, gn,4={244, 88, 178, 213, 162, …, 127}} cn={243, 85, 176, 211, 164, …, 127} c3’={214, 85, 185, 191, 164, …, 120} : Centroid of Gn
Codebook Refining (Cont.) For infrequently-used part c1={200, 96, 85, 167, 83, …, 131} c2={85, 170, 166, 169, 86, …, 168} Compute Gi’s centroid cn+1={220, 212, 182, 179, 240, …, 246} Gn+1 = {gn+1,1={220, 212, 182, 179, 240, …, 246}} cn+1={220, 212, 182, 179, 240, …, 246} Use the centroids to represent the codewords G2 = {g2,1={84, 170, 166, 167, 84, …, 170}, g2,2={86, 168, 165, 170, 90, …, 165}, g2,3={84, 170, 166, 167, 83, …, 168}} c2={85, 170, 166, 169, 86, …, 168} G1 = { g1,1={199, 96, 84, 167, 83, …, 130}, g1,2={201, 97, 90, 167, 85, …, 132}, g1,3={200, 95, 82, 167, 81, …, 131}} c1={200, 966, 85, 167, 83, …, 131}
Codebook Refining (Cont.) Frequently-used part C3’={214, 85, 185, 191, 164, …, 120} : ∵d(c3’, c1) = 132.57 THL = 135 ∴ Delete c1 from Infrequently-used part Infrequently-used part c1={200, 96, 85, 167, 83, …, 131} c1={200, 96, 85, 167, 83, …, 131} c2={85, 170, 166, 169, 86, …, 168} c2={85, 170, 166, 169, 86, …, 168} cn+1={220, 212, 182, 179, 240, …, 246} cn+1={220, 212, 182, 179, 240, …, 246}
Codebook Refining (Cont.) Frequently-used part C3’={214, 85, 185, 191, 164, …, 120} C3’={214, 85, 185, 191, 164, …, 120} c2={85, 170, 166, 169, 86, …, 168} : : Infrequently-used part c2={85, 170, 166, 169, 86, …, 168} ∵ No any codeword cj from frequently-used part satisfies d(c2, cj) THL = 135 ∴ Add c2 into frequently-used part and delete c2 from infrequently-used part cn+1={220, 212, 182, 179, 240, …, 246}
Codebook Refining (Cont.) Frequently-used part C3’={214, 85, 185, 191, 164, …, 120} C3’={214, 85, 185, 191, 164, …, 120} c2={85, 170, 166, 169, 86, …, 168} c2={85, 170, 166, 169, 86, …, 168} cn+1={220, 212, 182, 179, 240, …, 246} : : Generated codebook Infrequently-used part cn+1={220, 212, 182, 179, 240, …, 246} ∵ No any codeword cj from frequently-used part satisfies d(cn+1, cj) THL = 135 ∴ Add cn+1 into frequently-used part and delete cn+1 from infrequently-used part Empty
Image Compression Generated codebook w 1 h C0={214, 85, 185, 191, 164, …, 120} c1={85, 170, 166, 169, 86, …, 168} : cn={220, 212, 182, 179, 240, …, 246} Index table Image
Experimental Results (b) Goldhill (a) Alan (c) Lena (d) Tiffany
Experimental Results (Cont.) (a) Codebook size comparison
Experimental Results (Cont.) (b) PSNR comparison with different THs
Experimental Results (Cont.)
Conclusions • The proposed method significantly reduces the size of codebook and maintains a good image quality of the compressed images.