§å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Lêi c¶m ¬n ! Em xin bµy tá lßng biÕt ¬n s©u s¾c nhÊt tíi PGS. TS. Ng« Quèc T¹o, thÇy ®· tËn t×nh híng dÉn vµ gióp ®ì em rÊt nhiÒu trong qu¸ tr×nh thùc tËp vµ t×m hiÓu nghiªn cøu ®Ò tµi ®îc giao ®Ó em cã thÓ hoµn thµnh tèt b¸o c¸o tèt nghiÖp cña m×nh. Em xin ch©n thµnh c¶m ¬n sù d¹y b¶o cña c¸c thÇy gi¸o, c« gi¸o Khoa C«ng NghÖ Th«ng Tin - Trêng §¹i häc D©n LËp H¶i Phßng ®· trang bÞ cho em nh÷ng kiÕn thøc c¬ b¶n ®Ó em cã thÓ hoµn thµnh b¸o c¸o tèt nghiÖp vÒ ®Ò tµi ®îc giao. Trong qu¸ tr×nh nghiªn cøu ®Ò tµi mÆc dï ®· ®îc c¸c thÇy c« gi¸o híng dÉn tËn t×nh nhng do nhiÒu nguyªn nh©n chñ quan vµ kh¸ch quan nªn ®Ò tµi kh«ng tr¸nh khái sai sãt .Em rÊt mong ®îc c¸c thÇy c« gi¸o chØ dÉn ,®ãng gãp nh÷ng ý kiÕn quý b¸u gióp em hoµn thiÖn h¬n b¸o c¸o tèt nghiÖp , ph¸t triÓn vµ më réng ®Ò tµi ®ùoc giao . Em xin ch©n thµnh c¸m ¬n ! H¶i Phßng, ngµy th¸ng n¨m 2007 Sinh viªn T¹ Minh Th¾ng Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 1 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Môc lôc Më ®Çu Ngµy nay, cïng víi sù ph¸t triÓn kh«ng ngõng cña khoa häc vµ c«ng nghÖ th× m¸y tÝnh ®ãng vai trß ngµy cµng quan träng vµ kh«ng thÓ thiÕu trong cuéc sèng x· héi loµi ngêi. ViÖc trao ®æi th«ng tin cña con ngêi trong tÊt c¶ c¸c ngµnh, c¸c lÜnh vùc cña ®êi sèng ngµy cµng trë nªn cÇn thiÕt cïng víi sù ra ®êi vµ ph¸t triÓn cña m¹ng Internet. Xö lý ¶nh lµ mét ngµnh khoa häc cßn t¬ng ®èi míi mÎ so víi nhiÒu ngµnh khoa häc kh¸c nhng nã ®ang ®îc tËp trung nghiªn cøu vµ ph¸t triÓn v× nh÷ng øng dông thùc tiÔn cña nã trong nhiÒu ngµnh , lÜnh vùc kh¸c nhau. Trong ®ã “NÐn ¶nh” lµ mét phÇn cña xö lý ¶nh cã øng dông to lín trong truyÒn th«ng vµ trong lu tr÷, ®· cã rÊt nhiÒu ph¬ng ph¸p nÐn ¶nh ®îc ra ®êi vµ kh«ng ngõng ®îc c¶i tiÕn ®Ó ngµy cµng hoµn thiÖn ®em l¹i hiÖu qu¶ nÐn cao vµ cho chÊt lîng ¶nh tèt nhÊt. Trong ®å ¸n tèt nghiÖp “T×M hiÓu mét sè ph¬ng ph¸p nÐn ¶nh” ®îc sù híng dÉn cña PGS .TS . Ng« Quèc T¹o em ®· ®i s©u nghiªn cøu mét sè ph¬ng ph¸p nÐn ¶nh phæ biÕn nh : m· lo¹t dµi RLE, HUFFMAN, LZW, JPEG vµ ph¬ng ph¸p nÐn ¶nh JPEG2000 dùa trªn biÕn ®æi Wavelet víi nh÷ng ®Æc tÝnh vît tréi so víi c¸c chuÈn nÐn tríc ®ã ®em l¹i hiÖu qu¶ nÐn cao , cho ¶nh nÐn chÊt lîng tèt vµ nhiÒu nh÷ng u ®iÓm kh¸c mµ c¸c chuÈn nÐn tríc ®ã kh«ng thÓ cã. Néi dung ®å ¸n tèt nghiÖp bao gåm c¸c phÇn chÝnh nh : ch¬ng mét giíi thiÖu tæng quan vÒ xö lý ¶nh, môc ®Ých ch¬ng nµy lµ giíi thiÖu mét sè kh¸i niÖm cÇn biÕt vÒ ¶nh sè vµ xö lý ¶nh sè. Ch¬ng hai sÏ giíi thiÖu mét sè ph¬ng ph¸p nÐn ¶nh vµ c¸ch ph©n lo¹i c¸c ph¬ng ph¸p nÐn ¶nh. Ch¬ng ba sÏ giíi thiÖu vÒ ch¬ng tr×nh thö nghiÖm vµ kÕt qu¶ ®¹t ®ù¬c cña ch¬ng tr×nh. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 2 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Cuèi cïng sÏ lµ phÇn kÕt luËn ®¸nh gi¸ kÕt qu¶ nghiªn cøu thu ®îc vµ híng ph¸t triÓn cña ®Ò tµi. CH¬ng I: Giíi thiÖu tæng quan vÒ nÐn ¶nh I.1.Giíi thiÖu vÒ ¶nh sè vµ xö lý ¶nh sè: I.1.1.¶nh sè: ¶nh cã thÓ biÓu diÔn díi d¹ng tÝn hiÖu t¬ng tù hoÆc tÝn hiÖu sè. Trong biÓu diÔn sè cña c¸c ¶nh ®a møc x¸m, mét ¶nh ®îc biÓu diÔn díi d¹ng mét ma trËn hai chiÒu. Mçi phÇn tö cña ma trËn biÓu diÔn cho møc x¸m hay cêng ®é cña ¶nh t¹i vÞ trÝ ®ã. Mçi phÇn tö trong ma trËn ®îc gäi lµ mét phÇn tö ¶nh, th«ng thêng kÝ hiÖu lµ PEL (Picture Element) hoÆc lµ ®iÓm ¶nh (Pixel). - Víi ¶nh ®a cÊp x¸m: NÕu dïng 8 bit (1 byte) ®Ó biÓu diÔn møc x¸m, th× sè c¸c møc x¸m cã thÓ biÓu diÔn ®îc lµ 28 hay 256. Mçi møc x¸m ®îc biÓu diÔn díi d¹ng lµ mét sè nguyªn n»m trong kho¶ng tõ 0 ®Õn 255, víi møc 0 biÓu diÔn cho møc cêng ®é ®en nhÊt vµ 255 biÓu diÔn cho møc cêng ®é s¸ng nhÊt. - Víi ¶nh mµu: C¸ch biÓu diÔn còng t¬ng tù nh víi ¶nh ®en tr¾ng, chØ kh¸c lµ c¸c sè t¹i mçi phÇn tö cña ma trËn biÓu diÔn cho ba mµu riªng rÏ gåm: ®á (red), lôc (green) vµ lam (blue). §Ó biÓu diÔn cho mét ®iÓm ¶nh mµu cÇn 24 Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 3 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh bit, 24 bit nµy ®îc chia thµnh ba kho¶ng 8 bit. Mçi kho¶ng nµy biÓu diÔn cho cêng ®é s¸ng cña mét trong c¸c mµu chÝnh. Pixel or PEL §é s¸ng trung b×nh trong mçi h×nh ch÷ nhËt = gi¸ trÞ mét ®iÓm ¶nh. H×nh 1.1 BiÓu diÔn cña mét møc x¸m cña ¶nh sè. I.1.2.Xö lý ¶nh sè: Xö lý ¶nh lµ mét khoa häc mÆc dï cßn t¬ng ®èi míi so víi nhiÒu ngµnh khoa häc kh¸c ,nhÊt lµ trªn quy m« c«ng nghiÖp. Xö lý ¶nh sè cã rÊt nhiÒu øng dông nh lµm næi c¸c ¶nh trong y häc, kh«i phôc l¹i ¶nh do t¸c ®éng cña khÝ quyÓn trong thiªn v¨n häc, t¨ng cêng ®é ph©n gi¶i cña ¶nh truyÒn h×nh mµ kh«ng cÇn thay ®æi cÊu tróc bªn trong cña hÖ thèng chuyÓn t¶i, nÐn ¶nh trong khi truyÒn ®i xa hoÆc lu tr÷. C¸c giai ®o¹n chÝnh trong xö lý ¶nh cã thÓ ®îc m« t¶ trong h×nh sau: Lu tr÷ CAMERA Thu nhËn ¶nh Sè ho¸ Ph©n tÝch ¶nh NhËn d¹ng dd¹ng¹ng SENSOR Lu tr÷ Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 HÖ quyÕt ®Þnh Trang : 4 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh I.2.Môc ®Ých vµ sù cÇn thiÕt cña “ nÐn ¶nh ” : NÐn ¶nh lµ mét kü thuËt m· ho¸ c¸c ¶nh sè ho¸ nh»m gi¶m sè lîng c¸c bit d÷ liÖu cÇn thiÕt ®Ó biÓu diÔn ¶nh. Môc ®Ých lµ gi¶m ®i nh÷ng chi phÝ trong viÖc lu tr÷ ¶nh vµ chi phÝ thêi gian ®Ó truyÒn ¶nh ®i xa trong truyÒn th«ng nhng vÉn ®¶m b¶o ®îc chÊt lîng cña ¶nh. NÐn ¶nh thùc hiÖn ®îc lµ do mét thùc tÕ: th«ng tin trong bøc ¶nh kh«ng ph¶i lµ ngÉu nhiªn mµ cã trËt tù , tæ chøc.V× thÕ nÕu bãc t¸ch ®îc tÝnh trËt tù, cÊu tróc ®ã th× sÏ biÕt phÇn th«ng tin nµo quan träng nhÊt trong bøc ¶nh ®Ó biÓu diÔn vµ truyÒn ®i víi sè lîng Ýt bit h¬n so víi ¶nh gèc mµ vÉn ®¶m b¶o tÝnh ®Çy ®ñ cña th«ng tin.ë bªn nhËn qu¸ tr×nh gi¶i m· sÏ tæ chøc, s¾p xÕp l¹i ®îc bøc ¶nh xÊp xØ gÇn chÝnh x¸c so víi ¶nh gèc nhng vÉn tháa m·n chÊt lîng yªu cÇu. Díi ®©y lµ vÝ dô vÒ lu tr÷ ¶nh sè vµ truyÒn ®i xa víi ®êng truyÒn 9600 baud (9600 bps) ®Ó thÊy râ sù cÇn thiÕt cña viÖc nÐn ¶nh: • ¶nh ®a cÊp x¸m hay ¶nh 256 mµu cã kÝch thíc 800 x 600, 8 bit/®iÓm ¶nh, cÇn 3.840.000 bit lu tr÷ vµ mÊt 6.67 phót ®Ó truyÒn. • ¶nh mµu RGB (24 bit/®iÓm ¶nh ) cïng ®é ph©n gi¶i nh vËy cÇn h¬n 10 triÖu bit ®Ó lu tr÷ vµ 20 phót ®Ó truyÒn. • Mét phim ©m b¶n cã kÝch thíc 24 × 36 mm (35 mm) chia b»ng c¸c kho¶ng c¸ch nhau 12 µm, vµo kho¶ng 3000 × 2000 ®iÓm, 8 bit / pixel, yªu cÇu 48 triÖu bit cho lu gi÷ ¶nh vµ 83 phót ®Ó truyÒn. Qua vÝ dô trªn ta thÊy nhiÒu vÊn ®Ò trong viÖc lu tr÷ vµ truyÒn t¶i ¶nh sè ho¸. NÐn ¶nh cã nhiÒu øng dông trong thùc tÕ nh : truyÒn c¸c v¨n b¶n ®å ho¹ qua ®êng ®iÖn tho¹i (Fax), nÐn ¶nh trong y tÕ vµ truyÒn h×nh c¸p….ChÝnh sù øng dông trong nhiÒu lÜnh vùc cña nÐn ¶nh cïng víi sù tiÕn bé trong lÜnh vùc vi ®iÖn tö dÉn ®Õn sù ra ®êi c¸c chuÈn nÐn ¶nh. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 5 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh NÐn ¶nh ®¹t ®îc b»ng c¸ch lo¹i bá c¸c phÇn d thõa trong ¶nh ®· ®îc sè ho¸. D thõa cã thÓ lµ d thõa th«ng tin vÒ kh«ng gian, d thõa vÒ cÊp x¸m hay d thõa vÒ thêi gian: • D thõa th«ng tin vÒ kh«ng gian : trong mét bøc ¶nh lu«n tån t¹i sù t¬ng quan gi÷a c¸c ®iÓm ¶nh c¹nh nhau. • D thõa th«ng tin vÒ cÊp x¸m :lµ d thõa dùa vµo sù t¬ng quan gi÷a c¸c mµu s¾c c¹nh nhau. • D thõa th«ng tin vÒ thêi gian : Trong mét chuçi ¶nh video, tån t¹i sù t¬ng quan gi÷a c¸c ®iÓm ¶nh cña c¸c frame kh¸c nhau . I.3.C¸c kh¸i niÖm c¬ b¶n: • Pixel (picture element) : phÇn tö ¶nh ¶nh trong thùc tÕ lµ mét ¶nh liªn tôc vÒ kh«ng gian vµ vÒ gi¸ trÞ ®é s¸ng. §Ó cã thÓ xö lý ¶nh b»ng m¸y tÝnh cÇn thiÕt ph¶i tiÕn hµnh sè ho¸ ¶nh. Nh vËy mét ¶nh lµ mét tËp hîp c¸c pixel. Mçi pixel lµ gåm mét cÆp to¹ ®é x, y vµ mµu. CÆp to¹ ®é x,y t¹o nªn ®é ph©n gi¶i (resolution). Mµn h×nh m¸y tÝnh cã nhiÒu lo¹i víi ®é ph©n gi¶i kh¸c nhau: 320 x 200, 640x350, 800x600, 1024x768,… • Møc x¸m (Graylevel) Møc x¸m lµ kÕt qu¶ sù m· ho¸ t¬ng øng cña mçi cêng ®é s¸ng cña mçi ®iÓm ¶nh víi mét gi¸ trÞ sè – kÕt qu¶ cña qu¸ tr×nh lîng ho¸ . • D÷ liÖu Trong mét bµi to¸n, d÷ liÖu bao gåm mét tËp c¸c phÇn tö c¬ së mµ ta gäi lµ d÷ liÖu nguyªn tö. Nã cã thÓ lµ mét ch÷ sè, mét ký tù, ... nhng còng cã thÓ lµ mét con sè, mét tõ, ... ®iÒu ®ã phô thuéc vµo tõng bµi to¸n. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 6 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh • NÐn d÷ liÖu NÐn d÷ liÖu lµ qu¶ tr×nh gi¶m dung lîng th«ng tin “d thõa” trong d÷ liÖu gèc vµ lµm cho lîng th«ng tin thu ®îc sau nÐn thêng nhá h¬n d÷ liÖu gèc rÊt nhiÒu. Do vËy, tiÕt kiÖm ®îc bé nhí vµ gi¶m thêi gian trao ®æi d÷ liÖu trªn m¹ng th«ng tin mµ l¹i cho phÐp chóng ta kh«i phôc l¹i d÷ liÖu ban ®Çu. • Tû lÖ nÐn Tû lÖ nÐn lµ mét trong c¸c ®Æc trng quan träng cña mäi ph¬ng ph¸p nÐn. Tû lÖ nÐn ®îc ®Þnh nghÜa nh sau: Tû lÖ nÐn = 1/r*% víi r lµ tû sè nÐn ®îc ®Þnh nghÜa: r = kÝch thíc d÷ liÖu gèc / kÝch thíc d÷ liÖu nÐn. Nh vËy hiÖu suÊt nÐn = (1- tû lÖ nÐn)*100%. §èi v¬i ¶nh tÜnh, kÝch thíc chÝnh lµ sè bit biÓu diÔn toµn bé bøc ¶nh. §èi víi ¶nh video, kÝch thíc chÝnh lµ sè bit ®Ó biÓu diÔn mét khung h×nh video (video frame). Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 7 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Ch¬ng II: C¸c ph¬ng ph¸p nÐn ¶nh II.1.C¸ch ph©n lo¹i c¸c ph¬ng ph¸p nÐn ¶nh: II.1.1.C¸ch ph©n lo¹i dùa vµo nguyªn lý nÐn: NÐn b¶o toµn th«ng tin (losses compression): bao gåm c¸c ph¬ng ph¸p nÐn mµ sau khi gi¶i nÐn sÏ thu ®ù¬c chÝnh x¸c d÷ liÖu gèc.Tuy nhiªn nÐn b¶o toµn th«ng tin chØ ®¹t hiÖu qu¶ nhá so víi ph¬ng ph¸p nÐn kh«ng b¶o toµn th«ng tin. NÐn kh«ng b¶o toµn th«ng tin (lossy compression): bao gåm c¸c ph¬ng ph¸p nÐn sau khi gi¶i nÐn sÏ kh«ng thu ®îc d÷ liÖu nh b¶n gèc. C¸c ph¬ng ph¸p nµy ®îc gäi lµ “t©m lý thÞ gi¸c” ®ã lµ lîi dông tÝnh chÊt cña m¾t ngêi chÊp nhËn mét sè vÆn xo¾n trong ¶nh khi kh«i phôc l¹i.Ph¬ng ph¸p nµy lu«n ®em l¹i hiÖu qu¶ cao do lo¹i bá ®i nh÷ng th«ng tin d thõa kh«ng cÇn thiÕt. II.1.2.C¸ch ph©n lo¹i dùa vµo c¸ch thøc thùc hiÖn nÐn: Ph¬ng ph¸p kh«ng gian (Spatial Data Compression ): c¸c ph¬ng ph¸p nµy thùc hiÖn nÐn b»ng c¸ch t¸c ®éng trùc tiÕp lªn viÖc lÊy mÉu cña ¶nh trong miÒn kh«ng gian. Ph¬ng ph¸p sö dông biÕn ®æi (Transform Coding): gåm c¸c ph¬ng ph¸p t¸c ®éng lªn sù biÕn ®æi cña ¶nh gèc chø kh«ng t¸c ®éng trùc tiÕp. II.1.3.C¸ch ph©n lo¹i dùa vµo lý thuyÕt m· ho¸: Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 8 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh C¸c ph¬ng ph¸p nÐn thÕ hÖ thø nhÊt: gåm c¸c ph¬ng ph¸p cã møc ®é tÝnh to¸n ®¬n gi¶n nh lÊy mÉu , g¸n tõ m·,…. C¸c ph¬ng ph¸p nÐn thÕ hÖ thø hai: gåm c¸c ph¬ng ph¸p dùa vµo møc ®é b·o hoµ cña tû lÖ nÐn b»ng c¸ch sö dông c¸c phÐp to¸n tæ hîp ®Çu ra mét c¸ch hîp lý hoÆc sö dông biÓu diÔn ¶nh nh : ph¬ng ph¸p kim tù th¸p Laplace, ph¬ng ph¸p dùa vµo vïng gia t¨ng, ph¬ng ph¸p t¸ch hîp. II.1.4.Qu¸ tr×nh nÐn vµ gi¶i nÐn : Gåm 2 c«ng ®o¹n : NÐn : d÷ liÖu gèc qua bé m· ho¸ d÷ liÖu , bé m· ho¸ nµy thùc hiÖn nÐn d÷ liÖu ®Õn mét møc thÝch hîp cho viÖc lu tr÷ vµ truyÒn dÉn th«ng tin. Qu¸ tr×nh nµy sÏ thùc hiÖn viÖc lo¹i bá hay c¾t bít nh÷ng d thõa cña ¶nh ®Ó thu ®îc th«ng tin cÇn thiÕt nhng vÉn ®¶m b¶o ®îc chÊt lîng ¶nh. Gi¶i nÐn : d÷ liÖu nÐn ®i qua bé gi¶i m· d÷ liÖu, bé gi¶i m· sÏ thùc hiÖn gi¶i nÐn ®Ó thu ®îc d÷ liÖu gèc ban ®Çu.ViÖc gi¶i nÐn nµy thêng ph¶i dùa vµo c¸c th«ng tin ®i kÐm theo d÷ liÖu nÐn ,tuú thuéc vµo kiÓu nÐn hay ph¬ng ph¸p nÐn mµ d÷ liÖu gi¶i nÐn ®îc cã hoµn toµn gièng víi d÷ liÖu gèc ban ®Çu hay kh«ng. Tãm l¹i qu¸ tr×nh nÐn vµ gi¶i nÐn d÷ liÖu cã thÓ m« t¶ mét c¸ch tãm t¾t theo s¬ ®å díi ®©y: Qu¸ tr×nh nÐn D÷ liÖu gèc D÷ liÖu nÐn Qu¸ tr×nh gi¶i nÐn H×nh 2.1 : Qu¸ tr×nh nÐn vµ gi¶i nÐn Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 9 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh II.2.Ph¬ng ph¸p m· ho¸ ®é dµi lo¹t RLE: M· ho¸ theo ®é dµi lo¹t RLE (Run Length Encoding) lµ mét ph¬ng ph¸p nÐn ¶nh dùa trªn sù c¾t bít c¸c d thõa vÒ kh«ng gian (mét vµi h×nh ¶nh cã vïng mµu lín kh«ng ®æi ®Æc biÖt ®èi víi ¶nh nhÞ ph©n). Lo¹t ®îc ®Þnh nghÜa lµ d·y c¸c phÇn tö ®iÓm ¶nh (pixel) liªn tiÕp cã cïng chung mét gi¸ trÞ. II.2.1.Nguyªn t¾c : Nguyªn t¾c cña ph¬ng ph¸p nµy lµ ph¸t hiÖn mét lo¹t c¸c ®iÓm ¶nh lÆp l¹i liªn tiÕp, vÝ dô :110000000000000011 .Ta thÊy ®iÓm ¶nh cã gi¸ trÞ 0 xuÊt hiÖn nhiÒu lÇn liªn tiÕp thay v× ph¶i lu tr÷ toµn bé c¸c ®iÓm ¶nh cã gi¸ trÞ 0 ta chØ cÇn lu tr÷ chóng b»ng c¸ch sö dông c¸c cÆp (®é dµi lo¹t, gi¸ trÞ). VÝ dô: Cho mét chuçi nguån d : d =5 5 5 5 5 5 5 5 5 5 19 19 19 19 19 0 0 0 0 0 0 0 23 23 23 23 23 23 23 23 Ta sÏ cã chuçi míi : (10 5) (5 19) (7 0) (8 23) Tû sè nÐn = 20/ 8 = 2.5 §èi víi ¶nh ®en tr¾ng chØ sö dông 1 bit ®Ó biÓu diÔn 1 ®iÓm ¶nh th× ph¬ng ph¸p nµy tá ra rÊt hiÖu qu¶, ta thÊy ®iÒu ®ã qua vÝ dô sau : Cho mét chuçi nguån d: 000000000000000111111111100000000001111111111000000000000000 Ta cã chuçi míi : (15, 10, 10, 10, 15) Tû sè nÐn = 60 bit / (5*4 bit) = 3 ( chØ sö dông 4 bit ®Ó thÓ hiÖn ®é dµi lo¹t vµ kh«ng thÓ hiÖn gi¸ trÞ lo¹t v× ¶nh ®en tr¾ng chØ cã 2 gi¸ trÞ bit lµ 0 hoÆc lµ 1) Chó ý: Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 10 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh • §èi víi ¶nh chiÒu dµi cña mét d·y lÆp cã thÓ lín h¬n 255, nÕu ta dïng 1 byte ®Ó lu tr÷ chiÒu dµi th× sÏ kh«ng ®ñ. Gi¶i ph¸p ®îc dïng lµ t¸ch chuçi ®ã thµnh 2 chuçi: mét chuçi cã chiÒu dµi lµ 255, chuçi kia cã chiÒu dµi cßn l¹i. • Ph¬ng ph¸p nÐn RLE chØ ®¹t hiÖu qu¶ khi chuçi lÆp lín h¬n 1 ngìng nhÊt ®Þnh nµo ®ã hay nãi c¸c kh¸c trong ¶nh cÇn nÐn ph¶i cã nhiÒu ®iÓm ¶nh kÒ nhau cã cïng gi¸ trÞ mµu.Do ®ã ph¬ng ph¸p nµy kh«ng ®em l¹i cho ta kÕt qu¶ mét c¸ch æn ®Þnh v× nã phô thuéc hoµn toµn vµo ¶nh nÐn chØ thÝch hîp cho nh÷ng ¶nh ®en tr¾ng hay ¶nh ®a cÊp x¸m. VÝ dô: Ta cã mét chuçi nguån: d=5 7 9 11 13 18 28 38 48 58 30 35 40 45 Chuçi kÕt qu¶ sau khi m· ho¸ : 1 5 1 7 1 9 1 11 1 3 1 18 1 28 1 38 1 48 1 58 1 30 1 35 1 40 1 45 Tû sè nÐn = 14 / 28 = 0.2 Nh vËy chuçi sau khi m· ho¸ ®· lín h¬n nhiÒu chuçi nguån ban ®Çu. Do ®ã cÇn ph¬ng ph¸p c¶i tiÕn ®Ó xö lý nh÷ng trêng hîp nh trªn tr¸nh lµm më réng chuçi d÷ liÖu nguån nghÜa lµ chØ m· ho¸ ®é dµi lo¹t d÷ liÖu lÆp l¹i. Ngêi ta ®· ®a ra c¸ch ®ã lµ thªm kÝ tù tiÒn tè vµo tríc ®é dµi lo¹t, viÖc gi¶i m· ®îc thùc hiÖn nÕu gÆp kÝ tù tiÒn tè víi ®é dµi lo¹t vµ gi¸ trÞ ®iÓm ¶nh theo sau. VÝ dô: Ta cã chuçi nguån : d = 5 8 4 8 8 8 8 8 8 8 8 10 10 10 10 10 10 10 10 10 Gi¶ sö kÝ tù tiÒn tè lµ “+” ta cã : 5 8 4 +7 8 + 9 10 Tû sè nÐn = 19 / 9 = 2.1 Tuy nhiªn trong mét sè trêng hîp c¸c ®iÓm ¶nh cã ®é t¬ng quan víi nhau vÓ gi¸ trÞ møc x¸m nh trong vÝ dô díi ®©y ta cã thÓ tiÕn hµnh xö lý nh sau. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 11 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh VÝ dô: Ta cã mét chuçi nguån: d = 5 7 9 11 13 18 28 38 48 58 55 60 65 70 75 80 85 90 95 100 Ta cã dùa vµo ®é t¬ng quan nµy ®Ó cã ®îc hiÖu qu¶ nÐn cao , b»ng viÖc ¸p dông e(i) = d(i) –d(i-1) sÏ thu ®îc : 5 2 2 2 2 5 10 10 10 10 -3 5 5 5 5 5 5 5 5 5 ¸p dông ph¬ng ph¸p nÐn lo¹t dµi ta dÔ dµng thu ®îc : (5 1)( 2 4)(5 1)(10 5)(-3 1)(5 9) II.2.2.ThuËt to¸n: ThuËt to¸n nh sau : • TiÕn hµnh duyÖt trªn tõng hµng cho ®Õn khi kÕt thóc vïng d÷ liÖu ¶nh, trong qu¸ tr×nh duyÖt tiÕn hµnh kiÓm tra ®Ó t×m ra nh÷ng lo¹t cã cïng gi¸ trÞ ®ång thêi chó ý nh÷ng kÝ hiÖu xuèng dßng (hay kÕt thóc dßng) ,kÕt thóc ¶nh Bitmap, … • Khi gÆp lo¹t cã ®é dµi > 3 th× nh¶y ®Õn chÕ ®é nÐn ngîc l¹i nh¶y ®Õn chÕ ®é kh«ng nÐn tuy nhiªn nÕu lo¹t > 255 th× sÏ t¸ch ra chØ m· < 255 sau ®ã m· tiÕp phÇn cßn l¹i. Ngoµi ra cßn c¸c chÕ ®é kh¸c nh : b¾t ®Çu , kÕt thóc 1 dßng. • KÕt thóc khi gÆp kÝ hiÖu kÕt thóc bitmap ( end – o f- bitmap) II.2.3.Mét sè thñ tôc ch¬ng tr×nh : • Ch¬ng tr×nh nÐn theo ph¬ng ph¸p RLE : Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 12 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh void CRLE::CompressInRLE8(BYTE*pSrcBits,CByteArray& pRLEBits, int& RLE_size) { int line; int src_index = 0, dst_index = 0, counter, i; for ( line = 0; line < m_dib.dsBmih.biHeight; line++) { state_start: if ( EndOfLine(src_index)) { pRLEBits[dst_index++] = 1; pRLEBits[dst_index++] = pSrcBits[src_index]; src_index++; goto end_of_line; } if(pSrcBits[src_index]==pSrcBits[src_index+1]) goto tate_compress; if ( EndOfLine(src_index+1)) { pRLEBits[dst_index++] = 1; pRLEBits[dst_index++] = pSrcBits[src_index++]; pRLEBits[dst_index++] = 1; pRLEBits[dst_index++] = pSrcBits[src_index++]; goto end_of_line; } if (pSrcBits[src_index+1] == pSrcBits[src_index+2]) { pRLEBits[dst_index++] = 1; pRLEBits[dst_index++] = pSrcBits[src_index++]; goto state_compress; } else Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 13 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh goto state_no_compress; state_compress: for ( counter = 1; counter 2) counter--; pRLEBits[dst_index++] = 0; pRLEBits[dst_index++] = counter+1; for (i = counter+1; i > 0; i--) pRLEBits[dst_index++] = pSrcBits[src_index++]; if ( 0 != ((counter+1) % 2) ) pRLEBits[dst_index++]; goto state_compress; } } pRLEBits[dst_index++] = 0; pRLEBits[dst_index++] = counter; for (i = counter; i > 0; i--) pRLEBits[dst_index++] = pSrcBits[src_index++]; if ( 0 != ((counter) % 2) ) pRLEBits[dst_index++]; goto state_start; end_of_line: if ( 0 != (src_index % 4 )) { int pad = 4 - (src_index%4); src_index += pad; } pRLEBits[dst_index++] = 0; pRLEBits[dst_index++] = 0; } Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 15 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh pRLEBits[dst_index++] = 0; pRLEBits[dst_index++] = 1; RLE_size = dst_index; } • Ch¬ng tr×nh gi¶i nÐn ph¬ng ph¸p RLE : BOOL CRLE::DecRLE8(ifstream &fil, BYTE *pDest) { DWORD x, y, paddedwidth; paddedwidth =BMPWIDTHBYTES(pInfo->biWidth*pInfo-> biBitCount); BYTE FirstByte, SecondByte; WORD data; x = y = 0; while (!fil.eof()) { if (!fil.read((char*)&data, 2)) return FALSE; FirstByte = LOBYTE(data); SecondByte = HIBYTE(data); if (FirstByte == 0) { switch (SecondByte) { case 0: x = 0; y++; break; case 1: return TRUE; case 2: if (!fil.read((char*)&data, 2)) return FALSE; Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 16 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh x += LOBYTE(data); y += HIBYTE(data); break; default: char ch; for (BYTE i = 0; i < SecondByte; i++) { if (!fil.get(ch)) return FALSE; pDest[paddedwidth * y + x++] = (BYTE)ch; } if ((SecondByte % 2) == 1) if (!fil.get(ch)) return FALSE; } } else { for (BYTE i = 0; i < FirstByte; i++) pDest[paddedwidth * y + x++] = SecondByte; } } return FALSE; } Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 17 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh II.3.Ph¬ng ph¸p m· ho¸ Huffman: II.3.1. Nguyªn t¾c: Ph¬ng ph¸p m· ho¸ Huffman lµ ph¬ng ph¸p dùa vµo m« h×nh thèng kª. Ngêi ta tÝnh tÇn suÊt xuÊt hiÖn cña c¸c ký tù b»ng c¸ch duyÖt tuÇn tù tõ ®Çu tÖp gèc ®Õn cuèi tÖp. ViÖc xö lý ë ®©y tÝnh theo bit. Trong ph¬ng ph¸p nµy c¸c ký tù cã tÇn suÊt cao mét tõ m· ng¾n, c¸c ký tù cã tÇn suÊt thÊp mét tõ m· dµi. Nh vËy víi c¸ch thøc nµy ta ®· lµm gi¶m chiÒu dµi trung b×nh cña tõ m· ho¸ b»ng c¸ch dïng chiÒu dµi biÕn ®æi tuy nhiªn còng cã trêng hîp bÞ thiÖt 1 Ýt bit khi tÇn suÊt lµ rÊt thÊp. II.3.2. ThuËt to¸n: • ThuËt to¸n m· ho¸ Huffman gåm 2 bíc chÝnh: • Bíc mét: TÝnh tÇn suÊt cña c¸c ký tù trong d÷ liÖu gèc b»ng c¸ch duyÖt tÖp gèc mét c¸ch tuÇn tù tõ ®Çu ®Õn cuèi ®Ó x©y dùng b¶ng m· vµ tÝnh to¸n tÇn suÊt. TiÕp theo sau lµ s¾p xÕp l¹i b¶ng m· theo thø tù tÇn suÊt gi¶m dÇn. • Bíc hai: DuyÖt b¶ng tÊn suÊt tõ cuèi lªn ®Çu ®Ó thùc hiÖn ghÐp hai phÇn tö cã tÇn suÊt thÊp thµnh mét phÇn tö duy nhÊt cã tÇn suÊt b»ng tæng hai tÇn suÊt thµnh phÇn. CËp nhËt phÇn tö nµy vµo vÞ trÝ phï hîp trong b¶ng vµ lo¹i bá hai phÇn tö ®· xÐt. Thùc hiÖn cho ®Õn khi b¶ng chØ cã mét phÇn tö. §©y lµ qu¸ tr×nh t¹o c©y nhÞ ph©n Huffman ,phÇn tö cã tÇn suÊt thÊp ë bªn ph¶i, phÇn tö kia ë bªn tr¸i. Sau khi c©y ®· t¹o xong ngêi ta tiÕn hµnh g¸n m· cho c¸c nót l¸. ViÖc m· ho¸ thùc hiÖn theo quy ®Þnh : mçi lÇn xuèng bªn ph¶i ta thªm mét bit ‘1’ vµo tõ m·, mçi lÇn xuèng bªn tr¸i ta thªm mét bit ‘0’ vµo tõ m·. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 18 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Qu¸ tr×nh gi¶i nÐn còng kh¸ ®¬n gi¶n ®îc tiÕn hµnh theo chiÒu ngîc l¹i. Ngêi ta còng ph¶i dùa vµo b¶ng m· t¹o ra trong giai ®o¹n nÐn (b¶ng nµy ®îc lu tr÷ trong cÊu tróc ®Çu cña tÖp nÐn cïng víi d÷ liÖu nÐn). VÝ dô: Mét tÖp bÊt kú cã tÇn suÊt xuÊt hiÖn cña c¸c kÝ tù sè nh b¶ng sau. Ký tù 0 TÇn suÊt 1532 1 152 2 323 3 412 4 226 5 385 6 602 7 92 8 112 9 87 B¶ng tÇn suÊt s¾p xÕp gi¶m dÇn KÝ tù 0 X¸c suÊt (%) 0.3906 6 0.1535 3 0.1051 5 0.0982 2 0.0824 4 0.0577 1 0.0388 8 0.0286 7 0.0235 9 0.0222 Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 19 §å ¸n tèt nghiÖp 0 6 3 5 2 4 1 8 7 9 0.3905 0.1535 0.1051 0.0982 0.0824 0.0577 0.0457 0.0388 0.3905 0.1535 0.1051 0.0982 0.0824 0.0577 0.0388 0.0286 0.0235 T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh 0.3905 0.1535 0.1051 0.0982 0.0824 0.0674 0.0577 0.3906 0.1535 0.1051 0.1034 0.0982 0.0824 0.3905 0.1535 0.1498 0.1051 0.1034 0.3905 0.2016 0.1535 0.1498 0.1051 0.3905 0.2549 0.2016 0.1535 0.3905 0.3551 0.2549 0.0982 0.0674 0.0457 0.0286 0.0222 M« t¶ : Ta tiÕn hµnh hîp nhÊt hay céng 2 tÇn suÊt nhá nhÊt ë cuèi b¶ng ®Ó thu ®îc gi¸ trÞ tÇn suÊt míi sau ®ã ®a gi¸ trÞ nµy trë l¹i b¶ng tÇn suÊt ban ®Çu ®· bá ®i 2 tÇn suÊt thµnh phÇn t¹o thµnh nã. Sau khi ®a gi¸ trÞ míi vµo b¶ng ta ph¶i tiÕn hµnh s¾p xÕp l¹i toµn bé b¶ng , lóc nµy sè lîng tÇn suÊt chØ cßn lµ n-1 nÕu ban ®Çu sè lîng tÇn suÊt lµ n. TiÕp tôc thùc hiÖn lÇn lît theo thø tù nh trªn cho ®Õn khi nµo sè lîng tÇn suÊt chØ cßn l¹i duy nhÊt 1 gi¸ trÞ. ViÖc t¹o c©y nhÞ ph©n cã thÓ ®îc thùc hiÖn theo mét thuËt to¸n sau: Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 20 0.6100 0.3905 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh 1. TÊt c¶ nh÷ng ký tù ban ®Çu ®îc xem nh lµ nh÷ng ký tù giao ®iÓm tù do. 2. Hai nót tù do víi tÇn sè xuÊt hiÖn thÊp nhÊt ®îc ph©n c«ng tíi mét nót gèc víi gi¸ trÞ b»ng víi tæng cña hai nót con tù do. 3. Hai nót con ®îc chuyÓn khái danh s¸ch nót tù do. ChuyÓn nót gèc míi t¹o thµnh c«ng vµo danh s¸ch. 0635241879 B0 4. Bíc hai sang bíc ba ®îc lÆp cho ®Õn khi chØ cã 1 nót tù do vÒ phÝa tr¸i. Nót tù do nµy lµ gèc cña c©y. Qu¸ 0tr×nh c©y nhÞ ph©n Huffman 6 3 5 x©y 2 4 1 dùng 8 0 6 3 5®îc 2 4 thÓ hiÖn chi tiÕt nh B2 trong h×nh sau : 1 9 B1 7 8 06352 B3 0635 B4 4 2 9 7 063 B5 1 B6 8 06 3 5 4 2 1 9 7 0 B7 0 B8 5 8 6 6 4 7 5 9 Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 4 7 3 2 1 9 Trang : 21 8 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh H×nh 2.3 : Qu¸ tr×nh t¹o c©y nhÞ ph©n Ta cã c©y m· Huffman t¬ng øng nh sau : 0 1 0 6 5 3 2 1 4 7 8 9 B¶ng tõ m· g¸n cho c¸c kÝ tù sè nh sau: KÝ tù 0 M· 1 6 001 Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 22 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh 3 011 5 0001 2 0100 4 00000 1 01010 8 01011 7 000010 9 000011 Nh vËy víi vÝ dô sau ®©y ta cã thÓ tiÕn hµnh m· ho¸ nh sau: Chuçi nguån : 00000000006666693333 kÝch thíc = 20*8=160 bit Sö dông m· Huffman theo b¶ng trªn kÝch thíc =10*1+5*3+1*6+4*3= 43 bit V× gÝa trÞ trÞ 0 xuÊt hiÖn 10 lÇn nhng chØ dïng 1 bit ®Ó thÓ hiÖn, gi¸ trÞ 6 xuÊt hiÖn 5 lÇn dïng 3 bit ®Ó thÓ hiÖn ,gi¸ trÞ 9 dïng 6 bit vµ gi¸ trÞ 3 xuÊt hiÖn 4 lÇn dïng 3 bit ®Ó thÓ hiÖn. Tû sè nÐn = 160 / 43 = 3.7 Trong ph¬ng ph¸p m· Huffman m· cña ký tù lµ duy nhÊt vµ kh«ng m· nµo lµ phÇn b¾t ®Çu cña m· tríc.V× vËy khi ®äc theo tõng bit tõ ®Çu ®Õn cuèi tÖp nÐn ta cã thÓ duyÖt c©y m· cho ®Õn mét l¸, tøc lµ ký tù ®· ®îc gi¶i m·. ViÖc gi¶i m· ch¾c ch¾n ph¶i sö dông c©y nhÞ ph©n gièng nh trong m· ho¸. §Ó ®äc, gi¶i m· ®îc yªu cÇu ph¶i sö dông theo ®óng tiªu chuÈn nhÊt ®Þnh . II.3.3.Mét sè thñ tôc ch¬ng tr×nh : • Ch¬ng tr×nh nÐn ph¬ng ph¸p HUFFMAN : bool CompressHuffman(BYTE*pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen) Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 23 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh { CHuffmanNode nodes[511]; for(int nCount = 0; nCount < 256; nCount++) nodes[nCount].byAscii = nCount; for(nCount = 0; nCount < nSrcLen; nCount++) nodes[pSrc[nCount]].nFrequency++; qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare); int nNodeCount = GetHuffmanTree(nodes); int nNodeSize = sizeof(DWORD)+sizeof(BYTE); nDesLen = nSrcLen+nNodeCount*nNodeSize; pDes = (BYTE*)malloc(nDesLen); BYTE *pDesPtr = pDes; memset(pDesPtr, 0, nDesLen); *(DWORD*)pDesPtr = nSrcLen; pDesPtr += sizeof(DWORD); *pDesPtr = nNodeCount-1; pDesPtr += sizeof(BYTE); for(nCount = 0; nCount < nNodeCount; nCount++) { memcpy(pDesPtr, &nodes[nCount], nNodeSize); pDesPtr += nNodeSize; } qsort(nodes, 256, sizeof(CHuffmanNode), asciiCompare); int nDesIndex = 0; for(nCount = 0; nCount < nSrcLen; nCount++) { *(DWORD*)(pDesPtr+(nDesIndex>>3))|=nodes[pSrc[nCount]].dwCodepParent) pRoot = pRoot->pParent; int nDesIndex = 0; DWORD nCode; nSrcIndex 3)))>>(nSrcIndex&7); Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 25 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh pNode = pRoot; while(pNode->pLeft) { pNode = (nCode&1) ? pNode->pRight : pNode->pLeft; nCode >>= 1; nSrcIndex++; } pDes[nDesIndex++] = pNode->byAscii; } return true; } II.4.Ph¬ng ph¸p m· ho¸ LZW: Kh¸i niÖm nÐn tõ ®iÓn ®îc Jocob Lempe vµ Abraham Ziv ®a ra lÇn ®Çu tiªn n¨m 1977 sau ®ã ph¸t triÓn thµnh mét hä gi¶i thuËt nÐn tõ ®iÓn LZ. N¨m 1984 Welch ®· c¶i tiÕn gi¶i thuËt LZ thµnh gi¶i thuËt míi hiÖu qu¶ h¬n vµ ®îc ®Æt tªn lµ LZW ( Lempe – Ziv - Welch). Ph¬ng ph¸p nµy x©y dùng tõ ®iÓn lu c¸c chuçi ký tù cã tÇn suÊt lÆp l¹i cao vµ thay thÕ b»ng tõ m· t¬ng øng mçi khi gÆp l¹i chóng, nã hay h¬n c¸c ph¬ng ph¸p tríc ®ã ë kü thuËt tæ chøc tõ ®iÓn cho phÐp n©ng cao tû lÖ nÐn. Gi¶i thuËt LZW ®îc dïng cho tÊt c¶ c¸c lo¹i file nhÞ ph©n, thêng ®îc dïng ®Ó nÐn c¸c lo¹i d÷ liÖu nh : v¨n b¶n, ¶nh ®en tr¾ng, ¶nh mµu, ¶nh ®a cÊp s¸m… vµ lµ chuÈn nÐn cho c¸c d¹ng ¶nh GIF vµ TIFF. Sè bit / pixel kh«ng ¶nh hëng ®Õn hiÖu qu¶ cña LZW. II.4.1.Nguyªn t¾c: Gi¶i thuËt nÐn LZW x©y dùng mét tõ ®iÓn lu c¸c mÉu cã tÇn suÊt xuÊt hiÖn cao trong ¶nh. Tõ ®iÓn lµ tËp hîp nh÷ng cÆp (tõ vùng vµ nghÜa cña tõ vùng). Trong ®ã tõ vùng sÏ lµ c¸c tõ m· ®îc s¾p xÕp theo thø tù nhÊt ®Þnh. NghÜa lµ mét chuçi con trong d÷ liÖu ¶nh. Tõ ®iÓn ®îc x©y dùng song song Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 26 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh víi qu¸ tr×nh ®äc d÷ liÖu. Sù xuÊt hiÖn cña chuçi con trong tõ ®iÓn kh¼ng ®Þnh r»ng chuçi ®ã ®· tõng xuÊt hiÖn trong phÇn d÷ liÖu ®· ®ùoc ®äc qua. ThuËt to¸n liªn tôc tra cøu vµ sau mçi lÇn ®äc mét ký tù ë d÷ liÖu ®Çu vµo th× tiÕn hµnh cËp nhËt l¹i tõ ®iÓn. Do giíi h¹n cña bé nhí vµ ®Ó ®¶m b¶o tèc ®é t×m kiÕm nhanh, tõ ®iÓn chØ giíi h¹n 4096 phÇn tö dïng ®Ó lu tr÷ gi¸ trÞ cña c¸c tõ m·. Nh vËy ®é dµi lín nhÊt cña tõ m· lµ 12 bit (4096=212). CÊu tróc tõ ®iÓn nh sau: 0 1 … … 255 256 257 258 259 … … 4095 0 1 … … 255 256 257 Chuçi Chuçi … … Chuçi (Clear Code) (End Of Information) • 256 tõ m· ®Çu tiªn theo thø tù tõ 0 … 255 chøa c¸c sè nguyªn tõ 0 … 255. §©y lµ m· cña 256 kÝ tù c¬ b¶n trong b¶ng m· ASCII. • Tõ m· thø 256 chøa mét m· ®Æc biÖt lµ m· xo¸ (CC - Clear Code). Khi sè mÉu lÆp lín h¬n 4096 th× ngêi ta sÏ coi ¶nh gåm nhiÒu m¶nh ¶nh vµ tõ ®iÓn sÏ gåm nhiÒu tõ ®iÓn con. Khi hÕt mét m¶nh ¶nh sÏ göi 1 m· xo¸ ( CC ) ®Ó b¸o hiÖu kÕt thóc m¶nh ¶nh cò vµ b¾t ®Çu m¶nh ¶nh míi ®ång thêi sÏ khëi t¹o l¹i tõ ®iÓn. • Tõ m· thø 257 chøa m· kÕt thóc th«ng tin (EOI - End Of Information). Th«ng thêng mét file ¶nh GIF cã thÓ chøa nhiÒu m¶nh ¶nh, Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 27 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh mçi m¶nh ¶nh nµy sÏ ®îc m· ho¸ riªng. Ch¬ng tr×nh gi¶i m· sÏ lÆp ®i lÆp l¹i thao t¸c gi¶i m· tõng ¶nh cho ®Õn khi gÆp m· kÕt thóc th«ng tin th× dõng l¹i. • C¸c tõ m· cßn l¹i (tõ 258 ®Õn 4095) chøa c¸c mÉu thêng lÆp l¹i trong ¶nh. 512 phÇn tö ®Çu tiªn cña tõ ®iÓn biÓu diÔn b»ng 9 bit. C¸c tõ m· tõ 512 ®Õn 1023 biÓu diÔn bëi 10 bit, tõ 1024 ®Õn 2047 biÓu diÔn bëi 11 bit, vµ tõ 2048 ®Õn 4095 biÓu diÔn bëi 12 bit. VÝ dô : Cho chuçi ®Çu vµo “HELLOHELLOHELL” Tõ ®iÒn ban ®Çu ®· gåm 256 kÝ tù c¬ b¶n. KÝch thíc ®Çu vµo : 14 x 8 = 112 bit §Çu vµo H(72) E(69) L(76) L O(79) H E L L O H E L L §Çu ra 72 69 76 76 79 258 260 262 259 76 EOI Thùc hiÖn H ®· cã trong tõ ®iÓn ®äc tiÕp Thªm vµo tõ ®iÓn m· 258 ®¹i diÖn cho chuçi HE Thªm vµo tõ ®iÓn m· 259 ®¹i diÖn cho chuçi EL Thªm vµo tõ ®iÓn m· 260 ®¹i diÖn cho chuçi LL Thªm vµo tõ ®iÓn m· 261 ®¹i diÖn cho chuçi LO Thªm vµo tõ ®iÓn m· 262 ®¹i diÖn cho chuçi OH HE ®· cã trong tõ ®iÓn ®äc tiÕp Thªm vµo tõ ®iÓn m· 263 ®¹i diÖn cho chuçi HEL LL ®· cã trong tõ ®iÓn ®äc tiÕp Thªm vµo tõ ®iÓn m· 264 ®¹i diÖn cho chuçi LLO OH ®· cã trong tõ ®iÓn ®äc tiÕp Thªm vµo tõ ®iÓn m· 265 ®¹i diÖn cho chuçi OHE EL ®· cã trong tõ ®iÓn ®äc tiÕp Thªm vµo tõ ®iÓn m· 266 ®¹i diÖn cho chuçi ELL Input = FALSE Chuçi ®Çu ra lµ : 72 69 76 76 79 258 260 262 259 76 KÝch thíc ®Çu ra : 6 x 8 + 4 x 9 = 84 bit Tû sè nÐn : 112 / 84 = 1.3 Qu¸ tr×nh gi¶i nÐn thùc hiÖn nh sau: Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 28 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh AddToDictionary() Code OutBuff() 72 H 69 E 258 HE 76 L 259 EL 76 L 260 LL 79 O 261 LO 258 HE 262 OHE 260 LL 263 HEL 262 OH 264 LLO 259 EL 265 OHE 76 L 266 CodeWord String ELL EOI Chuçi thu ®îc sau gi¶i nÐn :”HELLOHELLOHELL” II.4.2. ThuËt to¸n: • ThuËt to¸n nÐn b»ng LZW: InitDictionary() Output(Clear_Code) OldStr = NULL Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 29 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh WHILE ( Input ) { NewChar = GetNextChar() NewStr = OldStr + NewChar IF ( InDictionary(NewStr) ) OldsSr = NewStr ELSE { Output(Code(OldStr)) AddToDictionary(NewStr) OldStr = NewChar } } Output(Code(OldStr)) Output(EOI) • Gi¸ trÞ cê Input = TRUE khi vÉn cßn d÷ liÖu ®Çu vµo vµ ngîc l¹i. Chøc n¨ng cña c¸c hµm: • Hµm InitDictionary() : Khëi t¹o tõ ®iÓn. §Æt gi¸ trÞ cho 256 phÇn tö ®Çu tiªn. G¸n m· xo¸ CC cho phÇn tö thø 256 vµ m· kÕt thóc th«ng tin EOI cho phÇn tö thø 257. Xo¸ gi¸ trÞ tÊt c¶ c¸c phÇn tö cßn l¹i. • Hµm InDictionary (NewStr) : KiÓm tra chuçi NewStr ®· cã trong tõ ®iÓn cha . • Hµm OutPut() : Göi chuçi bit ra file.Tuú thuéc vµo vÞ trÝ cña tõ m· trong tõ ®iÓn mµ chuçi bit cã ®é dµi lµ 9,10,11 hoÆc 12. • Hµm GetNextChar() : Tr¶ vÒ mét ký tù tõ chuçi ký tù ®Çu vµo. Hµm nµy cËp nhËt gi¸ trÞ cê Input x¸c ®Þnh xem cßn d÷ liÖu ®Çu vµo n÷a hay kh«ng. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 30 §å ¸n tèt nghiÖp • T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Hµm AddToDictionary() : Hµm lµm chøc n¨ng cËp nhËt mÉu míi vµo phÇn tö tiÕp theo trong tõ ®iÓn. NÕu tõ ®iÓn ®· ®Çy nã sÏ göi ra m· xo¸ CC vµ gäi ®Õn hµm InitDictionary() ®Ó khëi t¹o l¹i tõ ®iÓn. • Hµm Code() : Tr¶ vÒ tõ m· øng víi 1 chuçi. T tëng cña ®o¹n m· trªn cã thÓ hiÓu nh sau: NÕu cßn d÷ liÖu ®Çu vµo th× tiÕp tôc ®äc. Mét chuçi míi sÏ ®îc t¹o ra tõ chuçi cò (chuçi nµy ban ®Çu rçng, chuçi nµy ph¶i lµ chuçi ®· tån t¹i trong tõ ®iÓn) vµ ký tù võa ®äc vµo. Sau ®ã kiÓm tra xem chuçi míi ®· cã trong tõ ®iÓn hay cha. Môc ®Ých cña c«ng viÖc nµy lµ hi väng t×m ®îc chuçi cã sã ký tù lín nhÊt trong tõ ®iÓn. NÕu tån t¹i th× l¹i tiÕp tôc ®äc mét ký tù tiÕp theo vµ lÆp l¹i c«ng viÖc. NÕu cha cã trong tõ ®iÓn, th× göi chuçi cò ra ngoµi vµ thªm chuçi míi vµo tõ ®iÓn. • Gi¶i nÐn d÷ liÖu b»ng LZW: Gi¶i thuËt gi¶i nÐn gÇn nh ngîc víi gi¶i thuËt nÐn. Víi gi¶i thuËt nÐn, mét tõ m· øng víi mét chuçi sÏ ®îc ghi ra tÖp khi chuçi ghÐp bëi chuçi trªn víi ký tù võa ®äc cha cã mÆt trong tõ ®iÓn. Ngêi ta còng cËp nhËt ngay vµo tõ ®iÓn tõ m· øng víi chuçi t¹o bëi chuçi cò víi ký tù võa ®äc. Ký tù nµy ®ång thêi lµ ký tù ®Çu tiªn trong chuçi øng víi tõ m· sÏ ®îc ghi ra tiÕp theo. ThuËt to¸n ®îc m« t¶ nh sau: WHILE (GetNextCode() != EOI) { IF (First_Code) /*M· ®Çu tiªn cña mçi m¶nh ¶nh*/ { OutBuff(DeCode(code)) OldStr = DeCode(code) Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 31 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh } ELSE { IF (code == CC) /*M· xo¸*/ { InitDictionary() First_Code = TRUE } NewStr = DeCode(code) OutBuff(NewStr) OldStr = OldStr + FirstChar(NewStr) AddToDictionary(OldStr) OldStr = NewStr } } • Gi¸ trÞ cê First_Code = TRUE chØ m· võa ®äc lµ m· ®Çu tiªn cña mçi m¶nh ¶nh. Chøc n¨ng cña c¸c hµm: • M· CC b¸o hiÖu hÕt mét m¶nh ¶nh. M· EOI b¸o hiÖu hªt toµn bé th«ng tin ¶nh. • Hµm GetNextCode() : Hµm nµy ®äc th«ng tin ®Çu vµo (d÷ liÖu nÐn) tr¶ vÒ m· t¬ng øng. • Hµm OutBuff() : Hµm nµy göi chuçi ®· gi¶i m· ra vïng nhí ®Öm. • Hµm InitDictionary(): Khëi t¹o tõ ®iÓn. §Æt gi¸ trÞ cho 256 phÇn tö ®Çu tiªn. G¸n m· xo¸ CC cho phÇn tö thø 256 vµ m· kÕt thóc th«ng tin EOI cho phÇn tö thø 257. Xo¸ gi¸ trÞ tÊt c¶ c¸c phÇn tö cßn l¹i. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 32 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh • Hµm DeCode() : Hµm nµy tra cøu tõ ®iÓn vµ tr¶ vÒ chuçi ký tù t¬ng øng víi m·. • Hµm FirstChar() : LÊy ký tù ®Çu tiªn cña mét chuçi. Ký tù võa x¸c ®Þnh nèi tiÕp vµo chuçi ký tù cò (®· gi¶i m· ë bíc tríc) ta ®îc chuçi ký tù cã mÆt trong tõ ®iÓn khi nÐn. Chuçi nµy sÏ ®îc thªm vµo tõ ®iÓn gi¶i nÐn. • Hµm AddToDictionary() : Hµm lµm chøc n¨ng cËp nhËt mÉu míi vµo phÇn tö tiÕp theo trong tõ ®iÓn. NÕu tõ ®iÓn ®· ®Çy nã sÏ göi ra m· xo¸ CC vµ gäi ®Õn hµm InitDictionary() ®Ó khëi t¹o l¹i tõ ®iÓn.. II.4.3.Mét sè thñ tôc ch¬ng tr×nh : • Ch¬ng tr×nh nÐn ph¬ng ph¸p LZW : BOOL CLZW::Compress(CFile &source, CFile &destination) { long prefix = 0; long result = 0; BYTE readByte = 0; unsigned long filetotal = 0; CString logString; DWORD resAdd = 256; Init(); filetotal = source.GetLength(); if (m_tudien == NULL) { CreateDictionary(); } source.Read(&prefix, 1); while (source.GetPosition() < filetotal) { source.Read(&readByte, 1); Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 33 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh result = m_tudien->GetEntry(prefix, readByte); if (result == -1) { resAdd = m_tudien->AddEntry(prefix, readByte); CalculateBitSize(resAdd); logString.Format("Adding combination of %d and %d to dictionary to entry %d.",prefix, readByte, resAdd); Log(logString); CompressData(destination, prefix); prefix = readByte; result = -1; } else { prefix = result; readByte = 0; } } CompressData(destination, prefix); CloseCompressedFile(destination); ClearDictionary(); return TRUE; } • Ch¬ng tr×nh gi¶i nÐn ph¬ng ph¸p LZW : BOOL CLZW::Decompress(CFile &source, CFile &destination) { DWORD prefix = 0, data = 0; CString logString; CByteArray decodeString; BYTE writeData = 0, character = 0; Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 34 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh int counter = 0; Init(); if (m_tudien == NULL) { CreateDictionary(); } prefix = DecompressData(source); character = (BYTE)prefix; destination.Write(&prefix, 1); while ((data = DecompressData(source)) != m_MaxCode[m_MaxBits]) { if (!m_tudien->IsCodeExist(data)) { decodeString.Add((BYTE)character); m_tudien->GetBytesFromCode(&decodeString, prefix); } else { m_tudien->GetBytesFromCode(&decodeString, data); character = decodeString.GetAt(decodeString.GetSize() - 1); } counter = decodeString.GetSize(); while (counter > 0) { writeData = (BYTE)decodeString.GetAt(--counter); destination.Write(&writeData, 1); Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 35 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh logString.Format("Adding character code %d with know visualisation of: %s", writeData, convertASCIIToText(writeData)); Log(logString); } decodeString.RemoveAll(); m_tudien->AddEntry(prefix, (BYTE)character); CalculateBitSize(m_tudien->GetMaxCode()+1); prefix = data; } return TRUE; } II.5.Ph¬ng ph¸p m· ho¸ JPEG: II.5.1.Nguyªn t¾c: JPEG lµ viÕt t¾t cña Joint Photographic Expert Group ( nhãm c¸c chuyªn gia ®å ho¹ ph¸t triÓn chuÈn nµy ). ChuÈn nµy ®îc ph¸t triÓn tõ gi÷a thËp niªn 80 bëi sù hîp t¸c cña tæ chøc ISO vµ ITU vµ ®Õn 1992 ®îc c«ng Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 36 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh nhËn lµ chuÈn ¶nh quèc tÕ ,phôc vô c¸c øng dông vÒ ¶nh cho c¸c lÜnh vùc nh m¹ng, y häc, khoa häc kü thuËt, ¶nh nghÖ thuËt … ChuÈn JPEG ®îc sö dông ®Ó m· ho¸ ¶nh ®a møc x¸m, ¶nh mµu. JPEG kh«ng cho kÕt qu¶ æn ®Þnh l¾m víi ¶nh ®en tr¾ng, nã cung cÊp c¶ 2 chÕ ®é nÐn : nÐn mÊt m¸t th«ng tin vµ nÐn kh«ng tæn thÊt. Do ®é phøc t¹p vµ hiÖu suÊt nÐn cña JPEG kh«ng mÊt m¸t th«ng tin mµ nã kh«ng ®îc sö dông phæ biÕn .Díi ®©y chØ tr×nh bµy chi tiÕt vÒ mét trong c¸c d¹ng nÐn biÕn ®æi chÊp nhËn mÊt m¸t th«ng tin dïng biÕn ®æi Cosin tuÇn tù ( Sequential DTCBased) cña chuÈn JPEG. II.5.2.ThuËt to¸n: M· ho¸ JPEG bao gåm nhiÒu c«ng ®o¹n, s¬ ®å thuËt to¸n nÐn vµ gi¶i nÐn ®îc m« t¶ nh díi ®©y ¶nh gèc P h © n k h è i 8x8 DCT Lîng tö ho¸ M· ho¸ B¶ng l îng tö B¶ng m· ¶nh nÐn 8x8 8x8 Khèi 8x8 8x8 H×nh 2.5.1 : Qu¸ tr×nh nÐn ¶nh theo chuÈn JPEG Qu¸ tr×nh gi¶i nÐn sÏ ®îc thùc hiÖn ngîc l¹i, ngêi ta dùa vµo c¸c th«ng tin liªn quan ghi trong phÇn Header cña file nÐn ®Ó gi¶i m· tõng phÇn ¶nh nÐn øng víi ph¬ng ph¸p nÐn. KÕt qu¶ thu ®îc lµ hÖ sè ®· lîng tö. C¨n cø vµo b¶ng lîng tö sÏ kh«i phôc l¹i gi¸ trÞ tríc khi lîng tö ho¸ cña c¸c hÖ sè nµy. Cuèi cïng lµ biÕn ®æi Cosin ngîc ®Ó thu l¹i ®îc ¶nh nh ban ®Çu . ¶nh nÐn Gi¶i m· T¬ng tù ho¸ Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 B¶ng B¶ng m· lîng tö DCT ngîc ¶nh gi¶i nÐn Trang : 37 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh H×nh 2.5.2 : Qu¸ tr×nh gi¶i nÐn ¶nh JPEG A. Chia ¶nh thµnh khèi ChuÈn nÐn JPEG ph©n ¶nh ra c¸c khèi 8x8. BiÕn ®æi nhanh Cosin 2 chiÒu cho c¸c khèi 8x8 sÏ ®¹t hiÖu qu¶ h¬n, viÖc biÕn ®æi Cosin cho c¸c khèi cã cïng kÝch cì cã thÓ gi¶m ®îc mét phÇn c¸c tÝnh to¸n chung nh viÖc tÝnh hÖ sè Cij . Khi n = 8 chóng ta chØ cÇn tÝnh hÖ sè C ij cho 3 tÇng (8 = 23), sè c¸c hÖ sè lµ: 4 + 2 + 1 = 7 NÕu víi mét ¶nh 512x512, phÕp biÕn ®æi nhanh Cosin mét chiÒu theo hµng ngang hoÆc hµng däc ta ph¶i cÇn qua 9 tÇng (512 = 2 9). Sè c¸c hÖ sè Cij lµ: 256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 +1 =509. Nh vËy thêi gian tÝnh c¸c hÖ sè Cij cho ¶nh 512x512 lín gÊp 72 lÇn so víi thêi gian tÝnh to¸n c¸c hÖ sè nµy cho tõng khèi 8x8 , nÕu kÝch thíc ¶nh lín h¬n th× chi phÝ thêi gian sÏ cßn t¨ng gÊp nhiÒu lÇn ®ång thêi cßn gióp viÖc tÝnh to¸n trong khi biÕn ®æi Cosin chÝnh x¸c h¬n. ¶nh sÏ chia lµm B khèi víi: M ' N' B = × = M B × NB k l C¸c khèi ®îc x¸c ®Þnh bëi bé sè (m,n) víi m=[0..MB-1] vµ n=[0..NB-1]. Sinh viªn thùc hiÖn : T¹ Minh Th¾ng CT 702 Trang : 38 §å ¸n tèt nghiÖp T×m hiÓu mét sè ph¬ng ph¸p nÐn ¶nh Trong ®ã : m : thø tù cña khèi theo chiÒu réng. n : thø tù cña khèi theo chiÒu dµi. Ph©n khèi thùc chÊt lµ x¸c ®Þnh t¬ng quan gi÷a to¹ ®é riªng trong khèi víi t¹o ®é thùc cña ®iÓm ¶nh trong ¶nh ban ®Çu. NÕu ¶nh ban ®Çu ký hiÖu Image[i,j] th× ma trËn biÓu diÔn khèi (m,n) lµ x[u,v] ®îc tÝnh: x[u,v] = Image[mk + u, nl + v] B. BiÕn ®æi §©y lµ c«ng ®o¹n quan träng cña c¸c ph¬ng ph¸p nÐn sö dông phÐp biÕn ®æi, nhiÖm vô cña c«ng ®o¹n nµy lµ tËp trung n¨ng lîng vµo mét sè Ýt c¸c hÖ sè biÕn ®æi. C«ng thøc biÕn ®æi cho mçi khèi lµ: ε ε X ( k1 , k 2 ) = k1 k 2 4 7 7 ∑ ∑ x(n , n )Cos n1=0 n 2= 0 1 2 (2n1 + 1)k1Π (2n2 + 1)k 2 Π Cos 16 16 Trong ®ã: εk 1 1 = 2 0 εk 2 1 = 2 0 Khi k1 = 0 Khi (0[...]... Tìm hiểu một số phơng pháp nén ảnh Đối với ảnh chiều dài của một dãy lặp có thể lớn hơn 255, nếu ta dùng 1 byte để lu trữ chiều dài thì sẽ không đủ Giải pháp đợc dùng là tách chuỗi đó thành 2 chuỗi: một chuỗi có chiều dài là 255, chuỗi kia có chiều dài còn lại Phơng pháp nén RLE chỉ đạt hiệu quả khi chuỗi lặp lớn hơn 1 ngỡng nhất định nào đó hay nói các khác trong ảnh cần nén phải có nhiều điểm ảnh. .. Thắng CT 702 4 7 3 2 1 9 Trang : 21 8 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh Hình 2.3 : Quá trình tạo cây nhị phân Ta có cây mã Huffman tơng ứng nh sau : 0 1 0 6 5 3 2 1 4 7 8 9 Bảng từ mã gán cho các kí tự số nh sau: Kí tự 0 Mã 1 6 001 Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 22 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh 3 011 5 0001 2 0100 4 00000 1 01010 8 01011 7 000010... Information) Thông thờng một file ảnh GIF có thể chứa nhiều mảnh ảnh, Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 27 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh mỗi mảnh ảnh này sẽ đợc mã hoá riêng Chơng trình giải mã sẽ lặp đi lặp lại thao tác giải mã từng ảnh cho đến khi gặp mã kết thúc thông tin thì dừng lại Các từ mã còn lại (từ 258 đến 4095) chứa các mẫu thờng lặp lại trong ảnh 512 phần tử... 10 Giả sử kí tự tiền tố là + ta có : 5 8 4 +7 8 + 9 10 Tỷ số nén = 19 / 9 = 2.1 Tuy nhiên trong một số trờng hợp các điểm ảnh có độ tơng quan với nhau vể giá trị mức xám nh trong ví dụ dới đây ta có thể tiến hành xử lý nh sau Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 11 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh Ví dụ: Ta có một chuỗi nguồn: d = 5 7 9 11 13 18 28 38 48 58 55 60 65... tiên theo thứ tự từ 0 255 chứa các số nguyên từ 0 255 Đây là mã của 256 kí tự cơ bản trong bảng mã ASCII Từ mã thứ 256 chứa một mã đặc biệt là mã xoá (CC - Clear Code) Khi số mẫu lặp lớn hơn 4096 thì ngời ta sẽ coi ảnh gồm nhiều mảnh ảnh và từ điển sẽ gồm nhiều từ điển con Khi hết một mảnh ảnh sẽ gửi 1 mã xoá ( CC ) để báo hiệu kết thúc mảnh ảnh cũ và bắt đầu mảnh ảnh mới đồng thời sẽ khởi tạo lại... Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh II.3.Phơng pháp mã hoá Huffman: II.3.1 Nguyên tắc: Phơng pháp mã hoá Huffman là phơng pháp dựa vào mô hình thống kê Ngời ta tính tần suất xuất hiện của các ký tự bằng cách duyệt tuần tự từ đầu tệp gốc đến cuối tệp Việc xử lý ở đây tính theo bit Trong phơng pháp này các ký tự có tần suất cao một từ mã ngắn, các ký tự có tần suất thấp một từ mã dài Nh... toàn bộ bảng , lúc này số lợng tần suất chỉ còn là n-1 nếu ban đầu số lợng tần suất là n Tiếp tục thực hiện lần lợt theo thứ tự nh trên cho đến khi nào số lợng tần suất chỉ còn lại duy nhất 1 giá trị Việc tạo cây nhị phân có thể đợc thực hiện theo một thuật toán sau: Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 20 0.6100 0.3905 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh 1 Tất cả những ký... Trang : 25 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh pNode = pRoot; while(pNode->pLeft) { pNode = (nCode&1) ? pNode->pRight : pNode->pLeft; nCode >>= 1; nSrcIndex++; } pDes[nDesIndex++] = pNode->byAscii; } return true; } II.4.Phơng pháp mã hoá LZW: Khái niệm nén từ điển đợc Jocob Lempe và Abraham Ziv đa ra lần đầu tiên năm 1977 sau đó phát triển thành một họ giải thuật nén từ điển LZ Năm 1984... x 9 = 84 bit Tỷ số nén : 112 / 84 = 1.3 Quá trình giải nén thực hiện nh sau: Sinh viên thực hiện : Tạ Minh Thắng CT 702 Trang : 28 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh AddToDictionary() Code OutBuff() 72 H 69 E 258 HE 76 L 259 EL 76 L 260 LL 79 O 261 LO 258 HE 262 OHE 260 LL 263 HEL 262 OH 264 LLO 259 EL 265 OHE 76 L 266 CodeWord String ELL EOI Chuỗi thu đợc sau giải nén :HELLOHELLOHELL... Minh Thắng CT 702 Trang : 18 Đồ án tốt nghiệp Tìm hiểu một số phơng pháp nén ảnh Quá trình giải nén cũng khá đơn giản đợc tiến hành theo chiều ngợc lại Ngời ta cũng phải dựa vào bảng mã tạo ra trong giai đoạn nén (bảng này đợc lu trữ trong cấu trúc đầu của tệp nén cùng với dữ liệu nén) Ví dụ: Một tệp bất kỳ có tần suất xuất hiện của các kí tự số nh bảng sau Ký tự 0 Tần suất 1532 1 152 2 323 3 412 4 226 ... vợt trội so với chuẩn nén trớc đem lại hiệu nén cao , cho ảnh nén chất lợng tốt nhiều u điểm khác mà chuẩn nén trớc có Nội dung đồ án tốt nghiệp bao gồm phần nh : chơng giới thiệu tổng quan xử... dựng từ điển lu chuỗi ký tự có tần suất lặp lại cao thay từ mã tơng ứng gặp lại chúng, hay phơng pháp trớc kỹ thuật tổ chức từ điển cho phép nâng cao tỷ lệ nén Giải thuật LZW đợc dùng cho tất loại... prefix = 0; long result = 0; BYTE readByte = 0; unsigned long filetotal = 0; CString logString; DWORD resAdd = 256; Init(); filetotal = source.GetLength(); if (m_tudien == NULL) { CreateDictionary();