การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม...

20
Introduction to Digital Image Processing and Machine Vision Programming Project and Source code: Chapter3_GammaCorrection_HSL_YIQ_ColorModel กฎของการใชเอกสารและโคดโปรแกรมเผยแพร คือหามทําซ้ําเพื่อการคาใดๆทั้งสิ้น ดวยจิตคารวะ จากผูเรียบเรียง

description

การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

Transcript of การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม...

Page 1: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  Introduction to Digital Image Processing and Machine Vision Programming         Project and Source code: Chapter3_GammaCorrection_HSL_YIQ_ColorModel   กฎของการใชเอกสารและโคดโปรแกรมเผยแพร คือหามทําซ้ําเพ่ือการคาใดๆทั้งส้ิน ดวยจิตคารวะ จากผูเรียบเรียง 

    

         

Page 2: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  26 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ  การแทนคาสีของภาพดิจิทัลที่มนุษยสามารถมองเห็นไดในระบบคอมพิวเตอรมีหลากหลายรูปแบบ ซ่ึงในแตละแบบมีวิธีการคิดคาสีที่แตกตางกัน ทั้งนี้ขึ้นอยูกับวัตถุประสงค คุณสมบัติการใชงาน และความสามารถของอุปกรณในการสรางสีขึ้นมา ซ่ึงอาจทําใหเกดความผิดเพี้ยนของสีจริงอันเนื่องมาจากขอจํากัดบางประการของอุปกรณการแสดงผลนั้นๆ ระบบสีมาตรฐานที่อางอิงในระบบคอมพิวเตอร มีหลายรูปแบบเชน RGB, HSL และ NTSC YIQ เปนตน ซ่ึงในบทนี้จะไดมาทําความรูจักกับระบบสี รวมถึงการปรับภาพดวยแกมา (Gamma Correction) เพื่อที่จะสรางความเขาใจของหลักการพื้นฐานในการเลือกใชระบบสีตางๆ ในสวนแกมมาเปนการปรับขอมูลพิกเซลเพื่อชดเชยภาพดวยคาแกมมา อันเนื่องมาจากอุปกรณสําหรับแสดงผลภาพเชนจอภาพ (Monitor) ที่ประกอบดวยอุปกรณหลอดภาพ (Cathode Ray Tube; CRT) มีการทํางานที่ไมเปนเชิงเสน (Linear) ก็จะสงผลใหภาพที่แสดงออกมาผิดเพี้ยนไมเปนเชิงเสนไปดวย ดังนั้นจึงมีการใชวิธีการชดเชยขอมูลพิกเซลของภาพไดดวยวิธีการทําแกมมา ระบบสี RGB (Red, Green, Blue) ระบบ RGB นี้เปนระบบสีที่ผูใชคอมพิวเตอรสวนใหญคุนเคย เปนระบบที่ใชในการกําหนดคา สัดสวนของสีแดง, เขียว และน้ําเงินเบื้องตน ที่นํามารวมเขาดวยกัน เพื่อสรางสีที่ตองการ ซ่ึงระบบการกําหนดคาสีแบบนี้เปนระบบที่สามารถกําหนดสีที่สามารถถูกสรางออกมาไดอยางชัดเจนที่สุด และเปนระบบการแทนคาสีที่ดีสําหรับการใชงานในระบบฮารดแวร แตเปนการยากในการรับรู และกําหนดคาดวยสัญชาตญาณของมนุษยเพื่อจะสรางสีที่ตองการขึ้น ตัวอยางเชนเราจะตองใชคาสีแดง, เขียว และน้ําเงินเทาไรในการสรางสีสม ซ่ึงจะเห็นไดวาเปนการยากที่มนุษยจะสามารถกําหนดคาขึ้นมาดวยตัวเอง RGB เปนระบบสีที่แยกสัญญานขององคประกอบของสีออกจากกันโดยสิ้นเชิง ซ่ึงจะพบในการแสดงภาพทั้งในระบบของจอภาพคอมพิวเตอร และโทรทัศนสีทั่วไป ระบบสี HSL (Hue, Saturation, Luminance) ระบบ HSL เปนระบบที่สรางมาจากสัญชาตญาณการนึกคิดของมนุษยในการกําหนดคาสี โดยที่คา Hue (สี) จะเปนคาตัวแทนสีตั้งแต 0 (แดง) ถึง 120 (เขียว) ถึง 240 (น้ําเงิน) และถึง 360 (แดงอีกครั้ง) จะเห็นไดวามีลักษณะการแทนคาคลายวงลอ สวนคา Saturation (คาความเขมของสี) ในความเขมระดับต่ําตั้งแต การประมวลผลภาพดิจิทัลดวยโปรแกรม Poolsak Koseeyaporn,Ph.D , Mr.Nattaphol  Jasungnuen

[email protected]  (089‐474‐942‐6) King Mongkut’s University of Technology North Bangkok 

Page 3: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสู0-100% สูง 80-1ของสี) ซึ ระบบสี Y สรางโดยสําหรับกLuminan(Y) Lumโดยโมเดสูตร Machine V จะใหผลลัพธ00% ผลลัพธซ่ึงมีชวงตั้งแตYIQ Color Mระบบสีแบบย Linear Traการกําหนดคุณnce มากกวาสีminance, I (hดลสีแบบ YIQVision ธสีออกมาเปนธจะไดสีที่จัดต 0% (มืด หรือภาพ (ก) รูปModel YIQ ถูกในมansformationณภาพสูงสุดขสี ดังนั้น Bandhue) กับ Q (Q แสดงดังภา วิทยากรโChapter 3นเทา, ความเข หรือแจมใสนอดํา) จนถึง 1ปแบบโมเดลมาใชใน NTSCn ของปริมาตของ Bandwidwidth ควรจsaturation) เปพ (ข) ภาพ (ข)โดย ผศ.ดร.พูลศ3 การปรับภาพขมระดับกลานั้นเอง สําหรั100% (สวาง หสี HSL(Hue,C สําหรับการตรสีของ RGBidth ระบบกาจะอยูที่คา Limปนตัวแทนขอ ) รูปแบบโมเดศักดิ์ โกษียาภรดวย Gamma าง 40-60% ผลรับคาสุดทายทหรือขาว) แส Seturation, LรกระจายสัญญB โดยมองพารมองของมุนmunance มากองขอมูลสี แล ดลสี YIQ ณ และณัฐพล จCorrection, ลลัพธจะเปนที่ใชคือ Lumดงโมเดลสี H Luminance) ญาณทางโทรฤติการณลักษนษยจะมีความกกวาอยูที่สี โดละขอมูลของจะสูงเนิน (เรียบโมเดลสี HSL แนสีออน และ minance (คาคHSL ดังภาพ (รทัศน สีแบบษณะของสายมไวในการเปดย Y เปนตัว Luminance บเรียง)  27และ YIQ ความเขมวามสวางก) YIQ ถูกยตามนุษยปล่ียนของ แทนของ บางสวน 7 

Page 4: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  28 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ การประมวลผลภาพในเรื่องของ การปรับภาพดวยแกมมา, โมเดลสี HSL และ YIQ จะใชโปรเจ็ค ImageProcessing ซ่ึงตอเนื่องจากบทที่ผานมาไดเตรียมความสามารถพื้นฐานตางๆของโปรแกรมไวเรียบรอยแลว ดังนั้นสามารถแกไขหรือเพิ่มโคดโปรแกรมในสวนของการคํานวณคาตางๆที่เกี่ยวของลงในคลาส CMyAlgorithm และเพิ่มรายละเอียดของเมนูใหมีความสามารถเรียกใชคําสั่งการทําแกมมา, HSL, YIQ ไดโดยมีขั้นตอนดังนี้ ขั้นตอนที่ 1 การเพิ่มฟงกชนัในคลาส CMyAlgorithm ภาพที่ 2 ไดอะล็อกสําหรับเพิ่มชื่อฟงกชัน ภาพที่ 3 แสดงรายละเอียดฟงกชัน ภาพที ่1 การเพิ่มฟงกชันลงในคลาส CMyAlgorithm 1.1 เปดหนาตาง Class View แสดงรายละเอียดคลาสทั้งหมดของโปรเจ็ค 1.2 เลือกคลาส CMyAlgorithm คลิ๊กขวา เลือกการ Add Function จะปรากฏไดอะล็อกดังภาพที่ 2 1.3 เพิ่มฟงกชันตางๆดังตารางที่ 1 ลงในไดอะล็อกดังภาพที่ 2 ตารางที่1 ฟงกชันตางๆที่เพิ่มลงในคลาส Return type: Function name: Access: Parameter: void  GammaCorr  public  (const double dGamma) void  HSLSpace  public  (const int _H,const int _S,const int _L)void  YIQSpace  public  (const int _Y,const int _I,const int _Q)float  HueToRGB  public  (float n1,float n2, float hue) RGBQUAD  HSLTORGB  public  (RGBQUAD  lHSLColor) RGBQUAD  RGBtoHSL  public  (RGBQUAD  lRGBColor) RGBQUAD  YIQtoRGB  public  (RGBQUAD  lYIQColor) RGBQUAD  RGBtoYIQ  public  (RGBQUAD  lRGBColor)  1.4 เลือก Finish เมื่อเสร็จสิ้นขั้นตอน

Page 5: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  29 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ เมื่อทําการเพิ่มฟงกชันเสร็จสิ้นแลว ในสวนของ Tap Class View จะแสดงรายละเอียดของฟงกชันที่เพิ่มเขามาดังภาพที่ 3 ผูเขียนโปรแกรมสามารถใชเมาทคล๊ิกที่ช่ือฟงกช่ันตางๆใน Class View เพื่อแกไขหรือเพิ่มโคดโปรแกรมภายในฟงกชันได ขั้นตอนที่ 2 การเพิ่มรายละเอียดของเมนู (Menu) ภาพที่ 4 แสดง Resource View ภาพที่ 5 การ Insert New เมนู การเพิ่มเมนูเปนการสรางสวนติดตอกับผูใชงาน เพื่อใหผูใชงานสามารถเลือกใชเมนูการทํางานไดตามตองการ การเพิ่มเมนูมีขั้นตอนดังนี้ 2.1 เลือก Tap Resource View แสดงรายละเอียดเมนูดังภาพที่ 4 2.2 ดับเบิ้ลคล๊ิกเลือก IDR_ImageProcessingTYPE จะปรากฏเมนูดังภาพที่ 5 2.3 คล๊ิกขวาบนเมนูบารเพิ่มรายละเอียดของเมนูทั้งหมดดังภาพที่ 6 ภาพที่ 6 แสดงรายละเอียดของเมนู รายเอียดเมนูดังนี้ 1. Gamma > Gamma Correction แสดงไดอะล็อกสําหรับปรับคาแกมมา 2. Color Space > HSL แสดงไดอะล็อกสําหรับปรับโมเดลสีแบบ HSL 3. Color Space > YIQ แสดงไดอะล็อกสําหรับปรับโมเดลสีแบบ YIQ

Page 6: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  30 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ  ขั้นตอนที่ 3 การเชื่อมโยงเมสเสจใหกับเมนู (Menu) การกําหนดฟงกชันใหสามารถเรียกใชดวยเมนูตางๆที่เราสรางขึ้นนั้นจะเรียกวา แม็พเมสเสจ ในบทนี้จําเปนตองแม็พฟงกชันจํานวน 3 ฟงกชันดังตารางที่ 2 ตารางที่ 2 กําหนด Member function Menu Message map Member function Gamma Correction COMMAND OnGammaCorrection() HSL COMMAND OnColorSpaceHSL() YIQ COMMAND OnColorSpaceYIQ() สําหรับการแม็พเมสเสจ มีขั้นตอนดังนี้ คล๊ิกขวาที่เมนูยอยจะปรากฏ pop-up เมนู ใหเลือกรายการ Add Event Handler จะปรากฏไดอะล็อก Add Event Handler Wizard ดังภาพที่ 8 ชอง Messages type เลือกที่เมสเสจ COMMAND ชอง Class list เลือกคลาส CImageProcessingView ฟงกชัน Function handler name: ปรกติวิซารดจะตั้งชื่อฟงกชันใหอัตโนมัติ คล๊ิกปุม Add and Event เพื่อเพิ่มฟงกชัน คลาสวิซารดจะทําการเพิ่มฟงกชันใหอัตโนมัติ ใหทําการเพิ่มฟงกชันดังตารางที่ 2 ทั้งหมด ภาพที่ 7 Pop-up รายการ Add Event Handle ภาพที่ 8 แสดง Event Handler Wizard เมื่อทําการแมพ็เมสเสจใหกบัเมนูทั้งหมดแลว ผูใชงานก็จะสามารถเรยีกใชฟงกชันตางๆที่ผานทางเมนูได ในขั้นตอนตอไปจะเพิ่มโคดโปรแกรมลงในฟงกชันตางๆเพื่อใหทํางานตามทีต่องการ  

Page 7: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  31 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ  ขั้นตอนที่ 4 การเพิ่มโคดโปรแกรมลงในคลาส CMyAlgorithm ในการเพิ่มโคดโปรแกรมลงในฟงกชันตางๆของคลาส CMyAlgorithm ประกอบดวยฟงกชันการปรับแกมมา (Gamma Correction), การแปลงคา Hue เปน RGB, การแปลงคา RGB เปน HSL และการแปลงคา RGB เปน YIQ โดยจะใชสมการคณิตศาสตรชวยในการคํานวณเพื่อปรับขอมูลพิกเซลของภาพ และการแปลงคาโมเดลสี ดังนี้ การคํานวณคาแกมมา (Gamma) ( , , )o o oOutput R G B

( , , )i i iInput R G B0 1γ< < สูตรการคํานวณแกมมา (1/ )

(1/ )

(1/ )

O i

O i

O i

R R

G G

B B

γγγ=== โดยที่ o คือ เอาตพุต และ i คืออินพุต γ คือคาแกมมา 0 1γ< < การแปลงเปนโคงเอกซโปเนนเชียล (ทําใหภาพมืดลง) 1γ = อินพุตมีคาเทากับเอาตพุต (ภาพไมเปลี่ยนแปลง) 1γ > การแปลงเปนโคงลอการิทึม (ทําใหภาพสวางเพิ่มมากขึ้น)

Page 8: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  32 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ฟงกชันแกมมา GammaCorr ดังนี้ • ฟงกชันการแปลงคา HueToRGB ดังนี้  

void CMyAlgorithm::GammaCorr(const double dGamma){   if (IsIndexed())  return;   double gamma = (double)1/dGamma;   int maxHigh = GetHeight(), maxWidth = GetWidth();   BYTE *pSrc;   int rGamma, grGamma, bGamma;   for (int y=0; y <maxHigh ; y++)   {     for  (int x=0; x<maxWidth; x++)      {       rGamma = grGamma =  bGamma = 0;       pSrc = (BYTE*)GetPixelAddress(x ,y );              bGamma = (int)(pow((double)pSrc[0]/255.0,gamma)*255);       if (bGamma > 255)  bGamma = 255;       if (bGamma < 0 )  bGamma  = 0;              grGamma = (int)(pow((double)pSrc[1]/255.0,gamma)*255);       if (grGamma > 255)  grGamma = 255;       if (grGamma < 0 )  grGamma  = 0;              rGamma = (int)(pow((double)pSrc[2]/255.0,gamma)*255);       if (rGamma > 255) rGamma = 255;       if (rGamma < 0 )  rGamma  = 0;       *pSrc++ = bGamma;       *pSrc++ = grGamma;       *pSrc  = rGamma;     }   }  } 

#define  HSLMAX   255  /* H,L, and S vary over 0‐HSLMAX */#define  RGBMAX   255     /* R,G, and B vary over 0‐RGBMAX */ #define  HSLUNDEFINED (HSLMAX*2/3)  float CMyAlgorithm::HueToRGB(float n1,float n2, float hue) {   

fixed implementation for HSL2RGB routine   float  rValue;   if (hue > 360)   

 hue = hue ‐ 360;   else if (hue < 0)   

hue = hue + 360;   if (hue < 60)     rValue = n1 + (n2‐n1)*hue/60.0f;   else if (hue < 180)     rValue = n2;   else if (hue < 240)     rValue = n1+(n2‐n1)*(240‐hue)/60;   else     rValue = n1;   return rValue; } 

(1 / )

(1 / )

(1 / )

O i

O i

O i

R R

G G

B B

γγγ===  

Page 9: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  33 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ฟงกชันการแปลงคา RGBtoHSL ดังนี้ RGBQUAD CMyAlgorithm::RGBtoHSL(RGBQUAD lRGBColor){   BYTE R,G,B;      /* input RGB values */   BYTE H,L,S;      /* output HSL values */   BYTE cMax,cMin;    /* max and min RGB values */   WORD Rdelta,Gdelta,Bdelta;  /* intermediate value: % of spread from max*/    R = lRGBColor.rgbRed;    /* get R, G, and B out of DWORD */   G = lRGBColor.rgbGreen;   B = lRGBColor.rgbBlue;    cMax = max( max(R,G), B);  /* calculate lightness */   cMin = min( min(R,G), B);   L = (BYTE)((((cMax+cMin)*HSLMAX)+RGBMAX)/(2*RGBMAX));    if (cMax==cMin){    /* r=g=b ‐‐> achromatic case */     S = 0;      /* saturation */     H = HSLUNDEFINED;  /* hue */   } else 

 {        /* chromatic case */     if (L <= (HSLMAX/2))  /* saturation */       S = (BYTE)((((cMax‐cMin)*HSLMAX)+((cMax+cMin)/2))/(cMax+cMin));     else   /* hue */       S = (BYTE)((((cMax‐cMin)*HSLMAX)+((2*RGBMAX‐cMax‐cMin)/2))/ 

(2*RGBMAX‐cMax‐cMin));          Rdelta = (WORD)((((cMax‐R)*(HSLMAX/6)) + ((cMax‐cMin)/2) ) / (cMax‐cMin));     Gdelta = (WORD)((((cMax‐G)*(HSLMAX/6)) + ((cMax‐cMin)/2) ) / (cMax‐cMin));     Bdelta = (WORD)((((cMax‐B)*(HSLMAX/6)) + ((cMax‐cMin)/2) ) / (cMax‐cMin));      if (R == cMax)       H = (BYTE)(Bdelta ‐ Gdelta);     else if (G == cMax)       H = (BYTE)((HSLMAX/3) + Rdelta ‐ Bdelta);     else   /* B == cMax */       H = (BYTE)(((2*HSLMAX)/3) + Gdelta ‐ Rdelta);      if (H > HSLMAX) H ‐= HSLMAX;   }   RGBQUAD hsl={L,S,H,0};   return hsl; }  

Page 10: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  34 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ฟงกชันการแปลงคา HSLtoRGB ดังนี้ • ฟงกชันการแปลงคา RGBtoYIQ ดังนี้ RGBQUAD CMyAlgorithm::HSLtoRGB(RGBQUAD lHSLColor){    fixed implementation for HSL2RGB routine   float h,s,l;   float m1,m2;   BYTE r,g,b;    h = (float)lHSLColor.rgbRed * 360.0f/255.0f;   s = (float)lHSLColor.rgbGreen/255.0f;   l = (float)lHSLColor.rgbBlue/255.0f;    if (l <= 0.5)  m2 = l * (1+s);   else    m2 = l + s ‐ l*s;    m1 = 2 * l ‐ m2;   if (s == 0) {  

  r = g = b = (BYTE)(l*255.0f);   } else { 

    r = (BYTE)(HueToRGB(m1,m2,h+120) * 255.0f);     g = (BYTE)(HueToRGB(m1,m2,h) * 255.0f);     b = (BYTE)(HueToRGB(m1,m2,h‐120) * 255.0f);   }   RGBQUAD rgb = {b,g,r,0};   return rgb; } 

RGBQUAD CMyAlgorithm::RGBtoYIQ(RGBQUAD lRGBColor){   int Y,I,Q,R,G,B;   R = lRGBColor.rgbRed;   G = lRGBColor.rgbGreen;   B = lRGBColor.rgbBlue;    Y = (int)( 0.2992f * R + 0.5868f * G + 0.1140f * B);   I = (int)( 0.5960f * R ‐ 0.2742f * G ‐ 0.3219f * B + 128);   Q = (int)( 0.2109f * R ‐ 0.5229f * G + 0.3120f * B + 128);    Y= min(255,max(0,Y));   I= min(255,max(0,I));   Q= min(255,max(0,Q));   RGBQUAD yiq={(BYTE)Q,(BYTE)I,(BYTE)Y,0};   return yiq; }  

 

Page 11: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  35 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ฟงกชันการแปลงคา YIQtoRGB ดังนี้ • ฟงกชัน HSLSpace ดังนี้ RGBQUAD CMyAlgorithm::YIQtoRGB(RGBQUAD lYIQColor){   int I,Q,R,G,B;   float Y = lYIQColor.rgbRed;   I = lYIQColor.rgbGreen ‐ 128;   Q = lYIQColor.rgbBlue ‐ 128;    R = (int)( Y + 0.956f * I + 0.621f * Q);   G = (int)( Y ‐ 0.273f * I ‐ 0.647f * Q);   B = (int)( Y ‐ 1.104f * I + 1.701f * Q);    R= min(255,max(0,R));   G= min(255,max(0,G));   B= min(255,max(0,B));   RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};   return rgb; } 

void CMyAlgorithm::HSLSpace(const int _H,const int _S,const int _L){         if (!IsIndexed())          {   if(GetBPP()>=24)   {     int maxHigh = GetHeight(), maxWidth = GetWidth();     BYTE r,g,b;     BYTE *p;     for (int x=maxWidth‐1; x >‐1; x‐‐)       {                 for (int y=maxHigh‐1; y >‐1; y‐‐)                 {         p = (BYTE*)GetPixelAddress(x, y);         r = p[2];  g = p[1];  b = p[0];          RGBQUAD TEMP_RGB={(BYTE)b,(BYTE)g,(BYTE)r,0};         RGBQUAD TEMP_HSL= RGBtoHSL(TEMP_RGB);          TEMP_HSL.rgbRed  +=  _H;           TEMP_HSL.rgbGreen  +=  _S;           TEMP_HSL.rgbBlue  +=  _L;            RGBQUAD NEW_RGB= HSLtoRGB(TEMP_HSL);         *p++ = NEW_RGB.rgbBlue;         *p++ =  NEW_RGB.rgbGreen;         *p =  NEW_RGB.rgbRed;       }     }   }         } } 

  คา HSL ท่ีรับขอมูลจากไดอะล็อก

Page 12: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  36 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ฟงกชัน YIQSpace ดังนี้  ขั้นตอนที่ 5 การเพิ่มโคดโปรแกรมลงในคลาส CImageProcessingView ในสวนของคลาสวิวทําหนาที่แสดงขอมูลภาพบนหนาจอคอมพิวเตอร โดยแสดงภาพที่ผานการประมวลผลภาพที่มีขนาดเทากับภาพตนฉบับ ฟงกชันหลักในการแสดงขอมูลภาพจะใชฟงกชัน GetDocument เพื่ออานขอมูลจากคลาสด็อกคิวเมนต จากนั้นคลาสวิวก็จะทําการวาดภาพออกทางจอภาพดวยฟงกชัน OnDraw นอกจากนั้นคลาสวิวจะทําหนาที่สงขอมูลไปยังคลาส CMyAlgorithm เพื่อทําการปรับคาแกมมา (Gamma) และการปรับโมเดลสีภาพแบบ HSL และ YIQ โดยมีการเพิ่มขอมูลลงในฟงกชันที่ไดทําการแม็พเมสเสจในขั้นตอนที่ 3 เรียบรอยแลว ใหทําการเพิ่มโคดโปรแกรมลงในฟงกชันตางๆดังนี้     

void CMyAlgorithm::YIQSpace(const int _Y, const int _I, const int _Q){        if (!IsIndexed())         {   if(GetBPP()>=24)   {     int maxHigh = GetHeight(), maxWidth = GetWidth();     BYTE r,g,b;   BYTE *p;     for (int x=maxWidth‐1; x >‐1; x‐‐)       {       for (int y=maxHigh‐1; y >‐1; y‐‐)       {         p = (BYTE*)GetPixelAddress(x, y);         r = p[2];   g = p[1];   b = p[0];          RGBQUAD TEMP_RGB={(BYTE)b,(BYTE)g,(BYTE)r,0};         RGBQUAD TEMP_YIQ= RGBtoYIQ(TEMP_RGB);          TEMP_YIQ.rgbRed  +=  _Y;           TEMP_YIQ.rgbGreen  +=   _I;           TEMP_YIQ.rgbBlue  +=  _Q;            RGBQUAD NEW_RGB= YIQtoRGB(TEMP_YIQ);          *p++ = NEW_RGB.rgbBlue;         *p++ =  NEW_RGB.rgbGreen;         *p =  NEW_RGB.rgbRed;       }     }   }        } } 

คา YIQ ท่ีรับขอมูลจากไดอะล็อก

Page 13: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  37 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • เพิ่มโคด CImageProcessingView::OnGammaCorrection ดังนี ้ • เพิ่มโคด CImageProcessingView::OnColorspaceHSL ดังนี ้ • เพิ่มโคด CImageProcessingView::OnColorspaceYIQ ดังนี้     

 

void CImageProcessingView::OnGammaCorrection(){   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);   CMyAlgorithm * pImage = pDoc‐>GetImage();   if (pImage == NULL)  return;    CGamma  dlgGamma;   if (dlgGamma.DoModal() != IDOK)     return;    pImage‐>GammaCorr(dlgGamma.m_dGamma);   pDoc‐>UpdateAllViews(NULL); } 

void CImageProcessingView::OnColorspaceHSL(){   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);   CMyAlgorithm * pImage = pDoc‐>GetImage();   if (pImage == NULL)  return;    CDlgHSL  dlg;   if(dlg.DoModal()!=IDOK) return;    pImage‐>HSLSpace(dlg.m_H, dlg.m_S, dlg.m_L);   pDoc‐>UpdateAllViews(NULL); } 

void CImageProcessingView::OnColorspaceYiq(){   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);   CMyAlgorithm * pImage = pDoc‐>GetImage();   if (pImage == NULL)  return;    CDlgYIQ   dlg;   if(dlg.DoModal()!=IDOK) return;    pImage‐>YIQSpace(dlg.m_Y,dlg.m_I,dlg.m_Q);   pDoc‐>UpdateAllViews(NULL); } 

Page 14: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  38 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ การทํางานของฟงกชัน OnGammaCorrection, OnColorspaceHSL และ OnColorspaceYIQ เร่ิมตนดวยการหาคาพอยนเตอรของคลาสด็อกคิวเมนต เพื่อช้ีไปยังฟงกชัน GetImage ซ่ึงจะคืนคาพอยนเตอรของคลาส CMyAlgorithm ใชในการเขาถึงฟงกชันการคํานวณภายในคลาส จากนั้นสืบทอดออปเจ็กตจากคลาสของแตละไดอะล็อกไดแกคลาส CGamma, CDlgHSL และ CDlgYIQ ตามลําดับ จากนั้นเรียกใชคําสั่ง DoModal แสดงไดอะล็อกเพื่อรับขอมูลจากผูใชงานแลวกําหนดคาเริ่มตนตางๆใหกับตัวแปรเพื่อปรับคาแกมมา, โมเดลสี HSL และ YIQ ตามลําดับ  ขั้นตอนที่ 5 ทดสอบผลการทํางานของโปรแกรม การทํางานของโปรแกรมเริ่มตนดวยการเลือกภาพบิตแมพที่ตองการ เปดเขามายังโปรแกรม ImageProcessing ในบทนี้ทดสอบดวยภาพบิตแมพซึ่งขอมูลในแตละภาพมีคุณสมบัติเหมือนกันทุกประการ เพื่อที่จะแสดงใหเห็นถึงการเปลี่ยนแปลงของภาพเมื่อผานกระบวนการทําแกมมา, ผลการปรับโมเดลสี HSL และ YIQ มีขั้นตอนการทดสอบดังนี้ • เลือกรัน(Run) โปรแกรมจะปรากกฎหนาตางของโปรแกรม ImageProcessing ใหทําการเปดไฟลขอมูล ภาพบิตแมพ จะปรากฏไดอะล็อกสําหรับเปดไฟลภาพ เลือกภาพที่ตองการ ดังภาพที่ 9

 ภาพที่ 9 หนาตางโปรแกรม Image Processing       

Page 15: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  39 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ทําการเปดภาพตนฉบับจํานวน 3 ภาพ จากนั้นเลือกเมนู Gamma  จะปรากฏไดอะล็อกสําหรับปรับคาแกมมา ใหปอนคาแกมมาของแตละภาพเปน 0.2, 0.5 และ 0.8 ตามลําดับ ผลที่ได แสดงดังภาพที่ 10  

                  

  ภาพที ่10 ผลทดสอบการปรับคาแกมมา ในยาน 0 1.0γ< <  

  

  ภาพตนฉบับ สําหรับทดสอบการปรับคาแกมมา, โมเดลสีแบบ HSL และ YIQ

Page 16: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  40 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ทําการเปดภาพตนฉบับจํานวน 3 จากนั้นเลือกเมนู Gamma จะปรากฏไดอะล็อกสําหรับปรับคาแกมมา ใหปอนคาแกมมาของแตละภาพเปน 2, 5 และ 7 ตามลําดับ ผลที่ได แสดงดังภาพที่ 11  

 ภาพที ่11 ผลทดสอบการปรับคาแกมมา ในยาน 1.0γ > • ทําการเปดภาพตนฉบับ เพื่อทดสอบการปรับโมเดลสีดวย HSL โดยเลือกที่เมนู ColorSpace> HSL จะปรากฏไดอะล็อกสําหรับปรับคา H(Hue), S(Saturation) และ L(Luminance)ใหทดสอบเพิ่ม-ลด คา Hue ผลที่ได แสดงดังภาพที่ 12

  

  ภาพที่ 12 ผลการปรับโมเดลสีเฉพาะคา Hue (H) ลดคา Hue เพิ่มคา Hue

Page 17: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  41 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ทําการเปดภาพตนฉบับ เพื่อทดสอบการปรับโมเดลสีดวย HSL โดยเลือกที่เมนู ColorSpace> HSL จะปรากฏไดอะล็อกสําหรับปรับคา H(Hue), S(Saturation) และ L(Luminance)ใหทดสอบเพิ่ม-ลด คา Saturation ผลที่ได แสดงดังภาพที่ 13  

 

 

 

 

  ภาพที ่13 ผลการปรับโมเดลสีเฉพาะคา Saturation (S)  • ทําการเปดภาพตนฉบับ เพื่อทดสอบการปรับโมเดลสีดวย HSL โดยเลือกที่เมนู ColorSpace> HSL จะปรากฏไดอะล็อกสําหรับปรับคา H(Hue), S(Saturation) และ L(Luminance)ใหทดสอบเพิ่ม-ลด คา Luminance ผลที่ได แสดงดังภาพที่ 14  

 

 

 

 

 

 

  ภาพที ่14 ผลการปรับโมเดลสีเฉพาะคา Luminance (L)  

 

 

 

ลดคา Saturation เพิ่มคา Saturation ลดคา Luminance เพิ่มคา Luminance

Page 18: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  42 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ทําการเปดภาพตนฉบับ เพื่อทดสอบการปรับโมเดลสีดวย YIQ โดยเลือกที่เมนู ColorSpace> YIQ จะปรากฏไดอะล็อกสําหรับปรับคา Y, I, Q ใหทดสอบเพิ่ม-ลด คา Y ผลที่ได แสดงดังภาพที่ 15 ภาพที ่15 ผลการปรับโมเดลสีเฉพาะคา Y • ทําการเปดภาพตนฉบับ เพื่อทดสอบการปรับโมเดลสีดวย YIQ โดยเลือกที่เมนู ColorSpace> YIQ จะปรากฏไดอะล็อกสําหรับปรับคา Y, I, Q ใหทดสอบเพิ่ม-ลด คา I ผลที่ได แสดงดังภาพที่ 16 ภาพที ่16 ผลการปรับโมเดลสีเฉพาะคา I ลดคา I เพิ่มคา I ลดคา Y เพิ่มคา Y

Page 19: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  43 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ • ทําการเปดภาพตนฉบับ เพื่อทดสอบการปรับโมเดลสีดวย YIQ โดยเลือกที่เมนู ColorSpace> YIQ จะปรากฏไดอะล็อกสําหรับปรับคา Y, I, Q ใหทดสอบเพิ่ม-ลด คา Q ผลที่ได แสดงดังภาพที่ 17 ภาพที ่17 ผลการปรับโมเดลสีเฉพาะคา Q สรุป การสรางโปรแกรมประมวลผลภาพดิจิทัลในบทนี้ทุกทานไดศึกษาถึงกระบวนการประมวลผลภาพเบื้องตนสําหรับสรางอัลกอริทึมการปรับภาพดวยแกมมา(Gammar Correction) การปรับโมเดลสีดวย HSL และ YIQ โดยวัตถุประสงคหลักของการปรับสีภาพเพื่อตองการชดเชยความผิดเพี้ยนอันเนื่องจากอุปกรณแสดงผลที่ไมเปนเชิงเสน ทําใหภาพที่มองเห็นผิดเพี้ยนดวย ดังนั้นสามารถแกไขปญหาในสวนนี้ไดโดยการปรับแกมมา (Gamma Correction) ในสวนของการปรับโมเดลสีแบบ HSL และ YIQ นั้น เปนโมเดลสีที่สรางขึ้นเพื่อใหสามารถปรับสีภาพไดงายขึ้น ซ่ึงเปนระบบสีที่มนุษยสามารถเขาใจไดงายกวาการผสมสีแบบ RGB ซ่ึงในงานประมวลผลภาพ เมื่อภาพชิ้นงานที่ตองการวิเคราะหมีความผิดเพี้ยนของสีมาก หรือสีภาพท่ีไมชัดเจน ผูใชงานก็สามารถใชวิธีการปรับโมเดลสี HSL หรือ YIQ หรือปรับคาแกมมา เพื่อใหไดภาพที่มีสีชัดเจน ลดคา Q เพิ่มคา Q

Page 20: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP3 Gamma Correction HSL YIQ Color Model

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  44 Chapter 3 การปรับภาพดวย Gamma Correction, โมเดลสี HSL และ YIQ  หนังสือ 1. หนังสือ Digital Image Processing using MATLAB ผูแตง Rafael C.Gonzalez, Richard E. Woods, Steven L. Eddins ISBN 0-13-008519-7 (อางอิงการใช Kernal แบบตางๆ) 2. หนังสือ คูมือการเขียนโปรแกรมวินโดวดวย Visual C++.NET ผูแตง ยทุธนา ลีลาศวัฒนกุล (ใหเครดิตคนเขยีนตําราเลมนี้ครับ) (อางอิงตวัอยาง Source Code และการใชคลาส CImage) 3. หนังสือ Professional MFC with Visual C++ 5 ผูแตง Mike Blaszczak ISBN 1-861000-14-6 4. หนังสือ Visual C++ and MFC Programming ผูแตง นิรุธ อํานวยศลิป ISBN 974-93262-6-1 5. หนังสือ The Image Processing Handbook,3rd edition ,CRC Press, Boca Raton,FL อินเทอเน็ต 1. www.codeproject.com ตัวอยางโปรแกรม Digital Image และ MFC 2. www.codeguru.com ตัวอยางโปรแกรม Digital Image และ MFC 3. ตัวอยาง Source Code และการใชคลาส cImage จากตัวอยางโปรแกรม cxImage ที่มา http://sourceforge.net/projects/cximage 4. http://www.stanford.edu/class/ee368/handouts.html ขอมูลทั่วไป 5. http://klimt.iwr.uni-heidelberg.de/mip/people/fhamprecht/fhamprecht.php3 ขอมูลทั่วไป 6. http://www.fesb.hr/khoros/dipcourse/dip/ ขอมูลทั่วไป 7. ขอมูล OpenCV Library - http://www.intel.com/technology/computing/opencv/ - http://opencvlibrary.sourceforge.net/ - OpenCV Reference manual 8. อางอิงการใชงาน Port I/O Driver สําหรับพอรตขนาน - http://www.driverlinx.com/DownLoad/DlPortIO.htm ทางผูจัดทําขอขอบพระคุณทุกทานที่กลาวถึงในขอมูลอางอิง ที่ไดจัดทําขอมูลที่มีความรูที่ดีและเปนประโยชนตอการเรียนรู ขอผลบุญทางความรูทั้งหมดอุทิศแดพอแม ครูอาจารย และเจากรรมนายเวรของขาพเจา เทอญฯ