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

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

Upload: know2pro

Post on 29-Jul-2015

370 views

Category:

Documents


5 download

DESCRIPTION

การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

TRANSCRIPT

Page 1: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

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

Page 2: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  73 Chapter 7 การหาขอบภาพ (Edge detection)  

 

  การหาขอบภาพ (Edge Detection) เปนการหาเสนรอบวัตถุที่อยูในภาพดิจิทัล เมื่อทราบเสนรอบวัตถุก็จะสามารถคํานวณหาขนาดของพื้นที่หรือจดจําชนิดของวัตถุนั้นได อยางไรก็ตาม การหาขอบภาพที่ถูกตองสมบูรณนั้นเปนเรื่องที่มีความยุงยากพอสมควร โดยเฉพาะอยางยิ่งการหาขอบของภาพที่มีคุณภาพตํ่า และมีความแตกตางระหวางพื้นหนากับพื้นหลังนอย หรือมีความสวางไมสมํ่าเสมอทั่วทั้งภาพ ซ่ึงขอบภาพเกิดจากความแตกตางของความเขมแสงจากจุดหนึ่งไปยังอีกจุดหนึ่ง ถาหากความแตกตางนั้นมีคามาก ขอบภาพก็จะเห็นไดชัดเจน ถาความแตกตางมีคานอย ขอบภาพก็จะไมชัดเจน ดังนั้นในบทนี้จะกลาวถึงเทคนิคเบื้องตนในสวนของการหาขอบภาพ (Edge Detection) ซ่ึงพิจารณาการตรวจหาขอบภาพดวยอนุพันธอันดับหนึ่ง (First Order Derivative) ไดแก การหาขอบภาพดวย Sobel, Prewitt, Frei-Chen และอนุพันธอันดับที่สอง (Second Order Derivative) ไดแก การหาขอบภาพดวย Laplacian เปนตน วิธีการหาขอบภาพดวยโอเปอรเรเตอรแบบตางๆ จะมีความแตกตางกันอยางไรนั้น จะศึกษากันในบทนี้ การประมวลผลภาพเรื่อง การตรวจหาขอบภาพ (Edge Detection) จะใชโปรเจ็ค ImageProcessing ซ่ึงตอเนื่องจากบทที่ผานมาไดเตรียมความสามารถพื้นฐานตางๆของโปรแกรมแลว ดังนั้นสามารถแกไขหรือเพิ่มโคดโปรแกรมในสวนของการตรวจหาของภาพลงในคลาส CMyAlgorithm และเพิ่มรายละเอียดของเมนูใหมีความสามารถเรียกใชคําสั่งการตรวจหาขอบภาพได โดยมีขั้นตอนดังนี้ ขั้นตอนที่ 1 การเพิ่มฟงกชนัในคลาส CMyAlgorithm การประมวลผลภาพดิจิทัลดวยโปรแกรม Poolsak Koseeyaporn,Ph.D , Mr.Nattaphol  Jasungnuen

Department of Teacher Training in Electrical Engineering King Mongkut’s University of Technology North Bangkok 1.1 เปดหนาตาง Class View แสดงรายละเอียดคลาสทั้งหมดของโปรเจ็ค 1.2 เลือกคลาส CMyAlgorithm คลิ๊กขวา เลือกการ Add Function จะปรากฏไดอะล็อกดังภาพที่ 2 1.3 เพิ่มฟงกชันตางๆดังตารางที่ 1 ลงในไดอะล็อกดังภาพที่ 2 ตารางที1่ ฟงกชันตางๆที่เพิ่มลงในคลาส

Return type:  Function name:  Access:  Parameter: 

void  SobelX  public  ‐ void  SobelY  public  ‐ void  PrewittX  public  ‐ void  PrewittY  public  ‐ void  FreiChenX  public  ‐ void  FreiChenY  public  ‐ void  Laplacian  public  ‐ 

void  AreaConvolution  public  const double mask[3][3] , const int offset 1.4 เลือก Finish เมื่อเสร็จสิ้นขั้นตอน ภาพที่ 1 การเพิ่มฟงกชันลงในคลาส CMyAlgorithm

Page 3: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  74 Chapter 7 การหาขอบภาพ (Edge detection)  ภาพที ่2 ไดอะล็อกสําหรับเพิ่มชื่อฟงกชัน ภาพที่ 3 แสดงรายละเอียดฟงกชัน เมื่อทําการเพิ่มฟงกชันเสร็จสิ้นแลว ในสวนของ 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

Page 4: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  75 Chapter 7 การหาขอบภาพ (Edge detection)  ภาพที่ 6 แสดงรายละเอียดของเมนู ขั้นตอนที่ 3 การเชื่อมโยงเมสเสจใหกับเมนู (Menu) การกําหนดฟงกชันใหสามารถเรียกใชดวยเมนูตางๆที่เราสรางขึ้นนั้นจะเรียกวา แม็พเมสเสจ ในบทนี้จําเปนตองแม็พฟงกชันจํานวน 7 ฟงกชันดังตารางที่ 2 ตารางที่ 2 กําหนด Member function Menu Message map Member function Laplacian COMMAND OnEdgedetectionLaplacian SobelX COMMAND OnSobelX SobelY COMMAND OnSobelY PrewittX COMMAND OnPrewittX PrewittY COMMAND OnPrewittY Frei-ChenX COMMAND OnFreiX Frei-ChenY COMMAND OnFreiY สําหรับการแม็พเมสเสจ มีขั้นตอนดังนี้ คล๊ิกขวาที่เมนูยอยจะปรากฏ pop-up เมนู ใหเลือกรายการ Add Event Handler จะปรากฏไดอะล็อก Add Event Handler Wizard ดังภาพที่ 8 ชอง Messages type เลือกที่เมสเสจ COMMAND ชอง Class list เลือกคลาส CImageProcessingView ฟงกชัน Function handler name: ปรกติวิซารดจะตั้งชื่อฟงกชันใหอัตโนมัติ คล๊ิกปุม Add and Event เพื่อเพิ่มฟงกชัน คลาสวิซารดจะทําการเพิ่มฟงกชันใหอัตโนมัติ ใหทําการเพิ่มฟงกชันดังตารางที่ 2 ทั้งหมด รายเอียดเมนูดังนี ้1. Laplacian แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Laplacian 2. Gradient > Sobel >X แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Sobel แบบแนวนอน(X) 3. Gradient > Sobel >Y แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Sobel แบบแนวตั้ง(Y) 4. Gradient > Prewitt >X แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Prewitt แบบแนวนอน(X) 5. Gradient > Prewitt >Y แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Prewitt แบบแนวตั้ง(Y) 6. Gradient > Frei-Chen>X แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Frei-Chan แบบแนวนอน(X) 7.Gradient > Frei-Chen>X แสดงการการหาขอบภาพดวยโปเปอรเรเตอร Frei-Chan แบบแนวตั้ง(Y)

Page 5: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  76 Chapter 7 การหาขอบภาพ (Edge detection)  ภาพที ่7 Pop-up เมนูการ Add Event Handler ภาพที ่8 แสดง Event Handler Wizard   เมื่อทําการแมพ็เมสเสจใหกบัเมนูทั้งหมดแลว ผูใชงานก็จะสามารถเรยีกใชฟงกชันตางๆผานทางเมนูได ในขั้นตอนตอไปจะเพิ่มโคดโปรแกรมลงในฟงกชันตางๆเพื่อใหทํางานตามทีต่องการ ขั้นตอนที่ 4 การเพิ่มโคดโปรแกรมลงในคลาส CMyAlgorithm ในการเพิ่มโคดโปรแกรมลงในฟงกชันตางๆของคลาส CMyAlgorithm ประกอบดวยฟงกชัน Sobel, Prewitt, Frei-Chen, Laplacian และ AreaConvolution ดังนี้ อนุพันธอันดับหนึ่ง (First Order Derivative) ใชสําหรับการหาขอบภาพในแนวตั้งและแนวนอน หรือเรียกอีกอยางวา Gradient โดยสามารถเขียนเปนเวกเตอรไดดังนี้ ( , )( , )

( , ) ( , )

r

c

f x yH x y xfH x y f x y

y

∂⎡ ⎤⎢ ⎥⎡ ⎤ ∂⎢ ⎥∇ = =⎢ ⎥ ∂⎢ ⎥⎣ ⎦ ⎢ ⎥∂⎣ ⎦ (1) เมื่อ ( , )f x yx∂∂ คือการหาขอบภาพทางดานแนวนอน ( , )f x yy∂∂ คือการหาขอบภาพทางดานแนวตั้ง โดยสามารถหาขนาดของเวกเตอร (Magnitude Vector) และทิศทางของการตรวจหาขอบภาพไดดังนี้ 2 2( , ) ( , )r cf H x y H x y∇ = + (2) 1 ( , )tan

( , )c

r

H x yH x y

θ −=                 (3)

Page 6: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  77 Chapter 7 การหาขอบภาพ (Edge detection)  การเขียนโปรแกรมเพื่อหาขอบภาพจะใช Mask Coefficient แบบตางๆเชน Sobel, Prewitt, Frei-Chen ฯลฯ ซ่ึงเปน Kernal ที่อยูในรูปเมทริกซโดยเปนขอมูลที่ผานการทดลองและวิจัยโดยผูเชี่ยวชาญนิยมใชสําหรับการประมวลผลภาพในเรื่องของการหาขอบภาพ • การหาขอบภาพดวย Sobel ทางแนวนอน CMyAlgorithm::SobelX(void) • การหาขอบภาพดวย Sobel ทางแนวตั้ง CMyAlgorithm::SobelY(void) • การหาขอบภาพดวย Prewitt ทางแนวนอน CMyAlgorithm::PrewittX(void) • การหาขอบภาพดวย Prewitt ทางแนวตั้ง CMyAlgorithm::PrewittY(void) • การหาขอบภาพดวย Frei-Chen ทางแนวนอน CMyAlgorithm::FreiChenX(void) void CMyAlgorithm::SobelX(void) {   double kernel[3][3]={  {   1,  2,  1   },            {  0,  0,  0  },            { ‐1, ‐2, ‐1 }   };   AreaConvolution(kernel, 0); } 

void CMyAlgorithm::SobelY(void) {   double kernel[3][3]={   { ‐1, 0, 1  },            { ‐2, 0, 2  },            { ‐1, 0, 1  }   };   AreaConvolution(kernel, 0); } 

void CMyAlgorithm::PrewittX(void) {   double kernel[3][3]={ { 1,  1,  1},       { 0,  0,  0},       {‐1, ‐1, ‐1} };   AreaConvolution(kernel, 0); } 

void CMyAlgorithm::PrewittY(void) {  

double kernel[3][3]={ {‐1, 0, 1},     {‐1, 0, 1},       {‐1, 0, 1} };   AreaConvolution(kernel, 0); } 

void CMyAlgorithm::FreiChenX(void) {   double kernel[3][3]={ {‐1,  ‐sqrt(2.0),       ‐1  },       { 0,  0,  0  },   { 1,  sqrt(2.0),          1  } };   AreaConvolution(kernel, 0); } 

Page 7: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  78 Chapter 7 การหาขอบภาพ (Edge detection) • การหาขอบภาพดวย Frei-Chen ทางแนวตั้ง CMyAlgorithm::FreiChenY(void) อนุพันธอันดับท่ีสอง (Second Order Derivative) จากสมการที่ 1 เมื่อทําการอนุพันธอีกครั้ง ไดสมการดังนี้ 2

22

( , )

( , )

f x yxf

f x yy

⎡ ⎤∂⎢ ⎥∂⎢ ⎥∇ = ∂⎢ ⎥⎢ ⎥∂⎣ ⎦ (4) การอนุพันธอันดับสองจะใชโอเปอรเรเตอร Laplacian จะใชคา Mask Coefficient เชน 0 1 01 4 1

0 1 0

−⎡ ⎤⎢ ⎥− −⎢ ⎥⎢ ⎥−⎣ ⎦ หรือ 1 1 11 8 11 1 1

− − −⎡ ⎤⎢ ⎥− −⎢ ⎥⎢ ⎥− − −⎣ ⎦ • การหาขอบภาพดวย Laplacian CMyAlgorithm::Laplacian(void) void CMyAlgorithm::Laplacian(void) { 

double kernel[3][3]={    {‐1, ‐1, ‐1},                 {‐1,  8, ‐1},             {‐1, ‐1, ‐1}   };   AreaConvolution(kernel, 0);   } 

void CMyAlgorithm::FreiChenY(void) {   double kernel[3][3]={ {1,     0,  ‐1                 }, 

{ sqrt(2.0),      0,  ‐sqrt(2.0) },       { 1, 0,  ‐1                 } };   AreaConvolution(kernel, 0); } 

Page 8: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  79 Chapter 7 การหาขอบภาพ (Edge detection) • ฟงกชันการคํานวณรอบพิกเซล CMyAlgorithm:: AreaConvolution ฟงกชัน AreaConvolution ทําหนาที่คํานวณคาพิกเซลบริเวณรอบๆพิกเซลหนึ่ง การคํานวณแบบนี้คือการหาผลรวมคาพิกเซล ของพิกเซลเฉลี่ยถวงน้ําหนักบริเวณรอบๆพิกเซลใดๆนั่นเอง โดยใชเมทริกซที่เรียกวา Convolution Mask หรือ Convolution Kernel ในที่นี้จะใชเมทริกซ 3x3 การทํางานของฟงกชัน เร่ิมตนดวยการคํานวณหาคาถวงน้ําหนักของพิกเซลโดยการนําเอาคาพิกเซลรอบๆพิกเซลนั้นรวมกัน แลวเก็บไวในตัวแปร factor จากนั้นนําเอาคา mask คูณกับคาพิกเซลบริเวณรอบๆvoid CMyAlgorithm::AreaConvolution(const double mask[3][3] , const int offset) {   if (IsIndexed()) return;     CMyAlgorithm image;   VERIFY(image.CreateEx(GetWidth(),GetHeight(), GetBPP(),BI_RGB));    int red, green, blue;   int maxHigh = GetHeight() ‐1;   int maxWidth = GetWidth() ‐1 ;   BYTE *p ;   BYTE *pNew;   int center = 1;   int nRedCenter, nGreenCenter, nBlueCenter;   // Calulate weight   double factor = 0.0;   for(int j=0;j<3;j++)   {     for(int i = 0; i <3; i++)     {       factor = factor + mask[j][i];     }    }   for (int y =1; y < maxHigh; y++)   {     for (int x =1; x < maxWidth; x++)     {          nRedCenter = nGreenCenter =  nBlueCenter = 0;       pNew = (BYTE*)image.GetPixelAddress(x,y);       for(int j=0;j<3;j++)       {         for(int i = 0; i <3; i++)         {           p = (BYTE*)GetPixelAddress(x+i‐center,y+j‐center);           nRedCenter += (int)(p[2]*mask[j][i]);           nGreenCenter += (int)(p[1]*mask[j][i]);           nBlueCenter += (int)(p[0]*mask[j][i]);         }       }       if ((int)factor==0) factor = 1.0;       red  = (int)(nRedCenter/factor + offset);       green = (int)(nGreenCenter/factor + offset);       blue  = (int)(nBlueCenter/factor + offset);        if (red > 255) red = 255;       if (red < 0 ) red = 0;       if (green > 255) green = 255;       if (green < 0 ) green = 0;       if (blue > 255) blue = 255;       if (blue < 0 ) blue = 0;        *pNew++ =  (BYTE)blue;       *pNew++ = (BYTE)green;       *pNew = (BYTE)red;     }   } ExchangeImg(image); } 

Page 9: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  80 Chapter 7 การหาขอบภาพ (Edge detection) จุดพิกเซล แลวเก็บคาที่ตัวแปร nRedCenter, nGreenCenter และ nBlueCenter จากนั้นใหนําขอมูลที่ไดทําการหารดวยคาถวงน้ําหนัก (factor) ในกรณีที่ factor มีคาเทากับศูนยจะมีการกําหนดใหเปนคาหนึ่งกอนเสมอ คาที่ไดจากการคํานวณจะทําการบวกกับคา offset (ถามีคา offset ) แลวเก็บคาลงในตัวแปร nRed, nGreen และ nBlue สุดทายจะนําคาผลรวมของพิกเซลเฉลี่ยถวงน้ําหนัก ทําการแปลงขอมูลใหมีคาระหวาง 0-255 แลวเก็บคาที่ไดในบัพเฟอรใหม และใชฟงกชัน ExchangeImg สําหรับทําการแลกเปลี่ยนขอมูลภาพ ผลที่ไดก็คือ ไดขอมูลภาพใหมที่ผานกระบวนการหาขอบภาพแบบตางๆนั่นเอง ขั้นตอนที่ 5 การเพิ่มโคดโปรแกรมลงในคลาส CImageProcessingView ในสวนของคลาสวิวจะทําหนาที่แสดงขอมูลภาพบนหนาจอคอมพิวเตอร โดยแสดงภาพเทากับภาพตนฉบับ ฟงกชันหลักในการแสดงขอมูลภาพจะใชฟงกชัน GetDocument เพื่ออานขอมูลจากคลาสด็อกคิวเมนต จากนั้นคลาสวิวก็จะทําการวาดภาพออกทางจอภาพดวยฟงกชัน OnDraw นอกจากนั้นคลาสวิวจะทําหนาที่สงขอมูลภาพไปยังคลาส CMyAlgorithm เพื่อทําการประมวลผลภาพดวยโอเปอรเรเตอร Laplacian, Sobel, Prewitt และ Frei-Chen โดยมีการเพิ่มขอมูลลงในฟงกชันตางๆที่ไดทําการแม็พเมสเสจในขั้นตอนที่ 3 ใหเพิ่มโคดโปรแกรมลงในฟงกชันตางๆดังนี้ • เพิ่มโคด CImageProcessingView::OnEdgedetectionLaplacian() ดังนี้ การเรียกใชงานฟงกชันการหาขอบภาพดวย Laplacian เร่ิมดวยการใชฟงกชัน GetDocument เพื่อเก็บคาพอยนเตอรของคลาสด็อกคิวเมนต มาเก็บไวในตัวพอยนเตอร *pDoc จะใชตัวแปรนี้ช้ีไปยังฟงกชัน GetImage เพื่ออานขอมูลภาพเขามาเก็บไวใน *pImage และทําการตรวจสอบคาของตัวแปรแบบพอยนเตอรตองไมมีคาเปนศูนย แสดงวาขณะนี้ตัวแปร *pImage มีขอมูลในหนวยความจํา แลวสงคาพอยนเตอรช้ีไปยังฟงกชัน Laplacian ในคลาส CMyAlgorithm เพื่อทําการหาขอบภาพแบบ Laplacian เมื่อคํานวณคาเสร็จสิ้น ใหทําการเรียกฟงกชัน UpdateAllViews เพื่อใหวิวแสดงผลภาพปจจุบันออกทางจอภาพ ทําใหมองเห็นภาพที่ผานกระบวนการหาขอบภาพดวย Laplacian void CImageProcessingView::OnEdgedetectionLaplacian() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;      pImage‐>Laplacian();   pDoc‐>UpdateAllViews(NULL); } 

Page 10: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  81 Chapter 7 การหาขอบภาพ (Edge detection)  ในทํานองเดียวกัน การเรียกใชฟงกชันการหาขอบภาพดวย SolbelX, SobelY, PrewittX, PrewittY, Frei-ChenX และ Frei-ChenY ก็มีกระบวนการทํางานเหมือนกันทุกประการ ตางกันเพียงการสงคาพอยเตอรใหคลาส CMyAlgorithm เพื่อทําการประมวลผลภาพในฟงกชันตางๆที่ตองการนั่นเอง สามารถเพิ่มโคดโปรแกรมของฟงกชันตางๆที่เกี่ยวของลงในคลาสวิวไดดังนี้ • เพิ่มโคด CImageProcessingView::OnSobelX() ดังนี้ • เพิ่มโคด CImageProcessingView::OnSobelY() ดังนี้ • เพิ่มโคด CImageProcessingView::OnPrewittX() ดังนี ้ void CImageProcessingView::OnSobelX() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;    pImage‐>SobelX();   pDoc‐>UpdateAllViews(NULL); } 

void CImageProcessingView::OnSobelY() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;    pImage‐>SobelY();   pDoc‐>UpdateAllViews(NULL); } 

void CImageProcessingView::OnPrewittX() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;    pImage‐>PrewittX();   pDoc‐>UpdateAllViews(NULL); } 

Page 11: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  82 Chapter 7 การหาขอบภาพ (Edge detection) • เพิ่มโคด CImageProcessingView::OnPrewittY() ดังนี ้ • เพิ่มโคด CImageProcessingView::OnFreiX() ดังนี้ • เพิ่มโคด CImageProcessingView::OnFreiY() ดังนี้ เมื่อทําการแกไขโคดโปรแกรมเสร็จทุกขั้นตอน ใหเลือกบันทึกทั้งหมด (Save all) และคอมไฟลโปรแกรมดวยเมนู Build ImageProcessing ถาไมมีขอผิดพลาด ก็จะสามารถรัน (Run) โปรแกรมได void CImageProcessingView::OnPrewittY() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;    pImage‐>PrewittY();   pDoc‐>UpdateAllViews(NULL); } 

void CImageProcessingView::OnFreiX() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;    pImage‐>FreiChenX();   pDoc‐>UpdateAllViews(NULL); } 

void CImageProcessingView::OnFreiY() {   CImageProcessingDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);    CMyAlgorithm* pImage = pDoc‐>GetImage();   if(pImage == NULL) return;    pImage‐>FreiChenY();   pDoc‐>UpdateAllViews(NULL); } 

Page 12: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  83 Chapter 7 การหาขอบภาพ (Edge detection) ขั้นตอนที่ 6 ทดสอบผลการทํางานของโปรแกรม การทํางานของโปรแกรมเริ่มตนดวยการเลือกไฟลภาพที่ตองการเปดเขามาในโปรแกรม ImageProcessing ในบทนี้ทดสอบดวยภาพบิตแมพ ซ่ึงขอมูลในแตละภาพมีคุณสมบัติเหมือนกันทุกประการ เพื่อที่จะแสดงใหเห็นถึงการเปลี่ยนแปลงของภาพเมื่อผานกระบวนการหาขอบภาพดวยอัลกอริทึมแบบตางๆที่สรางขึ้น มีขั้นตอนการทดสอบดังนี้ • เลือกรัน(Run) โปรแกรมจะแสดงหนาตางของโปรแกรม ImageProcessing ใหทําการเปดไฟลขอมูล ภาพจะปรากฏไดอะล็อกสําหรับเปดไฟลภาพ เลือกเปดภาพที่ตองการ ดังภาพที่ 9 ภาพที่ 9 หนาตางโปรแกรม Image Processing • ทําการเปดภาพตนฉบับจํานวน 2 ภาพ แลวเลือกเมนู Edge Detection ใหเลือกทําการหาขอบภาพดวย SobelX และ SobelY จะไดผลการทดลองดังภาพที ่10 ภาพที่ 10 การหาขอบภาพดวยโอเปอรเรเตอร Sobel

Page 13: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  84 Chapter 7 การหาขอบภาพ (Edge detection) • ทําการเปดภาพตนฉบับจํานวน 2 ภาพ แลวเลือกเมนู Edge Detection ใหเลือกทําการหาขอบภาพดวย PrewittX และ PrewittY จะไดผลการทดลองดังภาพที ่11 ภาพที่ 11 การหาขอบภาพดวยโอเปอรเรเตอร Prewitt • ทําการเปดภาพตนฉบับจํานวน 2 ภาพ แลวเลือกเมนู Edge Detection ใหเลือกทําการหาขอบภาพดวย Frei-ChenX และ Frei-ChenY จะไดผลการทดลองดังภาพที่ 12 ภาพที่ 12 การหาขอบภาพดวยโอเปอรเรเตอร Frei-Chen

Page 14: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  85 Chapter 7 การหาขอบภาพ (Edge detection) • ทําการเปดภาพตนฉบับจํานวน 2 ภาพ แลวเลือกเมน ูEdge Detection ใหเลือกทําการหาขอบภาพดวย Laplacian จะไดผลการทดลองดังภาพที ่13 ภาพที่ 13 การหาขอบภาพดวยโอเปอรเรเตอร Laplacian สรุป การสรางโปรแกรมในบทนี้ทุกทานไดศึกษาถึงกระบวนการประมวลผลภาพดิจิทัลเบื้องตน ซ่ึงแสดงถึงรายละเอียดในการสรางอัลกอริทึมตางๆในเรื่องของการการหาขอบภาพ (Edge Detection) โดยประกอบดวยการหาขอบภาพดวยการอนุพันธอันดับหนึ่ง และอนุพันธอันดับที่สอง รวมถึงการใชโอเปอรเรเตอรแบบตางๆ โดยการหาขอบภาพในงานประมวลผลภาพดิจิทัลนั้นมีประโยชนมากในการตรวจจับรูปแบบวัตถุตางๆ เชน ลายวงจรอิเล็กทรอนิกสและไอซี เปนตน

Page 15: การประมวลผลภาพด้วยดิจิทัลด้วยโปรแกรม Visual C++ EP7 Edge Detection

  หลักสูตร Machine Vision วิทยากรโดย ผศ.ดร.พูลศักดิ์ โกษียาภรณ และณัฐพล จะสูงเนิน (เรียบเรียง)  86 Chapter 7 การหาขอบภาพ (Edge detection)  หนังสือ 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 ทางผูจัดทําขอขอบพระคุณทุกทานที่กลาวถึงในขอมูลอางอิง ที่ไดจัดทําขอมูลที่มีความรูที่ดีและเปนประโยชนตอการเรียนรู ขอผลบุญทางความรูทั้งหมดอุทิศแดพอแม ครูอาจารย และเจากรรมนายเวรของขาพเจา เทอญฯ