Sunday, January 5, 2014

JPEG ဆုိတာ ဘာလဲ (၃)



(ဂ) DCT (descrete cosine transform) နည္းျဖင္႔ ေျပာင္းလဲျခင္း

ပုံကုိ downsample လုပ္ျပီးတဲ႔အခါမွာ ရလာတဲ႔ တန္ဖုိးေတြကုိ DCT နည္းနဲ႔ matrixရေအာင္ ေျပာင္းယူရပါတယ္။
DCTဆုိတာကုိ ရွင္းျပရင္ေတာ႔ သခ်ၤာပုိင္းေတြကုိ ေရာက္သြားမွာျဖစ္ျပီး ေတာ္ေတာ္ေလး ရွည္ရွည္ေ၀းေ၀းျဖစ္သြားမွာမုိ႔ အႀကမ္းဖ်င္းပဲ ေျပာပါမယ္။ (သခ်ၤာပုိင္းေတြက ခက္ခဲျပီး ကြ်န္ေတာ္ သိပ္နားမလည္တာလဲ ပါပါတယ္။) ေနာက္ျပီး သခ်ၤာပုိင္းေတြကုိ အတိအက်သိစရာမလုိတဲ႔အတြက္လဲ အဲဒီအပုိင္းကုိ ေခါင္းထဲထည္႔စရာမလုိပါဘူး။ matrix သခ်ၤာကုိ နားလည္ရင္ ရပါျပီ။ (matrixသခ်ၤာနားလည္ဖုိ႔ေတာ႔ လုိကုိလုိပါမယ္။)
ကြ်န္ေတာ္နားလည္သလုိ အလြယ္နည္းအတုိင္းပဲ ကြ်န္ေတာ္ဆက္ရွင္းသြားပါမယ္ေနာ္။
အထက္အဆင္႔ေတြမွာ pixelတစ္ခုခ်င္းစီအတြက္ YCbCr componentsေတြနဲ႔ downsample လုပ္ျပီးခဲ႔ပါျပီ။ အဲဒီေနာက္ ရရွိလာတဲ႔ pixelတစ္ကြက္ခ်င္းစီကုိ 8x8 blockမ်ား အျဖစ္ ဖန္တီးလုိက္ပါတယ္။ 8x8 ဘေလာ႔ကြက္ဆုိတာကေတာ႔ ေအာက္ကပုံအတုိင္းပါ။


အလ်ားလုိက္ အကြက္ရွစ္ကြက္၊ ေဒါင္လုိက္ အကြက္ရွစ္ကြက္ ပုံစံ၊ စုစုေပါင္း ေျခာက္ဆယ္႔ေလးကြက္ ရွိပါမယ္။
ဒီလုိလုပ္ရတာကေတာ႔ matrix လုိခ်င္လုိ႔ပါ။ 8x8 block ျဖစ္တဲ႔အတြက္ matrix ကလည္း 8x8 matrix ပဲ ျဖစ္ပါမယ္။
ရလာတဲ႔အကြက္ေတြမွာ တစ္ကြက္ခ်င္းစီတုိင္းအတြက္ တန္ဖုိးေတြရွိပါတယ္။ အထက္အဆင္႔ေတြက ရရွိထားတဲ႔ အလင္းအေမွာင္အေရာင္ဆုိတဲ႔ တန္ဖုိးေတြေပါ႔။ နားလည္လြယ္သြားေအာင္ ဥပမာတစ္ခုထားျပီး ကြ်န္ေတာ္ျပသြားခ်င္ပါတယ္။ မူရင္းပုံေသနည္းေတြေတာ႔ ရွိပါတယ္။ ဒါေပမယ္႔ အဲဒီပုံေသနည္းဖတ္ရုံနဲ႔ ကြ်န္ေတာ္နားမလည္ခဲ႔ဘဲ ဥပမာတစ္ခုႀကည္႔ရင္းနဲ႔သာ နားလည္ခဲ႔တာမုိ႔ပါ။


အထက္ေဖာ္ျပပါပုံဟာ DCT matrix ရယူတဲ႔ ပုံေသနည္းတစ္ခုပါပဲ။ ကြ်န္ေတာ္ကေတာ႔ အဲဒီပုံေသနည္းနဲ႔ နားမလည္ခဲ႔တာမုိ႔ တျခားနားလည္ခဲ႔တဲ႔ပုံေသနည္းနဲ႔ ရွင္းျပခ်င္ပါတယ္။
အရင္ဆုံး ကြ်န္ေတာ္ T matrix ကုိ လုိအပ္ပါတယ္။ T matrix ရယူႏုိင္မယ္႔ ပုံေသနည္းကေတာ႔


T matrix က ဘာလဲဆုိရင္ T matrixလုိ႔ပဲ သိထားတာ ပုိေကာင္းပါတယ္။ သူက DCTလုပ္တဲ႔အခါ လုိအပ္တဲ႔ D matrix တြက္ခ်က္တဲ႔ေနရာမွာ လုိအပ္တဲ႔ matrixတစ္ခုပါ။
ပုံေသနည္းထဲက Nဆုိတဲ႔ ေနရာမွာ ကြ်န္ေတာ္တုိ႔ အေပၚက ခြဲခဲ႔တဲ႔ blockက ဂဏန္းကုိ ယူပါတယ္။ 8x8 ျဖစ္တဲ႔အတြက္ 8ကုိ ယူပါတယ္။ i ဟာ ရလာမယ္႔ matrixရဲ႕ ေဒါင္လုိက္ နံပါတ္ဂဏန္းျဖစ္ျပီး j ကေတာ႔ အလ်ားလုိက္ နံပါတ္ျဖစ္ပါတယ္။


ေဖာ္ျပပါပုံမွာ ေရွ႕ဂဏန္းသည္ i ကုိ ကုိယ္စားျပဳျပီး ေနာက္ဂဏန္းသည္ j ကုိ ကုိယ္စားျပဳပါတယ္။
အထက္က ေဖာ္ျပထားတဲ႔ T ပုံေသနည္းအတုိင္း ထည္႔တြက္လုိက္တဲ႔အခါ ေအာက္ပါ matrix ကုိ ရရွိပါတယ္။


ရရွိလာတဲ႔ T matrixကုိ သိမ္းထားျပီး ကြ်န္ေတာ္တုိ႔ downsampleလုပ္ထားတဲ႔ pixelတစ္ခုခ်င္းစီအလုိက္ ခြဲထားေသာ 8x8 blockအတုိင္း ရရွိထားတဲ႔ တန္ဖုိးေတြကုိ ေအာက္ပါ 8x8 matrix ထဲမွာ ရွိေနပါတယ္။ ဒီေနရာမွာ မူရင္းရုိက္ယူထားတဲ႔ ပုံနဲ႔ ကုိယ္ရယူမယ္႔ pixelေနရာကုိ လုိက္ျပီး တန္ဖုိးေတြက အေျပာင္းအလဲ ရွိေနမွာျဖစ္ပါတယ္။ ေအာက္ေဖာ္ျပပါ matrixဟာ နမူနာတစ္ခုစာသာ ျဖစ္ပါတယ္။


ဒီ မူရင္းတန္ဖုိး matrixကေန M matrix ရရွိေအာင္ တြက္ယူရပါမယ္။ M matrix ဆုိတာကလည္း D matrix ရေအာင္ တြက္ဖုိ႔ လုိအပ္တဲ႔ matrixတစ္ခုပါပဲ။
M matrix ကုိ ရဖုိ႔ရန္ မူရင္းတန္ဖုိး matrixထဲကေန 128 ကုိ ႏႈတ္ေပးသြားရမွာ ျဖစ္ပါတယ္။ ဘာလုိ႔လဲဆုိေတာ႔ ကြ်န္ေတာ္တုိ႔ အသုံးျပဳထားတာဟာ 8x8 block ျဖစ္တဲ႔အတြက္ေႀကာင္႔ digital နည္းအရ ႏွစ္ ရွစ္ထပ္ ဟာ 256 နဲ႔ ညီမွ်ျပီး 256ကုိ အေပါင္းနဲ႔ အႏႈတ္ အညီအမွ်ခြဲေ၀လုိက္တဲ႔အခါ -128 ကေန 127အထိ ရပါတယ္။ 0ကုိလည္း အေပါင္းဂဏန္းအျဖစ္ ထည္႔တြက္ထားပါတယ္။ M matrixကုိ တြက္တဲ႔အခါ အထဲမွ ဂဏန္းတုိင္းဟာ သည္အတုိင္းအတာအတြင္းမွာပဲ ရွိေနရမွာျဖစ္တဲ႔အတြက္ အားလုံးကုိ အညီအမွ် 128နဲ႔ ႏႈတ္လုိက္ျခင္းပါပဲ။ ဒါေႀကာင္႔ M matrixဟာ ေအာက္ပါအတုိင္း ျဖစ္သြားပါတယ္။


M matrix ကုိ ရရွိတဲ႔အခါ ကြ်န္ေတာ္တုိ႔ D matrixကုိ ဆက္တြက္လုိ႔ရပါျပီ။
ေအာက္ပါ ပုံေသနည္းအတုိင္း တြက္ႏုိင္ပါတယ္။


ပုံေသနည္းထဲက ေနာက္ဆုံး T အေပၚက မ်ဥ္းေႀကာင္းေလးနဲ႔ အကၡရာဟာ တီပရုိင္းလုိ႔ ေခၚျပီး Inverse matrix ျဖစ္ပါတယ္။ ကြ်န္ေတာ္တုိ႔ အေစာပုိင္းက တြက္ခ်က္ရရွိထားတဲ႔ T matrixကုိ ေျပာင္းျပန္ (Inverse) ယူလုိက္တာပါ။ ပုံမွန္သခ်ၤာတြက္နည္းလုိ 23ကုိ 32လုိ႔ ယူလုိက္တာမဟုတ္ဘဲ Inverse matrixတြက္နည္းဟာ matrix သခ်ၤာမွာ တြက္နည္းသက္သက္ရွိတာမုိ႔ အရွည္မရွင္းေတာ႔ပါဘူး။ Inverse matrixတြက္နည္းနဲ႔ တြက္ယူလုိက္တယ္လုိ႔ သိထားရင္ ျဖစ္ပါတယ္။ ေနာက္ျပီး ပုံေသနည္းပါ တီ၊ အမ္မ္ နဲ႔ တီပရုိင္းတုိ႔ဟာ အခ်င္းခ်င္းေျမွာက္ထားႀကတာျဖစ္ျပီး matrixသခ်ၤာမွ matrixေျမွာက္နည္းနဲ႔ပဲ ေျမွာက္ႀကရတာပါ။ ဒီဘက္ေခတ္မွာ mathcadလုိ ေဆာ႔ဖ္၀ဲလ္ေတြနဲ႔ အလြယ္တြက္ႏုိင္ေနျပီလဲျဖစ္ပါတယ္။
ဒါေႀကာင္႔ ကြ်န္ေတာ္တုိ႔အေနနဲ႔ D matrixကုိ အထက္ပါပုံေသနည္းအတုိင္း ထည္႔တြက္လုိက္ရင္ျဖင္႔ လုိအပ္ေသာ matrixကုိ DCTနည္းႏွင္႔ တြက္ခ်က္ရရွိျခင္းပဲ ျဖစ္ပါတယ္။


.
ဆက္ရန္...



No comments:

Post a Comment