C# - Change Color Image to Grayscale Image

Posted by ေတဇာလင္း Friday 17 February 2017 0 comments

မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမမ်ား အားလံုးပဲ မဂၤလာပါဗ်ာ။ ဒီေန႔ေတာ့ က်ေနာ္တို႔ Visual Studio C# ကို အသံုးျပဳၿပီး Color Image တစ္ခုကို Grayscale Image ပံုစံသို႔ ဘရ္လိုေျပာင္းလဲ ယူႏိုင္မလဲဆိုတာေလးနဲ႔ ပါတ္သတ္ၿပီး ေလ့လာၾကည့္ပါ့မရ္။ က်ေနာ့္ ေလ့က်င့္ခန္းေတြကေတာ့ စတင္ ေလ့လာသူမ်ားအတြက္သာ ရည္ရြယ္ပါတရ္။ ဒါေၾကာင့္ သိေနၿပီးသား သူမ်ားအေနနဲ႔ နားလည္ေပးၾကဖို႔နဲ႔ က်ေနာ္ရဲ႕ တင္ျပပံု မွားယြင္းတာမ်ားရွိခဲ့ရင္ ျပန္လည္ေထာက္ျပေပးႏိုင္ဖို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။
ေရွ႕ Black & White ေျပာင္းတဲ့ ေလ့က်င့္ခန္းမွာေတာ့ Grayscale Image နဲ႔ Black & White Image ကြဲျပားတရ္ဆိုတာကို က်ေနာ္ မွတ္ခ်က္ကေလးနဲ႔ ေျပာခဲ့ပါတရ္။ တခ်ိဳ႕က Grayscale Image ကို Black & White Image လို႔ မွားေခၚတတ္ၾကလို႔ပါ။ Black & White Image ဆုိတာက Image တစ္ခုလံုးမွာ အျဖဴ၊ အမဲ Color ႏွစ္မ်ိဳးတည္းနဲ႔ ဖြဲ႔စည္းထားတဲ့ Image ကိုဆိုလိုတာပါ။ Grayscale ကေတာ့ ဒီလိုမဟုတ္ပါဘူး။ Pixel တစ္ခုထဲမွာေတာ့ RGB တူညီတဲ့ Color range ရွိရပါ့မရ္။ Pixel တစ္ခုနဲ႔ တစ္ခုကေတာ့ Color range တူစရာမလိုပါဘူး။ ဥပမာအေနနဲ႔...
first_Pixel = RBG(2, 2, 2);
second_Pixel = RGB(241, 241, 241);
-----
-----
Last_Pixel = RGB(126, 126, 126);
စသည္ျဖစ္ေပါ့။ Color range အနည္း၊ အမ်ားေပၚမူတည္ၿပီး light gray and dark gray ဆိုၿပီး Pixel တစ္ခုနဲ႔တစ္ခု ကြာသြားပါလိမ့္မရ္။ Image တစ္ခုကို Grayscale ေျပာင္းလဲတဲ့အခါမွာေတာ့ က်ေနာ္တို႔ နည္းလမ္း(၃)ခုကိုအသံုးျပဳႏိုင္ပါတရ္။ ၄င္း နည္းလမ္းေတြကေတာ့...
Grayscale (Average Method)
Grayscale (Lightness Method)
Grayscale (Luminosity Method)
တို႔ပဲျဖစ္ပါတရ္။
Average Method // AverageColor = (R + G + B) / 3;
ဒီ Method ကေတာ့ ရိုးရွင္းပါတရ္။ Pixel တစ္ခုကို Detect လုပ္ၿပီး R, G, B Color Value ေတြကို ဆြဲထုတ္ပါတရ္။ ေနာက္ ၄င္း R, G, B Color သံုးခုကိုေပါင္းၿပီး အေရအတြက္နဲ႔ ျပန္စားကာ Average Color တန္ဖိုးကို တြက္ယူပါတရ္။ ေနာက္ဆံုးအဆင့္အေနနဲ႔ ရရွိလာတဲ့ Average Color တန္ဖိုးကို Pixel ရဲ႕ မူလ R, G, B Color တန္ဖိုးေတြ ေနရာမွာ အစားထိုးလိုက္တာပါ။ ဒီနည္းအတိုင္း last Pixel အထိ အလုပ္လုပ္ၿပီး Grayscale Image တစ္ခုအျဖစ္ ေျပာင္းလဲယူလိုက္ တာပဲျဖစ္ပါတရ္။

Lightness Method // LightnessColor = (Max(R, G, B) + Min(R, G, B)) / 2;
ဒီေကာင္ကေတာ့ ပထမဦးဆံုး Pixel တစ္ခုကို Detect လုပ္ၿပီး R, G, B Color Value ေတြကိုဆြဲထုတ္ပါတရ္။ ေနာက္ ၄င္း R, G, B Color Value ေတြထဲကမွ Maximun ကိန္းနဲ႔ Minimum ကိန္းကို ရွာပါတရ္။ ေနာက္တစ္ဆင့္မွာေတာ့ ၄င္း Max and Min ကိန္းႏွစ္လုံးကိုေပါင္းၿပီး 2 နဲ႔ျပန္စားကာ Average Lightness Color ကို တြက္ယူပါတရ္။ ေနာက္ဆံုးအဆင့္အေနနဲ႔ ရရွိလာတဲ့ Average Color တန္ဖိုးကို Pixel ရဲ႕ မူလ R, G, B Color တန္ဖိုးေတြ ေနရာမွာ ျပန္အစားထိုးလိုက္တာပါ။ ဒီနည္းအတိုင္း last Pixel အထိ အလုပ္လုပ္ၿပီး Grayscale Image တစ္ခုအျဖစ္ ေျပာင္းလဲယူလိုက္တာပဲျဖစ္ပါတရ္။

Luminosity Method // LuminosityColor = 0.21 R + 0.72 G + 0.07 B;
ဒီ Mehtod ကလည္း ပထမဦးဆံုး Pixel တစ္ခုကို Detect လုပ္ၿပီး R, G, B Color Value ေတြကိုဆြဲထုတ္ပါတရ္။ ရရွိလာတဲ့ R တန္ဖိုးကို 0.21 နဲ႔ေျမွာက္၊ G တန္ဖိုးကို 0.72 နဲ႔ေျမွာက္၊ B တန္ဖိုးကို 0.07 နဲ႔ေျမွာက္ပါတရ္။ ၿပီးရင္ေတာ့ အားလံုးကို ျပန္ေပါင္းၿပီး Pixel ရဲ႕ မူလ R, G, B Color တန္ဖိုးေတြ ေနရာမွာ ျပန္အစားထိုးလိုက္တာပါ။ ဒီနည္းအတိုင္း last Pixel အထိ အလုပ္လုပ္ခိုင္းၿပီး Grayscale Image တစ္ခုအျဖစ္ ေျပာင္းလဲယူလိုက္တာပဲျဖစ္ပါတရ္။ ကဲ... ဒီေလာက္ဆိုရင္ေတာ့ Grayscale ေျပာင္းလဲယူႏိုင္တဲ့ method သံုးခုကို ၄င္းတို႔ရဲ႕ Formula နဲ႔အတူ သိၿပီ လို႔ ထင္ပါတရ္။ က်ေနာ္တို႔ GUI ေဖာက္ Coding ေရးၿပီး လက္ေတြ႔ေလ့လာၾကည့္ရေအာင္။ ဒါကေတာ့ က်ေနာ္တို႔ Project မွာ အသံုးျပဳမရ္ Library File ေတြပါ။ ဒီေန႔ ေလ့က်င့္ခန္းအတြက္ GUI တည္ေဆာက္ျခင္းအပိုင္းမွာေတာ့ က်ေနာ္ Button(1)ခု၊ PictureBox(2)ခုနဲ႔ comboBox(1)ခုကို အသံုးျပဳထားပါတရ္။ Tools ေတြရဲ႕ Properties ေတြကိုေတာ့ ေအာက္က Table အတိုင္း ျပင္ယူလိုက္ၾကပါဗ်ာ။
က်ေနာ္ကေတာ့ ေအာက္ကပံုအတိုင္း ပံုစံခ်ထားပါတရ္ဗ်ာ။ မိတ္ေဆြတို႔အေနနဲ႔ေတာ့ GUI ကို ႀကိဳက္သလို ပံုေဖာ္ ဖန္တီးႏိုင္ပါတရ္ဗ်။
ဒီေန႔ ေလ့က်င့္ခန္းမွာေတာ့ Grayscale Processing အတြက္ ComboBox ကိုသံုးထားပါတရ္။ ComboBox ရဲ႕ Index အခ်ိန္းအေျပာင္းေပၚမူတည္ၿပီး Grayscale Method ေျပာင္းလဲ လုပ္ေဆာင္သြားမွာျဖစ္ပါတရ္။ ComboBox ကို D-Click ေပးၿပီး ေအာက္က Method ေလးကို ေရးယူလိုက္ပါဗ်ာ။ Method ကိုေတာ့ Processing လုပ္မရ္႕ Image နဲ႔ Method Changing အတြက္ Index Value ကုိ Parameter Passing လုပ္ထားပါတရ္။ Pixel Detection လုပ္တဲ့ လုပ္ငန္းစဥ္ကိုေတာ့ က်ေနာ္တို႔ ေရွ႕မွာေလ့လာခဲ့ၿပီးျဖစ္တဲ့ Fast Image Processing ေလ့က်င့္ခန္းအတိုင္း Detect လုပ္ထားပါတရ္။ နားမလည္ေသးတဲ့ မိတ္ေဆြတို႔အတြက္ ေရွ႕သင္ခန္းစာေတြကို ျပန္ဖတ္ေပးပါလို႔ တိုက္တြန္းပါရေစ။ Average, Lightness, Luminosity Method ေတြရဲ႕ အလုပ္လုပ္ပုံကိုေတာ့ က်ေနာ္ အေပၚမွာ အေသစိတ္ရွင္းျပခဲ့ပါတရ္။ Coding မွာ ခက္ခဲတာ ဘာမွမပါလို႔ နားလည္ၾကလိမ့္မရ္လို႔ ေမွ်ာ္လင့္ပါတရ္ဗ်။ ဒါကေတာ့ Calling Method ပံုစံပါ။ if()statement နဲ႔စစ္ထားတာကေတာ့ Processing လုပ္မရ္႕ Image ကုိဆြဲတင္ၿပီး ရွိ/မရွိနဲ႔ ComboBox မွာ Processing လုပ္မရ္႔ Method ကို ေရြးခ်ယ္ၿပီးသား ရွိ/မရွိကို သိခ်င္လို႔ပါ။
မိတ္ေဆြတို႔ အားလံုးကို ၿခံဳငံုနားလည္သြားေအာင္ ေအာက္မွာ Coding အျပည့္အစံုကို ေလ့လာႏိုင္ပါတရ္ဗ်။ မိတ္ေဆြ၊ ညီအစ္ကို၊ ေမာင္ႏွမအားလံုး ေလ့လာျခင္းျဖင့္ ေက်နပ္ႏိုင္ၾကပါေစ။

0 Responses so far.

Post a Comment