C# - Image Processing (Insert Noise Effect based on Color)

Posted by ေတဇာလင္း Monday, 13 March 2017 0 comments

မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမမ်ား အားလံုးပဲ မဂၤလာပါဗ်ာ။ ဒီေန႔ေတာ့ က်ေနာ္တို႔ Visual Studio C# နဲ႔ မိမိတို႔ ႀကိဳတ္ႏွစ္သက္ရာ Color ကိုအေျခခံၿပီး Image တစ္ခုအတြင္းသို႔ Noise Effect ထည့္သြင္းႏိုင္တာေလးကို ေလ့လာၾကည့္ပါ့မရ္။ Image and Color Filtering ေတြထဲက တစ္ခုေပါ့။ သင္ခန္းစာအားလံုးကေတာ့ series သေဘာမ်ိဳးေလးနဲ႔ တစ္ခုနဲ႔ တစ္ခုဆက္စပ္ေနလို႔ ေရွ႕သင္ခန္းစာေတြကို ေလ့လာေပးၾကဖို႔လည္း တိုက္တြန္းခ်င္ပါတရ္ဗ်။ က်ေနာ့္ ေလ့က်င့္ခန္းေတြကေတာ့ စတင္ ေလ့လာသူမ်ားအတြက္သာ ရည္ရြယ္ပါတရ္။ ဒါေၾကာင့္ သိေနၿပီးသား သူမ်ားအေနနဲ႔ နားလည္ေပးၾကဖို႔နဲ႔ က်ေနာ္ရဲ႕ တင္ျပပံု မွားယြင္းတာမ်ားရွိခဲ့ရင္ ျပန္လည္ေထာက္ျပေပးႏိုင္ဖို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
Algorithm ရဲ႕ သေဘာတရားကေတာ့ က်ေနာ္တို႔ ေရွ႕မွာ ေလ့လာခဲ့တဲ့ Binary Algorithm, Color Substitution Algorithm တို႔ကို အတူတူပါပဲ။ ၄င္း Algorithm ေတြရဲ႕ သေဘာတရားေတြကို အေျခခံၿပီး Threshold Value တစ္ခုန႔ဲ ပိုင္းျခားကာ Pixel ေတြေပၚသို႔ Noise Effect ကို ထည့္သြင္းလိုက္တာပဲျဖစ္ပါတရ္။ Noise ထည့္သြင္းတဲ့ေနရာမွာေတာ့ Binary တုန္းကလို Pixel တိုင္းကို ေျပာင္းလဲမႈမလုပ္ဘဲ Filter ႏွစ္ခုနဲ႔စစ္ထုတ္ကာ Detect လုပ္မိတဲ့ Pixel ကိုသာလွ်င္ Noise ထည့္သြင္းမွာ ျဖစ္ပါတရ္ဗ်။ Result Screen Shoot ေတြကို ၾကည့္လိုက္ရင္ေတာ့ မိတ္ေဆြတို႔ နားလည္သြားၾက လိမ့္မရ္လို႔ ထင္ပါတရ္ဗ်။ Algorithm ရဲ႕ လုပ္ငန္းစဥ္ေတြကေတာ့ ေအာက္ပါအတိုင္းပဲျဖစ္ပါတရ္ဗ်။ Noise ထည့္သြင္းျခင္းအတြက္ က်ေနာ္ Example မွာ pixel တစ္ခုစာ တြက္ျပထားပါတရ္။ အနည္းငယ္ ရွင္းျပရမရ္ ဆိုရင္ေတာ့... ပထမဦးဆံုး Pixel ကို Detect လုပ္ၿပီး RGB Color Value ေတြကို ဆြဲထုတ္ယူပါတရ္။ ဒုတိယအဆင့္မွာေတာ့ Detect ရရွိေသာ RGB တန္ဖိုးေတြရဲ႕ Average တန္ဖိုးကိုရွာၿပီး Grayscale အျဖစ္ေျပာင္းယူပါတရ္။ မိတ္ေဆြတို႔အေနနဲ႔ Color Image ေပၚမွာပဲ Noise ကို ထည့္သြင္းခ်င္တရ္ဆိုရင္ေတာ့ ဒီ Grayscale ေျပာင္းတဲ့အဆင့္ကို ေက်ာ္သြားႏိုင္ပါတရ္။ က်ေနာ္ကေတာ့ ဓါတ္ပံုအေဟာင္းေတြေပၚမွာ Noise ထင္တဲ့ပံုစံမ်ိဳး ေျပာင္းခ်င္လို႔ Grayscale ေျပာင္းယူတဲ့အဆင့္ကို ထည့္သြင္းထားတာပဲျဖစ္ပါတရ္ဗ်။ ေနာက္တစ္အဆင့္မွာေတာ့ ရရွိလာေသာ Average%100 တန္ဖိုးနဲ႔ Threshold Value ကိုႏႈိင္းယွဥ္ၿပီး Filter တစ္ဆင့္ခံပါတရ္။ စစ္ေဆးမႈေအာင္ျမင္ခဲ့ရင္ေတာ့ ဒုတိယ (83%2)==0 Filter ကို ထပ္စစ္ပါတရ္ဗ်။ ဒီ Filter ႏွစ္ခုအေပၚမူတည္ၿပီး Detect လုပ္မိေသာ ဘရ္ Pixel ေပၚကိုေတာ့ upNoiseColor ထည့္မရ္၊ ဘရ္ Pixel ေပၚကိုေတာ့ downNoiseColor ထည့္မရ္ဆိုတာကို သတ္မွတ္တာပါ။ Threshold Value နဲ႔ ပိုင္းျခားထားတဲ့ ပထမ Filter က ဒီ Processing အတြက္ အဓိကျဖစ္ပါတရ္။ ဒီအဆင့္မွာ condition False ျဖစ္ခဲ့ရင္ေတာ့ ၄င္း Detected Pixel ကို မူလ Color အတိုင္း မေျပာင္းလဲပဲ ျပန္ assign လုပ္ေပးမွာျဖစ္ပါတရ္။ ဒါေၾကာင့္ Threshold Value တန္ဖိုးမ်ားေလ က်ေရာက္လာမရ္႕ Noise အေရအတြက္မ်ားလာေလ ျဖစ္မရ္ဆိုတာကို သတိထားေစခ်င္ပါတရ္။ ဒီနည္းအတိုင္း last Pixel ေရာက္သည္အထိ တြက္ထုတ္ၿပီး Noise ထည့္သြင္းၿပီးသား Image တစ္ခုအျဖစ္ ဖန္တီးယူလိုက္တာပဲ ျဖစ္ပါတရ္ဗ်။
ကဲ... ဒီေလာက္ဆိုရင္ေတာ့ Processing ရဲ႕ သေဘာတရားကို သိၿပီလို႔ ထင္ပါတရ္။ က်ေနာ္တို႔ GUI ေဖာက္ Coding ေရးၿပီး လက္ေတြ႔ေလ့လာၾကည့္ရေအာင္။ ဒါကေတာ့ က်ေနာ္တို႔ Project မွာ အသံုးျပဳမရ္ Library File ေတြပါ။ ဒီေန႔ ေလ့က်င့္ခန္းအတြက္ GUI တည္ေဆာက္ျခင္းအပိုင္းမွာေတာ့ က်ေနာ္ Button(1)ခုနဲ႔ PictureBox(2)ခု၊ Panel(2)၊ Label(1)ခုုနဲ႔ TrackBar(1)ခုကို အသံုးျပဳထားပါတရ္။ Tools ေတြရဲ႕ Properties ေတြကိုေတာ့ ေအာက္က Table အတိုင္း ျပင္ယူလိုက္ၾကပါဗ်ာ။
က်ေနာ္ကေတာ့ ေအာက္ကပံုအတိုင္း ပံုစံခ်ထားပါတရ္ဗ်ာ။ မိတ္ေဆြတို႔အေနနဲ႔ေတာ့ GUI ကို ႀကိဳက္သလို ပံုေဖာ္ ဖန္တီးႏိုင္ပါတရ္ဗ်။
က်ေနာ္တို႔ Processing လုပ္မရ္႕ Color အတြက္ Panel Box ႏွစ္ခုကို သံုးထားပါတရ္။ Panel Box ရဲ႕ Click_Event ေတြမွာ ColorDialog Box ေတြကိုေခၚၿပီး မိမိႏွစ္သက္ရာ Color ကိုေရြးခ်ယ္မွာျဖစ္ပါတရ္။ က်ေနာ္ကေတာ့ Color Loading အတြက္ Method ခြဲေရးထားပါတရ္။ ဒါအျပင္ Form_Load တတ္တတ္ခ်င္းမွာ Noise အတြက္ Black and White Color ႏွစ္ခုကို Auto Detect လုပ္ႏိုင္ေအာင္ ဆြဲေခၚထားပါေသးတရ္ဗ်။ ဘာ Color မွ မေရြးပဲ Processing လုပ္မိရင္ Default အေနနဲ႔ Noise ကို Black and White ပံုစံနဲ႔ ထည့္သြင္းေပးႏိုင္ေအာင္ပါဗ်။ ေအာက္မွာ ေလ့လာၾကည့္လုိက္ပါဗ်ာ။ LoadColor()Method နဲ႔ Calling ပံုစံေတြကိုေတာ့ ေရွ႕သင္ခန္းစာမွာ ေလ့လာခဲ့ၿပီးျဖစ္လို႔ ေထြေထြထူးထူး ရွင္းစရာ မလိုေတာ့ဘူးလို႔ ထင္ပါတရ္ဗ်။ အထက္ပါ Coding အားလံုးရဲ႕ ရည္ရြယ္ခ်က္ကေတာ့ Processing လုပ္မဲ့ Specified Color ကို ေရြးခ်ယ္ဖို႔ပါပဲဗ်ာ။ ခက္ခဲတာမပါလို႔ နားလည္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
Noise Effect Image ေျပာင္းလဲယူမရ္႕ Method ကိုေတာ့ TrackBar ရဲ႕ Scroll_Event ထဲမွာေရးပါတရ္။ ဒါေၾကာင့္ TrackBar ရဲ႕ Value ေျပာင္းလဲမႈအေပၚမူတည္ၿပီး Image Result ေျပာင္းလဲမႈရွိပါလိမ့္မရ္ဗ်။ Method ကိုေတာ့ Processing လုပ္မရ္႕ Image, Color Value နဲ႔ Threshold value တို႔ကို Parameter Passing လုပ္ထားပါတရ္။ Pixel Detection လုပ္တဲ့ လုပ္ငန္းစဥ္ကိုေတာ့ က်ေနာ္တို႔ ေရွ႕မွာေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Fast Image Processing ေလ့က်င့္ခန္းအတိုင္း Detect လုပ္ထားပါတရ္။ နားမလည္ေသးတဲ့ မိတ္ေဆြတို႔အတြက္ ေရွ႕သင္ခန္းစာေတြကို ျပန္ဖတ္ေပးပါလို႔ တိုက္တြန္းပါရေစ။ Noise Effect Image အလုပ္လုပ္သြားပံု အဆင့္ဆင့္ကိုလည္း က်ေနာ္ အေပၚမွာ ဥပမာနဲ႔ အေသစိတ္ရွင္းျပခဲ့ပါတရ္။
Calling Method ေလးကို ဆက္ၾကည့္ၾကရေအာင္ဗ်ာ။ ဒါကေေတာ့ TrackBar Value ေျပာင္းလဲအမႈအေပၚ မူတည္ၿပီး Image Result ေျပာင္းလဲယူဖို႔အတြက္ Calling Method အေျခအေနပါ။ if( )statement နဲ႔စစ္ထားတာကေတာ့ Processing လုပ္မရ္႕ Image ကုိဆြဲတင္ၿပီး ရွိ/မရွိ သိခ်င္လို႔ပါ။ မိတ္ေဆြတို႔ အားလံုးကို ၿခံဳငံုနားလည္သြားေအာင္ ေအာက္မွာ Coding အျပည့္အစံုကို ေလ့လာႏိုင္ပါတရ္ဗ်။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုး ေလ့လာျခင္းျဖင့္ ေက်နပ္ႏိုင္ၾကပါေစ။

0 Responses so far.

Post a Comment