C# - Image Processing (Gamma Algorithm)

Posted by ေတဇာလင္း Friday 24 February 2017 1 comments

မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမမ်ား အားလံုးပဲ မဂၤလာပါဗ်ာ။ ဒီေန႔ေတာ့ က်ေနာ္တို႔ Visual Studio C# နဲ႔ Image တစ္ခုကို Gamma Algorithm ကိုအသံုးျပဳၿပီးေတာ့ Color ေတြကို Control လုပ္ႏိုင္တာေလးကို ေလ့လာၾကည့္ပါ့မရ္။ က်ေနာ့္ ေလ့က်င့္ခန္းေတြကေတာ့ စတင္ ေလ့လာသူမ်ားအတြက္သာ ရည္ရြယ္ပါတရ္။ ဒါေၾကာင့္ သိေနၿပီးသား သူမ်ားအေနနဲ႔ နားလည္ေပးၾကဖို႔နဲ႔ က်ေနာ္ရဲ႕ တင္ျပပံု မွားယြင္းတာမ်ားရွိခဲ့ရင္ ျပန္လည္ေထာက္ျပေပးႏိုင္ဖို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
Gamma ဆိုတာ non-linear operation တစ္ခုပါ။ Gamma correction, gamma non-linearity, gamma encoding, ... စသည္ျဖင့္ အမ်ိဳးမ်ိဳးေခၚေ၀ၚၾကပါတရ္။ မည္သို႔ပင္ဆိုေစ Gamma ရဲ႕ အလုပ္ကေတာ့ Image တစ္ခုရဲ႕ light and dark တန္ဖိုးေတြကို encode and decond လုပ္ဖို႔ပါ။ တစ္နည္းအားျဖင့္ Brightness ကို Control လုပ္တာပါ။ အလင္း/အေမွာင္ကို control လုပ္တရ္ဆုိလို႔ ေရွ႕မွာေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Brightness နဲ႔ သြားမေရာေစခ်င္ပါ။ Gamma Operation က Brightness Operation နဲ႔ ပိုၿပီးရႈပ္ေထြးပါတရ္။ Gamma Algorithm ကိုေတာ့ အလင္း/အေမွာင္ ပံုစံ မမွန္ေသာ Image မ်ားကို မိမိစိတ္ႀကိဳက္ R, G, B Color Value ကို Brithtness ကစားၿပီး encode လုပ္တဲ့အခ်ိန္မွာ သံုးပါတရ္။ Brightness တုန္းက R, G, B Color value ကို -255 to 255 နဲ႔ radio တစ္ခုတည္းမွာ ကစားႏိုင္ေပမဲ့ Gamma မွာေတာ့ 0.2 to 5 ၾကားမွာ R, G, B Color Value ကို channel တစ္ခုစီအလိုက္ ကစားႏိုင္ပါလိမ့္မရ္။ ေအာက္မွာ Algorithm နဲ႔ Example ေလးကို ၾကည့္လိုက္ရင္ နားလည္သြာပါလိမ့္မရ္။ အနည္းငယ္ ရွင္းျပရမရ္ဆိုရင္ေတာ့... ပထမဦးဆံုး Pixel ကို Detect လုပ္ၿပီး RGB Color Value ေတြကို ဆြဲထုတ္ပါတရ္။ ဒုတိယအဆင့္မွာေတာ့ ရလာတဲ့ RGB Color Value ေတြကို Gamma Formula ထဲကိုျဖတ္ၿပီး RGB Color Value အသစ္ေတြကို ဖန္တီးယူပါတရ္။ Gamma Formula ပံုစံကေတာ့...
RGB = (255.0 * Math.Pow(Original_Color / 255.0, 1.0 / Gamma));
အခုလိုျဖစ္ပါတရ္။ တတိယအဆင့္မွာေတာ့ ရရွိလာတဲ့ Color Value အသစ္ေတြကို မူလ Pixel ရဲ႕ RGB Color Value ေနရာေတြမွာ ျပန္အစားထိုးလိုက္တာပါ။ ဒီနည္းအတိုင္း last Pixel ေရာက္သည္အထိ တြက္ထုတ္ၿပီး Gamma Image တစ္ခုအျဖစ္ ဖန္တီးယူလိုက္တာပဲ ျဖစ္ပါတရ္ဗ်။ ဥပမာအေနနဲ႔ေတာ့ က်ေနာ္ Red Color တစ္ခုကို Gramma တြက္ျပထားပါတရ္။ နားလည္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။ အထက္မွာရွင္းျပခဲ့တာကေတာ့ Gamma Algorithm ရဲ႕ Color Encode Formual ပံုစံပါ။ မိတ္ေဆြတို႔အေနနဲ႔ Gamma ခ်ိန္ယူၿပီးသား Image တစ္ခုကို မူလပံုစံ သို႔မဟုတ္ ႀကိဳက္ႏွစ္သက္ရာ Color နဲ႔ Decode ျပန္လုပ္ခ်င္တရ္ဆိုရင္ျဖင့္ ေအာက္က Formula ကို ျပန္သံုးႏိုင္ပါတရ္ဗ်။
Original = 255.0 * Math.Pow(encode/255.0, gamma);
အေပၚမွာ က်ေနာ္ Red Color 120 ကုိ Gamma ကုိသံုးၿပီး Encode လုပ္ခဲ့တာ 139 ရခဲ့ပါတရ္။ မိတ္ေဆြတို႔အေနနဲ႔ ဒီ Decode Formual ကိုသံုးၿပီး Decode ျပန္လုပ္ၾကည့္ပါ။ Red Color 120 ျပန္ရပါလိမ့္မရ္ဗ်။
မွတ္ခ်က္။ Gamma Input range က 0.2 to 5 အထိပဲရွိတာကို သတိျပဳပါ။ Gamma Value = 1 က Gamma Processing မလုပ္ရေသးတဲ့ မူလ Color Value ျဖစ္ၿပီး 1 နဲ႔ 0.2 ၾကားကေတာ့ အေမွာင္ဘက္ကို Control လုပ္မရ္႕ Gamma Value ျဖစ္ပါတရ္။ 1 to 5 ကေတာ့ အလင္းဘက္သို႔ Control လုပ္မရ္႕ Gamma Value ပဲျဖစ္ပါတရ္ဗ်ာ။
ကဲ... ဒီေလာက္ဆိုရင္ေတာ့ Gamma Algorithm ရဲ႕ သေဘာတရားကို သိၿပီလို႔ ထင္ပါတရ္။ က်ေနာ္တို႔ GUI ေဖာက္ Coding ေရးၿပီး လက္ေတြ႔ေလ့လာၾကည့္ရေအာင္။ ဒါကေတာ့ က်ေနာ္တို႔ Project မွာ အသံုးျပဳမရ္ Library File ေတြပါ။ ဒီေန႔ ေလ့က်င့္ခန္းအတြက္ GUI တည္ေဆာက္ျခင္းအပိုင္းမွာေတာ့ က်ေနာ္ Button(2)ခုနဲ႔ PictureBox(2)ခု၊ TrackBar(3)ခုနဲ႔ Label(3)ခုကို အသံုးျပဳထားပါတရ္။ Tools ေတြရဲ႕ Properties ေတြကိုေတာ့ ေအာက္က Table အတိုင္း ျပင္ယူလိုက္ၾကပါဗ်ာ။
က်ေနာ္ကေတာ့ ေအာက္ကပံုအတိုင္း ပံုစံခ်ထားပါတရ္ဗ်ာ။ မိတ္ေဆြတို႔အေနနဲ႔ေတာ့ GUI ကို ႀကိဳက္သလို ပံုေဖာ္ ဖန္တီးႏိုင္ပါတရ္ဗ်။
ဒီမွာ TrackBar ရဲ႕ Range ကို 4 to 100 ေပးထားတာကေတာ့ က်ေနာ္တို႔ Gamma ရဲ႕ Inupt Range ျဖစ္တဲ့ 0.2 to 5 ၾကား ကစားႏိုင္ေအာင္ပါ။ 4 to 100 ေပးၿပီး 0.2 to 5 ျဖစ္ေအာင္ က်ေနာ္ကေတာ့ ေအာက္ကပံုစံအတိုင္း တြက္ထုတ္ထားပါတရ္။
Gamma = 0.05 * TrackBarValue;
အခုလိုပါ။ TrackBar ရဲ႕ lower bound ျဖစ္တဲ့ 4 ကို 0.05 နဲ႔ေျမွာက္ၾကည့္ပါ။ က်ေနာ္တို႔ Gamma Value ရဲ႕ lower bound ျဖစ္တဲ့ 0.2 ကိုရပါလိမ့္မရ္။ ဒီလိုပါပဲ TrackBar ရဲ႕ upper bound ျဖစ္တဲ့ 100 ကို 0.05 နဲ႔ေျမွာက္ၾကည့္ပါ။ က်ေနာ္တို႔ Gamma Value ရဲ႕ upper bound ျဖစ္တဲ့ 5 ကိုရပါလိမ့္မရ္ဗ်ာ။ ဒါဆိုရင္ေတာ့ TrackBar ကိုႀကိဳက္သလိုကစားရင္ေတာင္ က်ေနာ္တို႔ လိုခ်င္ေနတဲ့ Gamma Input Range ျဖစ္တဲ့ 0.2 to 5 ၾကားပဲ ရွိေနပါလိမ့္မရ္ဗ်။ logic ကေတာ့ သခၤ်ာကို အေျခခံထားပါတရ္။ Math အားေကာင္းရင္ျဖင့္ Programming Logic ေကာင္းပါလိမ့္မရ္ဗ်ာ။ ေလ့လာၾကပါလို႔ တိုက္တြန္းပါရေစ။
ဒီေလာက္ဆိုရင္ေတာ့ က်ေနာ္တို႔ Gamma Processing မွာ အသံုးျပဳမရ္႕ Algorithm ေတြ logic ေတြ အၾကမ္းဖ်ဥ္းနားလည္သြားပါၿပီ။ က်ေနာ္တို႔ Coding ေရးၾကည့္ၾကမရ္။ ဒါကေတာ့ ပထမဆံုး Processing လုပ္မရ္႕ Image ကို PictureBox ေပၚသို႔ ဆြဲတင္တဲ့အခ်ိန္မွာပဲ Gamma Processing အတြက္ လိုအပ္တာမ်ားကို Initial လုပ္လိုက္တာပါ။ Global အေနနဲ႔ redGamma, greenGamma, blueGamma တို႔ကို 1 assign လုပ္ထားတာကေတာ့ က်ေနာ္အေပၚမွတ္ခ်က္မွာ ေျပာခဲ့တဲ့အတိုင္း Image ကို Gamma Processing မလုပ္ရေသးတဲ့ 1 အေျခအေနမွာ initial လုပ္ခ်င္လို႔ပါ။ ကနဦးမွာ user information အျဖစ္ label ေတြနဲ႔ Gamma value ေတြကို 1 ေပးထားပါတရ္။ ေနာက္ TrackBar Value ေတြကို 20 ေပးထားတာကလည္း Gamma Processing မလုပ္ရေသးတဲ့ 1 အေျခအေနမွာ initial လုပ္ခ်င္လို႔ပါပဲ(Gamma = 20 * 0.05 = 1)။ နားလည္ႏိုင္ၾကလိမ့္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။ ဒါကေတာ့ Gamma Processing အတြက္ Method ခြဲေရးထားတာပါ။ Method ကိုေတာ့ Processing လုပ္မရ္႕ Image နဲ႔အတူ RGB Gamma Value ေတြကို Parameter Passing လုပ္ထားပါတရ္။ Pixel Detection လုပ္တဲ့ လုပ္ငန္းစဥ္ကိုေတာ့ က်ေနာ္တို႔ ေရွ႕မွာေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Fast Image Processing ေလ့က်င့္ခန္းအတိုင္း Detect လုပ္ထားပါတရ္။ နားမလည္ေသးတဲ့ မိတ္ေဆြတို႔အတြက္ ေရွ႕သင္ခန္းစာေတြကို ျပန္ဖတ္ေပးပါလို႔ တိုက္တြန္းပါရေစ။ R, G, B Color Value ေတြကို Gamma ေျပာင္းယူပံုအဆင့္ဆင့္ကိုေတာ့ က်ေနာ္ အေပၚမွာ ဥပမာနဲ႔ အေသစိတ္ရွင္းျပခဲ့ပါတရ္။ Coding မွာ ခက္ခဲတာ ဘာမွမပါလို႔ နားလည္ၾကလိမ့္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
ဒါကေေတာ့ TrackBar သို႔မဟုတ္ RBG Gamma Value ေတြရဲ႕ ေျပာင္းလဲအမႈအေပၚ မူတည္ၿပီး Gamma Image ေျပာင္းလဲယူဖို႔အတြက္ Calling Method အေျခအေနပါ။ RBG Gamma Value ေတြအတြက္ Track Bar သံုးခုကို သံုးထားတဲ့အတြက္ TrackBar သံုးခုစလံုးမွ Method ကို Calling လုပ္ထားပါတရ္။ Coding ကေတာ့ အရမ္းကို ရိုးရွင္းပါတရ္။ Gamma Method က သတ္မွတ္ထားတဲ့ Parameter အတိုင္း Value ေတြကို မွန္မွန္ကန္ကန္ Assign လုပ္ေပးလိုက္ယံုပါပဲဗ်ာ။ if( )statement နဲ႔စစ္ထားတာကေတာ့ Processing လုပ္မရ္႕ Image ကုိဆြဲတင္ၿပီး ရွိ/မရွိ သိခ်င္လို႔ပါ။ Default Image အတြက္ေတာ့ ရိုးရိုးရွင္းရွင္းပါပဲ။ အားလံုးကို Gamma Processing မလုပ္ရေသးတဲ့ အေျခအေနကို ျပန္ပို႔ထားလိုက္တာပါ။ မိတ္ေဆြတို႔ အားလံုးကို ၿခံဳငံုနားလည္သြားေအာင္ ေအာက္မွာ Coding အျပည့္အစံုကို ေလ့လာႏိုင္ပါတရ္ဗ်။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုး ေလ့လာျခင္းျဖင့္ ေက်နပ္ႏိုင္ၾကပါေစ။

1 Response so far.

  1. unsafe ကဘာအတြက္လည္းခင္ဗ်ာ error တက္ေနပါတယ္။

Post a Comment