C# - Image Processing (Contrast Algorithm)

Posted by ေတဇာလင္း Friday 3 March 2017 0 comments

မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမမ်ား အားလံုးပဲ မဂၤလာပါဗ်ာ။ ဒီေန႔ေတာ့ က်ေနာ္တို႔ Visual Studio C# နဲ႔ Image တစ္ခုကို Contrast Algorithm ကိုအသံုးျပဳၿပီးေတာ့ Color ေတြကို Control လုပ္ႏိုင္တာေလးကို ေလ့လာၾကည့္ပါ့မရ္။ က်ေနာ့္ ေလ့က်င့္ခန္းေတြကေတာ့ စတင္ ေလ့လာသူမ်ားအတြက္သာ ရည္ရြယ္ပါတရ္။ ဒါေၾကာင့္ သိေနၿပီးသား သူမ်ားအေနနဲ႔ နားလည္ေပးၾကဖို႔နဲ႔ က်ေနာ္ရဲ႕ တင္ျပပံု မွားယြင္းတာမ်ားရွိခဲ့ရင္ ျပန္လည္ေထာက္ျပေပးႏိုင္ဖို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
Contrast Algorithm ရဲ႕ အလုပ္လုပ္ပံုကေတာ့ Pixel တစ္ခုကို Detect လုပ္မရ္။ Detect လုပ္ၿပီးတဲ့အခါမွာေတာ့ bright ျဖစ္တဲ့ Pixel ျဖစ္ရင္ RGB Value ေတြကို သတ္မွတ္ေပးလိုက္တဲ့ Contrast အတိုင္းတိုးေပးလိုက္မွာျဖစ္ၿပီး dark ျဖစ္တဲ့ Pixel ျဖစ္ခဲ့ရင္ေတာ့ သတ္မွတ္ေပးလိုက္တဲ့ Contrast အတိုင္း RGB Value ေတြကို ေလွ်ာ့ခ်ေပးပါလိမ့္မရ္။ တနည္းေျပာ ရရင္ Contrast ဆိုတာ Image တစ္ခုရဲ႕ Brithtest and Drakest Area အၾကား ဘရ္ေလာက္အေနအထား(length)အထိ ျခားနားေပးလိုက္မရ္ ဆိုတာကို သတ္မွတ္ေပးတာပါ။ Contrast Increase ျဖစ္ရင္ (သို႔မဟုတ္) ျခားနားခ်က္မ်ားလာရင္ Vibrant မ်ားၿပီး အေရာင္အေသြး ေတာက္လာမွာျဖစ္ၿပီး Contrast Decrease ျဖစ္လာရင္ေတာ့ အေရာင္အေသြး ထိုင္းမိႈင္းတဲ့ဘက္ကို ကူးသြားမွာျဖစ္ပါတရ္။ Fig ေတြမွာ ၾကည့္လိုက္ရင္ေတာ့ ဆိုလိုရင္းကို နားလည္ၾကလိမ့္မရ္လို႔ ထင္ပါတရ္ဗ်။
Contrast တန္ဖိုး သတ္မွတ္တဲ့အခါမွာေတာ့ Threshold Value အေနနဲ႔ -100 to 100 ၾကားကို သတ္မွတ္ေပး ႏိုင္ပါတရ္။ Positive Values ကေတာ့ Image ရဲ႕ Contrast တန္ဖိုးကို တိုးေပးမွာျဖစ္ၿပီး Negative Values ေတြကေတာ့ Image ရဲ႕ Contrast တန္ဖိုးကို ေလွ်ာ့ခ်ေပးမွာျဖစ္ပါတရ္။ Contrast တန္ဖိုး သုည(0) ကေတာ့ Contrast အလုပ္ မလုပ္ရေသးတဲ့အေျခအေန (သို႔မဟုတ္) Image ရဲ႕ မူလအေျခအေနပဲျဖစ္ပါတရ္။ ဒါေပမဲ့ Algorithm ထဲေရာက္တဲ့ အခါမွာေတာ့ Contrast တြက္ယူတဲ့ Formula ကိုျဖတ္ရပါတရ္။ ဒီအခ်ိန္မွာေတာ့ Contrast တန္ဖိုးဟာ 0 to 4 ၾကားသာ အလုပ္ လုပ္တာကို ေတြ႔ရပါလိမ့္မရ္။ က်ေနာ္တို႔ ေရြးခ်ယ္ေပးလိုက္တဲ့ -100 to 100 ၾကား Threshold Value ကို Contrast Value အျဖစ္ ေျပာင္းလဲေပးတဲ့ Formula ကေတာ့...
Contrast = Math.Pow(((100.0 + Threshold) / 100.0), 2);
အခုလိုပုံစံျဖစ္ပါတရ္။ တကယ္အသံုးျပဳမရ္႕ Contrast တန္ဖိုး တြက္ထုတ္ၿပီးတဲ့အခ်ိန္မွာေတာ့ Contrast = 1 ဟာ ေျပာင္းလဲမႈမရွိတဲ့ မူလ Image အေျခအေနျဖစ္ၿပီး 0 to 1 ၾကားကေတာ့ Contrast Decrease ဘက္ကို ကစားႏိုင္မရ္႕ အေျခအေနပါ။ ဒီလိုပါပဲ 1 to 4 ၾကားကေတာ့ Contrast Increase ဘက္ကို စကားႏိုင္မရ္႕ အေျခအေနပဲျဖစ္ပါတရ္။ Contrast တန္ဖိုးကို သိၿပီဆိုရင္ေတာ့ က်ေနာ္တို႔ Algorithm လုပ္ငန္းစဥ္ေလးကို ေလ့လာၾကည့္ပါ့မရ္။ အနည္းငယ္ ရွင္းျပရမရ္ဆိုရင္ေတာ့... ပထမဦးဆံုး Pixel ကို Detect လုပ္ၿပီး RGB Color Value ေတြကို ဆြဲထုတ္ပါတရ္။ ဒုတိယအဆင့္မွာေတာ့ ရလာတဲ့ RGB Color Value ေတြကို Contrast Formula ထဲကိုျဖတ္ၿပီး RGB Color Value အသစ္ေတြကို ဖန္တီးယူပါတရ္။ Contrast Formula ပံုစံကေတာ့ RGB = ((((originalRGB / 255.0) – 0.5) * Contrast) + 0.5) * 255.0; အခုလိုျဖစ္ပါတရ္။ တတိယအဆင့္မွာေတာ့ ရရွိလာတဲ့ Color Value အသစ္ေတြကို မူလ Pixel ရဲ႕ RGB Color Value ေနရာေတြမွာ ျပန္အစားထိုးလိုက္တာပါ။ ဒီနည္းအတိုင္း last Pixel ေရာက္သည္အထိ တြက္ထုတ္ၿပီး Contrast Image တစ္ခုအျဖစ္ ဖန္တီးယူလိုက္တာပဲ ျဖစ္ပါတရ္ဗ်။ ဥပမာအေနနဲ႔ေတာ့ က်ေနာ္ Red Color တစ္ခုကို Contrast တြက္ျပထားပါတရ္။ နားလည္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
ကဲ... ဒီေလာက္ဆိုရင္ေတာ့ Contrast Algorithm ရဲ႕ သေဘာတရားကို သိၿပီလို႔ ထင္ပါတရ္။ က်ေနာ္တို႔ GUI ေဖာက္ Coding ေရးၿပီး လက္ေတြ႔ေလ့လာၾကည့္ရေအာင္။ ဒါကေတာ့ က်ေနာ္တို႔ Project မွာ အသံုးျပဳမရ္ Library File ေတြပါ။ ဒီေန႔ ေလ့က်င့္ခန္းအတြက္ GUI တည္ေဆာက္ျခင္းအပိုင္းမွာေတာ့ က်ေနာ္ Button(1)ခုနဲ႔ PictureBox(2)ခု၊ TrackBar(1)ခုနဲ႔ Label(1)ခုကို အသံုးျပဳထားပါတရ္။ Tools ေတြရဲ႕ Properties ေတြကိုေတာ့ ေအာက္က Table အတိုင္း ျပင္ယူလိုက္ၾကပါဗ်ာ။
က်ေနာ္ကေတာ့ ေအာက္ကပံုအတိုင္း ပံုစံခ်ထားပါတရ္ဗ်ာ။ မိတ္ေဆြတို႔အေနနဲ႔ေတာ့ GUI ကို ႀကိဳက္သလို ပံုေဖာ္ ဖန္တီးႏိုင္ပါတရ္ဗ်။
TrackBar ကို Initial Value = 100 ေပးထားတာကေတာ့ Contrast In/Out အတြက္ TrackBar ကို စမွတ္ 100 မွာ Zero Line ခ်လိုက္တာပါ။ ဒါမွ ကနဦး ဆြဲတင္လိုက္ေသာ Image ဟာ 100(0%)မွာ ေဖာ္ျပၿပီး 100 ေအာက္ငယ္သြားရင္ Contrast Decrease Proces ဘက္ကုိလုပ္္ကာ 100 ထက္မ်ားသြားရင္ေတာ့ Contrast Increase Process ဘက္ကိုလုပ္ပါလို႔ ခိုင္းလို႔ရမွာပါ။ နားလည္ၾကလိမ့္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္။ ဒီေတာ့ TrackBar ရဲ႕ Value အခ်ိန္းအေျပာင္းေပၚမူတည္ၿပီး Brightness Result ေျပာင္းလဲ လုပ္ေဆာင္သြားမွာျဖစ္ပါတရ္။ TrackBar ကို D-Click ေပးၿပီး ေအာက္က Method ေလးကို ေရးယူလိုက္ပါဗ်ာ။ Method ကိုေတာ့ Processing လုပ္မရ္႕ Image နဲ႔ Contrast Changing အတြက္ Threshold Value ကုိ Parameter Passing လုပ္ထားပါတရ္။ Pixel Detection လုပ္တဲ့ လုပ္ငန္းစဥ္ကိုေတာ့ က်ေနာ္တို႔ ေရွ႕မွာေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Fast Image Processing ေလ့က်င့္ခန္းအတိုင္း Detect လုပ္ထားပါတရ္။ နားမလည္ေသးတဲ့ မိတ္ေဆြတို႔အတြက္ ေရွ႕သင္ခန္းစာေတြကို ျပန္ဖတ္ေပးပါလို႔ တိုက္တြန္းပါရေစ။ R, G, B Contrast Value အတိုး/အေလွ်ာ့ လုပ္သြားတဲ့ပုံကိုေတာ့ က်ေနာ္ အေပၚမွာ ဥပမာနဲ႔ အေသစိတ္ရွင္းျပခဲ့ပါတရ္။ ဒီေလ့က်င့္ခန္းမွာေတာ့ တမူထူးျခားသြားေအာင္ Coding ေရးသားတဲ့ ပံုစံေလးကို အနည္းငရ္ ခ်ိန္းထားပါတရ္။ R, G, B Color တန္ဖိုး အခ်ိန္းအေျပာင္း အားလံုးဟာ တူညီတဲ့ Formula တစ္ခုတည္းမွာ အလုပ္လုပ္တာပါ။ ဒီေတာ့ Image တစ္ခုလံုးမွာရွိတဲ့ Byte အေရအတြက္ကို အရင္ရွာၿပီး For loop နဲ႔ တစ္ေၾကာင္းတည္းပတ္ကာ အလုပ္ လုပ္ခိုင္းထားပါတရ္။ ေရွ႕သင္ခန္းစာေတြမွာ ေလ့လာခဲ့တဲ့ R, G, B Color တန္ဖိုး တစ္ခုခ်င္းစီ ခြဲတြက္ယူတာနဲ႔ အတူတူပါပဲ။ ဒီေန႔ ေလ့လာတဲ့ ပံုစံက Coding နည္းတရ္ဆိုေပမဲ့ Processing Time အနည္းငရ္ ပိုေႏွးတရ္္ဆိုတာေတာ့ သိထားေစခ်င္ပါတရ္။ အရင္ပံုစံအတိုင္း သံုးခ်င္တဲ့ မိတ္ေဆြတို႔ အေနနဲ႔ေတာ့ ေအာက္က Coding အတိုင္း Method မွာ အစားထိုး အသံုးျပဳႏိုင္ပါတရ္။ Coding မွာ ခက္ခဲတာ ဘာမွမပါလို႔ နားလည္ၾကလိမ့္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
ဒါကေေတာ့ TrackBar သို႔မဟုတ္ Contrast Value ရဲ႕ ေျပာင္းလဲအမႈအေပၚ မူတည္ၿပီး Contrast Image ေျပာင္းလဲယူဖို႔အတြက္ Calling Method အေျခအေနပါ။ Track Value ထဲက 100 ျပန္နဳတ္ထားတာကေတာ့ Contrast Value ကို -100 to 100 ၾကား တြက္ယူခ်င္လို႔ပါ။ ေျပာင္းလဲသြားတဲ့ Contrast Value ကိုေတာ့ label နဲ႔ Infornation ထုတ္ျပထားပါတရ္။ if( )statement နဲ႔စစ္ထားတာကေတာ့ Processing လုပ္မရ္႕ Image ကုိဆြဲတင္ၿပီး ရွိ/မရွိ သိခ်င္လို႔ပါ။ မိတ္ေဆြတို႔ အားလံုးကို ၿခံဳငံုနားလည္သြားေအာင္ ေအာက္မွာ Coding အျပည့္အစံုကို ေလ့လာႏိုင္ပါတရ္ဗ်။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုး ေလ့လာျခင္းျဖင့္ ေက်နပ္ႏိုင္ၾကပါေစ။

0 Responses so far.

Post a Comment