C# - Image Processing (Color Substitution Algorithm)

Posted by ေတဇာလင္း Tuesday 7 March 2017 0 comments

မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမမ်ား အားလံုးပဲ မဂၤလာပါဗ်ာ။ ဒီေန႔ေတာ့ က်ေနာ္တို႔ Visual Studio C# နဲ႔ Image တစ္ခုရဲ႕ Color တစ္ခုအား မိမိႏွစ္သက္ရာ Color တစ္ခုနဲ႔ အစားထိုး ရုပ္လံုးေဖာ္ၾကည့္ႏိုင္တာေလးကို ေလ့လာၾကည့္ပါ့မရ္။ နည္းပညာ Term အရေတာ့ Color Substitution Algorithm လို႔ေခၚပါတရ္။ က်ေနာ့္ ေလ့က်င့္ခန္းေတြကေတာ့ စတင္ ေလ့လာသူမ်ားအတြက္သာ ရည္ရြယ္ပါတရ္။ ဒါေၾကာင့္ သိေနၿပီးသား သူမ်ားအေနနဲ႔ နားလည္ေပးၾကဖို႔နဲ႔ က်ေနာ္ရဲ႕ တင္ျပပံု မွားယြင္းတာမ်ားရွိခဲ့ရင္ ျပန္လည္ေထာက္ျပေပးႏိုင္ဖို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
Algorithm ရဲ႕ သေဘာတရားကေတာ့ က်ေနာ္တို႔ ေရွ႕မွာ ေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Black&White Algorithm and Bi-Tonal Algorithm တို႔နဲ႔ အတူတူပါပဲ။ ဒီေန႔ ေလ့က်င့္ခန္းမွာေတာ့ Algorithm ထဲသို႔ မိမိႀကိဳက္ႏွစ္သက္ရာ Color ႏွစ္ခုကို Passing လုပ္ၿပီး Processing လုပ္ခိုင္းမွာပါ။ ပထမ Color ကေတာ့ Source Color ျဖစ္ပါတရ္။ တနည္းအားျဖင့္ အစားထိုးျခင္းကို ခံရမရ္႕ Color Pixel ေပါ့။ ဒုတိယ Color ကေတာ့ Substituted Color သို႔မဟုတ္ ပထမ Color ေနရာမွာ ျပန္လည္အစားထိုးယူမရ္႕ Color ပဲျဖစ္ပါတရ္။ ေျပာင္းလဲယူတဲ့ေနရာမွာေတာ့ Threshold Value ေလးထားၿပီး Source Color နဲ႔ အနီးစပ္ဆံုး တူညီတဲ့ Pixel ေတြကိုပါ Substituted Color နဲ႔ အစားထိုးျပထားပါတရ္။ Color Value တိုင္းက Sensitive ျဖစ္လြန္းလို႔ Threshold Value ထားၿပီး အနီးစပ္ဆံုး တူညီတဲ့ Pixel ေတြကိုပါ ေျပာင္းလဲယူရတာလည္း ျဖစ္ပါတရ္။ ဥပမာအေနနဲ႔ေတာ့ က်ေနာ္ Color Substitution Algorithm ကုိအသံုးျပဳၿပီး လုပ္ငန္းစဥ္တစ္ခုမွာ ေမာ္ဒယ္ရဲ႕ အက်ီၤ Color ကို ခ်ိန္းျပထားပါတရ္။ ေနာက္တစ္ခုမွာေတာ့ Background Color ကို ခ်ိန္းျပထားပါတရ္ဗ်။ Screen Shoot ေတြကို ၾကည့္လိုက္ရင္ေတာ့ မိတ္ေဆြတို႔ ဆိုလိုရင္းကို နားလည္ၾကလိမ့္မရ္လို႔ ထင္ပါတရ္။ Algorithm ရဲ႕ လုပ္ငန္းစဥ္ေတြကေတာ့ ေအာက္ပါအတိုင္းပဲျဖစ္ပါတရ္ဗ်။ အနည္းငယ္ ရွင္းျပရမရ္ဆိုရင္ေတာ့... ပထမဦးဆံုး Pixel ကို Detect လုပ္ၿပီး RGB Color Value ေတြကို ဆြဲထုတ္ၿပီး စုစုေပါင္း totalPixelColor တန္ဖိုးကို ရွာပါတရ္။ ဒုတိယအဆင့္မွာေတာ့ Source Color ရဲ႕ RGB တန္ဖိုးေတြကိုေပါင္းၿပီး totalSourceColor တန္ဖိုးကိုရွာပါတရ္။ ေနာက္တဆင့္မွာေတာ့ TotalSourceColor နဲ႔ totalPixelColor တို႔ရဲ႕ ျခားနားျခင္းကိုရွာၿပီး Threshold Value နဲ႔ ႏႈိင္းယွဥ္ပါတရ္။ Threshold တန္ဖိုးက ႀကီးခဲ့ရင္ေတာ့ ၄င္း Pixel ကို Substitution Color နဲ႔ အစားထိုးလိုက္မွာျဖစ္ၿပီး Threshold ငယ္ေနမရ္ဆိုရင္ေတာ့ ၄င္း Pxiel ကို မူလအတိုင္းျပန္ Assign လုပ္ယူလိုက္တာပဲ ျဖစ္ပါတရ္။ ဒီနည္းအတိုင္း last Pixel ေရာက္သည္အထိ တြက္ထုတ္ၿပီး BiTonal Image တစ္ခုအျဖစ္ ဖန္တီးယူလိုက္တာပဲ ျဖစ္ပါတရ္ဗ်။ ဥပမာအေနနဲ႔ေတာ့ က်ေနာ္ Pixel တစ္ခုစာ တြက္ျပထားပါတရ္။ နားလည္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
ကဲ... ဒီေလာက္ဆိုရင္ေတာ့ Substitution Color Algorithm ရဲ႕ သေဘာတရားကို သိၿပီလို႔ ထင္ပါတရ္။ က်ေနာ္တို႔ GUI ေဖာက္ Coding ေရးၿပီး လက္ေတြ႔ေလ့လာၾကည့္ရေအာင္။ ဒါကေတာ့ က်ေနာ္တို႔ Project မွာ အသံုးျပဳမရ္ Library File ေတြပါ။ ဒီေန႔ ေလ့က်င့္ခန္းအတြက္ GUI တည္ေဆာက္ျခင္းအပိုင္းမွာေတာ့ က်ေနာ္ Button(1)ခုနဲ႔ PictureBox(2)ခု၊ Panel(2)ခု၊ TrackBar(1)ခုနဲ႔ Label(1)ခုကို အသံုးျပဳထားပါတရ္။ Tools ေတြရဲ႕ Properties ေတြကိုေတာ့ ေအာက္က Table အတိုင္း ျပင္ယူလိုက္ၾကပါဗ်ာ။
က်ေနာ္ကေတာ့ ေအာက္ကပံုအတိုင္း ပံုစံခ်ထားပါတရ္ဗ်ာ။ မိတ္ေဆြတို႔အေနနဲ႔ေတာ့ GUI ကို ႀကိဳက္သလို ပံုေဖာ္ ဖန္တီးႏိုင္ပါတရ္ဗ်။
က်ေနာ္တို႔ Processing လုပ္မရ္႕ Color ႏွစ္ခုအတြက္ Panel Box ႏွစ္ခုကို သံုးထားပါတရ္။ Panel Box ရဲ႕ Click_Event ေတြမွာ ColorDialog Box ေတြကိုေခၚၿပီး မိမိႏွစ္သက္ရာ Color ကိုေရြးခ်ယ္မွာျဖစ္ပါတရ္။ ဒါေပမဲ့ ဒီေလ့က်င့္ခန္းမွာေတာ့ တမူထူးျခားသြားေအာင္ Source Color ေရြးခ်ယ္တဲ့ေနရာမွာ MouseDown_Event ကိုထည့္သံုးျပထားပါတရ္။ Picture ေပၚသို႔ Mouse Down လုပ္လုိက္တဲ့ Coordinate မွာရွိတဲ့ Pixel ရဲ႕ Color Value ကို Source Color အျဖစ္ရယူလိုက္တာပါ။ မိတ္ေဆြတို႔အေနနဲ႔ ColorDialog ပံုစံျဖင့္ျဖစ္ေစ၊ MouseDown ပံုစံျဖင့္ျဖစ္ေစ Source Color ကိုရယူႏိုင္ပါတရ္။ က်ေနာ္ကေတာ့ Color Loading နည္းလမ္းႏွစ္ခုအတြက္ Method ခြဲေရးထားပါတရ္။ ေအာက္မွာ ေလ့လာၾကည့္လုိက္ပါဗ်ာ။ ပထမ picOriginalImg_MouseDown() Method ကေတာ့ Image ရဲ႕ မိမိေျပာင္းလဲေစခ်င္ေသာ Color ကုိေရြးခ်ယ္တဲ့ ေနရာမွာ Mouse Down ကိုအသုံးျပဳၿပီး PictureBox ထဲမွာ မိမိႏွစ္သက္ရာ Source Color ကို ေရြးခ်ယ္ဖို႔ပဲျဖစ္ပါတရ္။ Grahpic Library ကိုအသံုးျပဳထားပါတရ္။ ေနာက္ Mouse Down လုပ္လိုက္ေသာ Picture ေပၚမွ x, y coordinate ရဲ႕ Color Value ကိုဆြဲထုတ္ၿပီး Global ေၾကျငာခဲ့ေသာ sourceColor ထဲသို႔ သြား Assign လုပ္ထားလိုက္တာပဲျဖစ္ပါတရ္။ ေအာက္က LoadColor()Method နဲ႔ Calling ပံုစံေတြကိုေတာ့ ေရွ႕သင္ခန္းစာမွာ ေလ့လာခဲ့ၿပီးျဖစ္လို႔ က်ေနာ္ မရွင္းျပေတာ့ပါဘူးဗ်။ အထက္ပါ Coding အားလံုးရဲ႕ ရည္ရြယ္ခ်က္ကေတာ့ Source Color နဲ႔ Substitution Color ကို ေရြးခ်ယ္ဖို႔ပါပဲဗ်ာ။ ခက္ခဲတာမပါလို႔ နားလည္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
Substitution Color Image ေျပာင္းလဲယူမရ္႕ Method ကိုေတာ့ TrackBar ရဲ႕ Scroll_Event ထဲမွာေရးပါတရ္။ ဒါေၾကာင့္ TrackBar Value ေျပာင္းလဲမႈရွိတိုင္း Image Result ေျပာင္းလဲမႈရွိပါလိမ့္မရ္ဗ်။ Method ကိုေတာ့ Processing လုပ္မရ္႕ Image, Threshold Value နဲ႔ Color Value ႏွစ္ခုကုိ Parameter Passing လုပ္ထားပါတရ္။ Pixel Detection လုပ္တဲ့ လုပ္ငန္းစဥ္ကိုေတာ့ က်ေနာ္တို႔ ေရွ႕မွာေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Fast Image Processing ေလ့က်င့္ခန္းအတိုင္း Detect လုပ္ထားပါတရ္။ နားမလည္ေသးတဲ့ မိတ္ေဆြတို႔အတြက္ ေရွ႕သင္ခန္းစာေတြကို ျပန္ဖတ္ေပးပါလို႔ တိုက္တြန္းပါရေစ။ Substitution Color အစားထိုး အလုပ္လုပ္သြားပံုအဆင့္ဆင့္ကိုေတာ့ က်ေနာ္ အေပၚမွာ ဥပမာနဲ႔ အေသစိတ္ရွင္းျပခဲ့ပါတရ္။
Calling Method ေလးကို ဆက္ၾကည့္ၾကရေအာင္ဗ်ာ။ ဒါကေေတာ့ TrackBar သို႔မဟုတ္ Threshold Value ရဲ႕ ေျပာင္းလဲအမႈအေပၚ မူတည္ၿပီး Substitution Color Image ေျပာင္းလဲယူဖို႔အတြက္ Calling Method အေျခအေနပါ။ ေျပာင္းလဲသြားတဲ့ Threshold Value ကိုေတာ့ label နဲ႔ Infornation ထုတ္ျပထားပါတရ္။ if( )statement နဲ႔စစ္ထားတာကေတာ့ Processing လုပ္မရ္႕ Image ကုိဆြဲတင္ၿပီး ရွိ/မရွိ သိခ်င္လို႔ပါ။ မိတ္ေဆြတို႔ အားလံုးကို ၿခံဳငံုနားလည္သြားေအာင္ ေအာက္မွာ Coding အျပည့္အစံုကို ေလ့လာႏိုင္ပါတရ္ဗ်။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုး ေလ့လာျခင္းျဖင့္ ေက်နပ္ႏိုင္ၾကပါေစ။

0 Responses so far.

Post a Comment