|
การแยกบริเวณรูปภาพ ( Image Segmentation )
หลังจากที่เราได้เรียนรู้เรื่องของภาพแต่ละชนิดแล้วจะมาเข้าเรื่องการแยกบริเวณของภาพนะครับ ซึ่งการแยกบริเวณนั้นจะทำให้ได้ภาพที่เป็นวัตถุที่สนใจออกจากพื้นหลัง ที่จะทำให้ทราบว่าในภาพมีวัตถุอยู่กี่ชิ้นและพิกเซลใดเป็นของวัตถุชิ้นใด ซึ่งกระบวนการดังกล่าวถือเป็นพื้นฐานของการประมวลขั้นสูงที่จะนำไปสู่การตัดสินใจเกี่ยวกับคุณภาพของผลิตภัณฑ์ต่อไปและจะพบว่าวิธีการแยกบริเวณนั้นจะแบ่งออกเป็น 2 ประเภทหลักๆ ด้วยกัน คือ การแยกบริเวณด้วยการใช้ค่าเทรชโฮลหรือ ที่เรียกว่า Region based segmentation และอีกวิธีหนึ่งคือ การแยกบริเวณด้วยขอบวัตถุที่ตรวจจับได้ด้วยตัวตรวจจับขอบซึ่งเรียกกันว่า Edge based segmentation และเนื่องจากในการตรวจสอบชิ้นงานด้วยภาพแบบอัตโนมัตินั้นจะเป็นการทำงานที่มีแสงกระจายตัวอยู่อย่างสม่ำเสมอทำให้ภาพที่ได้จะมีบริเวณที่เป็นวัตถุและพื้นหลังที่มีความเข้มแสงแตกต่างกันอย่างเห็นได้ชัดเจน ด้วยสาเหตุดังกล่าวจึงทำให้การแยกบริเวณด้วยวิธีแรกสามารถทำงานได้อย่างมีประสิทธิภาพสูงสุดนอกจากนั้นจะพบว่า ด้วยวิธีการแยกบริเวณวิธีแรกจะทำให้สามารถทราบถึงบริเวณทั้งหมดของวัตถุแต่ละชิ้นซึ่งข้อมูลที่ได้สามารถนำไปคำนวณลักษณะ (Feature) ต่างๆของวัตถุได้ง่ายกว่า
1.Region based segmentation คือการแยกบริเวณรูปภาพด้วยค่าเทรชโฮลกล่าวคือถ้ามีภาพ Grayscale อยู่ภาพนึงเช่นหรือพูดง่าย ๆก็คือการแปลงภาพ Gray scale เป็นภาพ Binary โดยใช้ค่าเทรชโฮล ซึ่งการเลือกใช้ค่าเทรชโฮลนั้นก็มีอยู่ 2 แบบ
Global Threshold คือ การใช้ค่าเทรชโฮลด์ค่าเดียวกับทั้งภาพ Local Threshold คือ การแบ่งภาพหลักออกเป็นภาพย่อยๆ ที่แต่ละภาพย่อยเหล่านั้นจะมีค่าเทรชโฮลด์เป็นของตัวเอง
แต่คำถามก็คือค่าเทรชโฮลนั้นจะหาได้อย่างไร?
มีิวิธีการนึงที่เรียกว่า Otsu’s Thresholding method ซึ่งผมก็ไม่รู้ว่าเป็นใครด้วยซ้ำแต่วิธีการของเขานั้นทำให้ได้ค่าเทรชโฮลโดยอัตโนมัติ ซึ่งทฤษฏีไปหาอ่านเอานะครับเดี๋ยวจะยาว ซึ่งในMATLAB นั้นจะมีคำสั่งที่ใช้ในการหาค่าเทรชโฮลด้วยวิธีการของพี่แกอยู่แล้วคือคำสั่ง graythresh('ชื่อรูปภาพ');
ซึ่ง im_gray เป็นภาพ Grayscaleหรือภาพโทนสีเทานะครับ ดังตัวอย่าง

ผมจึงใช้คำสั่ง th=graythresh(im_gray); ซึ่งผลลัพท์ที่ได้คือ th=0.4235 ซึ่งไอ้เลข 0.4235 หรือร้อยละ 42.35ถ้าเทียบเป็นความเข้มของสีเทาแล้วจะอยู่ที่ 255x0.4235 = 107.9925 หรือ 108
กล่าวคือถ้าจุดพิกเซลใดมีค่าความเข้มสีเทาต่ำกว่าค่าเทรชโฮลนั้นจะมีค่าเป็น 0 ในภาพ Binary และจุดพิกเซลใดที่มีค่าความเข้มสีเทามากกว่าค่าเทรชโฮลนั้น จะมีค่าเป็น 1 ในภาพ Binary หลังจากนั้นผมจึงแปลงภาพให้เป็นภาพไบนารี่โดยใช้คำสั่ง
im_bw=im2bw(im_gray,th);
ก็จะได้ภาพดังรูป

ถามว่าการแยกบริเวณแบบนี้มีประโยชน์อย่างไร ในระบบ Machine Vision ในโรงงานอุตสาหกรรมนั้นจะถูกใช้ในการตรวจสอบคุณภาพของ Product เช่นการตรวจสอบอุปกรณ์อิเล็กทรอนิกส์บนแผ่นลายวงจรพิมพ์ จำเป็นต้องแยกบริเวณภาพเพื่อให้เหลือแต่ตัวอักษร พึ่งใช้ในการตรวจสอบว่าอุปกรณ์อิเล็กทรอนิกส์ที่ใส่ลงไปนั้นถูกต้องหรือไม่ อะไรเทือกนี้แหละครับ 
คราวหน้ามาต่อนะครับ เมื่อยหล่ะ
Create Date : 19 มกราคม 2554 | | |
Last Update : 19 มกราคม 2554 22:24:51 น. |
Counter : 14861 Pageviews. |
| |
|
|
|
|
MATLAB:Digital Image Processing : Image acquisition
เอาหล่ะครับBlogนี้เราจะเริ่มเข้าสู่การใช้งานโปรแกรมMATLABในการประมวลผลภาพดิจิตอลแล้วนะครับ เจ้าโปรแกรมนี้เรียกได้ว่าเป้นโปรแกรมคำนวณขั้นเทพ เพราะนอกจากคำนวณในเชิงวิศวกรรมได้หลายอย่างแล้ว ผู้ผลิตยังมีToolbox หรือกล่องเครื่องมือมาให้ใช้ในสายงานต่าง ซึ่งในโปรเจ็คผมก็จะใช้Image processing Toolbox เนื่องจากใช้งานง่ายไม่ต้องนั่งเขียนอัลกอรึทึ่มใหม่ให้ปวดกบาล
ผมจะกล่าวถึงในการใช้งานนะครับ ส่วนทฤษฏีไปหาอ่านเองนะครับ
เอาหล่ะเรามาเริ่มการดึงภาพจากกล้องกันเลยดีกว่า...
กล้องที่ผมใช้จะเป็นเจ้าOKER ตัวละ4ร้อยกว่าบาท แต่แนะนำให้หาDriverที่Supportตัวกล้องนะครับเพราะไม่งั้นจะไม่สามารถึงภาพในระบบสีRGBได้ จะไปดึงได้แต่เจ้าระบบYUY2 ซึ่งมันคืออะไรก็ไม่รู้ น่าจะเป็นระบบสี CMYK มั้งไม่แน่ใจ
จริงๆแล้วขั้นตอนเหล่านี้จะมีให้อ่านในHelp ของโปรแกรมMATLAB และเจ้าHelp นี่แหละที่ดีที่สุดในบรรดาหนังสือMATLAB แต่ถ้าใครไม่แข็งภาษาก็อย่าไปอ่านมันเลยครับ
ขั้นตอนแรกของการดึงภาพนั้นก่อนอื่นเลยต้องเสียบกล้องเข้ากับคอมพิวเตอร์(ต้องเสียบก่อนเปิดโปรแกรมMATLABนะครับ)
ขั้นตอนต่อมาคือการ Determining the Device Adaptor Name หรือชื่อของกล้องนั่นแหละครับ โดยการพิมพ์คำสั่ง
imaqhwinfo ลงไปในหน้าต่าง จากนั้นมันจะขึ้นว่า
ans =
InstalledAdaptors: {'coreco' 'winvideo'} MATLABVersion: '7.5 (R2007b)' ToolboxName: 'Image Acquisition Toolbox' ToolboxVersion: '3.0 (R2007b)'
Device Adaptor Nameของเราก็ คือ'winvideo' ส่วนเจ้า 'coreco' มันคือชื่ออะไรก็ไม่รู้ แถมไม่สามารถดึงมาใช้ได้อีกต่างหาก 
จากนั้นเราก็จะมาหาว่ากล้องนี่มันมีIDหมายเลขอะไรโดยการพิมพ์คำสั่งเดิมแต่จะกำหนดตัวแปรและวงเล็บชื่อของกล้องไปด้วยดังนี้
IDinfo = imaqhwinfo('winvideo')
เราก็จะได้คำตอบออกมาคือ
IDinfo =
AdaptorDllName: [1x81 char] AdaptorDllVersion: '3.0 (R2007b)' AdaptorName: 'winvideo' DeviceIDs: {[1]} DeviceInfo: [1x1 struct]
หมายถึงว่าIDของกล้องเราคือเลข 1 ซึ่งหมายความว่ากล้องเราเป็นตัวแรกที่โปรแกรมมันค้นหาเจอครับ ส่วนตัวที่2,3,4 ลองเอากล้องหลายๆตัวมาเสียบดูแล้วกันเพราะผมมีตัวเดียว
ส่วนถ้าต้องการรายละเอียดเพิ่มเติมของกล้องเราก็ใส่คำสั่งเดิมลงไปเพราะกับหมายเลขIDดังนี้
IDinfo = imaqhwinfo('winvideo',1)
IDinfo =
DefaultFormat: 'RGB24_640x480' DeviceFileSupported: 0 DeviceName: 'USB Video Device' DeviceID: 1 ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {1x10 cell}
จากคำสั่งนี้ทำให้เราเห็นรายละเอียดต่างๆของกล้องที่เรานำมาเชื่อมต่อ
ต่อมาเราจะต้องหาว่ากล้องเราสามารถSupport ระบบสีและความละเอียดที่ระดับใดบ้าง โดยการพิมพ์คำสั่งต่อไปนี้
celldisp(IDinfo.SupportedFormats) // IDinfo คือตัวแปรนะครับไว้เก็บรายละเอียดที่เราหามาข้างต้น
จากการพิมพ์คำสั่งดังกล่าวโปรแกรมจะแสดงถึงระบบสีและความละเอียดของภาพที่กล้องเราสามารถทำได้
ans{1} = I420_160x120 ans{2} = I420_176x144 ans{3} = I420_320x240 ans{4} = I420_352x288 ans{5} = I420_640x480 ans{6} = RGB24_160x120 ans{7} = RGB24_176x144 ans{8} = RGB24_320x240 ans{9} = RGB24_352x288 ans{10} = RGB24_640x480
จากขั้นตอนบนๆจะเห็นว่าค่าเริ่มต้นหรือ DefaultFormat: 'RGB24_640x480' อยู่แล้วนะครับเราจึงไม่จำเป็นต้องไปเปลี่ยนแปลงอะไร ก็คือเราจะดึงภาพในระบบสีRGB 24 bit ที่ความละเอียด 640x480
ต่อมาจะถึงขั้นตอนการดึงภาพแล้วนะครับ ก่อนอื่นเราจะต้องเอารายละเอียดเช่น Device name,Device ID,Format ไว้ในตัวแปรโดยใช้คำสั่ง videoinput ซึ่งจะเขียนได้ดังนี้
vid = videoinput('winvideo',1,'RGb24_640x480');
จะเห็นได้ว่าตัวแปร vidจะถูกเก็บ Device name,Device ID,Format ไว้ทั้งหมด จากนั้นก็ต้องเริ่มการเก็บเฟรมของภาพไว้ในหน่วยความจำของกล้อง โดยใช้คำสั่ง start(vid) จากนั้นก็เริ่มกระบวนการดึงภาพมาสู่ตัวแปรโดยคำสั่ง im_rgb = getdata(vid,1); และจะต้องหยุดการดึงเฟรมภาพด้วยคำสั่ง stop(vid)
รูปที่เราถ่ายไว้จะอยู่ในตัวแปรที่ชื่อว่า im_rgb แล้วนะครับ การstart(vid) และ stop(vid) จะต้องทำทุกครั้งในการดึงภาพ และบางทีเราจะต้องเคลียร์เฟรมที่ถูกเก็บไว้ในหน่วยความจำของกล้องด้วยคำสั่ง clear (vid)
และถ้าใครอยากดูภาพแบบreal time ก็สามารถใช้คำสั่ง preview(vid)ก็ได้นะครับ แต่เปิดหน้าต่างpreviewไว้แล้วการประมวลผลต่างๆจะช้าลงกระจายเลยครับ
ต่อมาเราลองมาดูภาพที่เราถ่ายไว้ดีกว่าโดยการใช้คำสั่งในการแสดงภาพคือ
imshow(im_rgb)
จะได้ภาพที่ถ่ายดังนี้

สรุปแล้วขั้นตอนต่างๆที่ทำไว้เป็นแค่ขั้นตอนการดึงภาพนะครับ อาจจะเห็นว่ายาวเฟื้อยแต่พอใช้งานจริงใช้แต่ไม่กี่บรรทัดเพราะเราไม่จำเป็นต้องค้นหาชื่อ,ID,Format ของกล้องทุกครั้งหรอกครับ แค่กำหนดไว้ในตัวแปรแล้วstart-->getdata-->stop ก็พอแล้ว
อาจจะเขียนแบบงงๆนะครับเพราะผมพิมพ์เองก็เริ่ม งงเอง เอาเป็นว่าใครอยากถามเกี่ยวกับพวกนี้ก็หลังไมค์มาได้ครับ จะช่วยเท่าที่จะช่วยได้
ไว้Blogหน้าจะปรับปรุงสำนวนการนำเสนอนะครับ Blogนี้ทำใจอ่านไปก่อน 
Create Date : 28 เมษายน 2553 | | |
Last Update : 28 เมษายน 2553 0:42:53 น. |
Counter : 6560 Pageviews. |
| |
|
|
|
|
รูปร่างของภาพ (Image Shape) : ภาพ Binary
ภาพไบนารี่(Binary Image)
ไบนารีในทางดิจิตอลหมายถึงว่ามีเพียง 2 สถานะคือ 0 และ 1 ซึ่งภาพไบนารี่ก็จะมีแค่ความเข้ม 2 ค่าเท่านั้นคือ 0 และ 1 หมายความว่า
พิกเซลใดที่มีค่าเป็น 0 ก็จะหมายถึงว่าพิกเซลนั้นจะแสดงสีดำ พิกเซลใดที่มีค่าเป็น 1 ก็จะหมายถึงว่าพิกเซลนั้นจะแสดงสีขาว
ซึ่งการแปลงภาพเกรย์สเกลเป็นภาพไบนารี่นั้นจะต้องกำหนดค่าความเข้มของสีเทาที่ต้องการอ้างอิงหรือเรียกว่าค่าเทรชโฮล(Threshold Value)ซึ่งค่านี้จะถูกกำหนดโดยผู้ใช้หรือว่าการใช้อัลกอรึทึ่มในการหาค่าเทรชโฮลโดยอัตโนมัติก็ได้
ตัวอย่างดูได้จากแมวผมภาพเดิม ซึ่งภาพนี้เกิดจากการใช้ค่าเทรชโฮลที่ความเข้มสีเทา 127 ซึ่งหากพิกเซลใดของภาพเกรย์สเกลมีค่าความเข้มสีเทาต่ำกว่าค่าเทรชโฮลที่กำหนดก็จะให้มีสถานะเป็น 0 แต่หากพิกเซลใดมีค่าความเข้มสีเทามากกว่าค่าเทรชโฮลก็จะให้สถานะเป็น 1
ครั้งหน้าจะค่อยเข้าถึงส่วนของโปรแกรมMATLAB+DIPนะครับ ตอนนี้ขอไปนั่งปั่นเล่มโปรเจ็คก่อน  

Create Date : 24 เมษายน 2553 | | |
Last Update : 24 เมษายน 2553 22:52:00 น. |
Counter : 9128 Pageviews. |
| |
|
|
|
|
รูปร่างของภาพ (Image Shape) : ภาพ Grayscale
ภาพเกรย์สเกลหรือภาพระดับสีเทา พูดง่ายๆก็ภาพขาว-ดำ-เทา โดยจะมีระดับความเข้มของสีเท่าคือ 0-255 (8 bit) ภาพเกรย์สเกลเกิดจากการแปลงภาพสีRGBมาเป็นภาพGrayscale โดยใช้สูตรทางคณิตศาสตร์ดังนี้
Gray=0.299×R+0.587× G+0.114×B
Gray = ค่าความเข้มของสีเทาโดยจะมีค่าระหว่าง 0-255 R = ค่าความเข้มของสีแดงโดยจะมีค่าระหว่าง 0-255 G = ค่าความเข้มของสีเขียวโดยจะมีค่าระหว่าง 0-255 B = ค่าความเข้มของสีน้ำเงินโดยจะมีค่าระหว่าง 0-255
โดยขั้นตอนการคำนวณจะทำทีละพิกเซลไปเรีื่อยๆ จนครบทุกพิกเซล
ตัวอย่างดูได้จากแมวผมดังนี้

Create Date : 24 เมษายน 2553 | | |
Last Update : 24 เมษายน 2553 22:51:29 น. |
Counter : 9217 Pageviews. |
| |
|
|
|
|
รูปร่างของภาพ (Image Shape) : ภาำำพสี RGB
ขอโทษที่หายหน้าไปยาวนานเนื่องจากโปรเจ็คยังสอบไม่เสร็จ จะได้งานก็ไม่ได้ซักทีติดโปรเจ็คอยู่นั่นแหละ
เรามาเริ่มรู้จักภาพกันดีกว่าครับ ภาพในศาสตร์ของการประมวลผลภาพจะถูกกำหนดขอบเขตของภาพทุกภาพให้อยู่ในรูปสี่เหลี่ยม (Rectangular image model) ซึ่งทำให้ง่ายต่อการจัดเก็บข้อมูลเป็นอาร์เรย์หรืออาจมองอยู่ในรูปของเมตริกซ์ก็ได้ซึ่งโดยปกติในโปรแกรมแมทแลปก็จะมองเป็นเช่นนั้น ซึ่งค่าในแต่ละช่องนั้นก็คือพิกเซล(pixel)นั่นเ้อง
จำนวนบิตของข้อมูลในแต่ละพิกเซลนั้นจะเป็นตัวกำหนดความแตกต่างของระดับสีซึ่งถ้าข้อมูลในพิกเซลนั้นมี8บิตก็หมายความว่า 8 บิต = 2^8=256 สี (0-255)
ภาพในระบบสีRGB ก็หมายความว่ามีเมตริกซ์ขนาด 2D ซ้อนกันจำนวน 3 เมตริกซ์ ซึ่งก็คือค่าความเข้มแสงในสีต่างๆ คือสีแดง(R),สีเขียว(G),สีน้ำเงิน(B) ภาพสีในระบบ RGB จะมีจำนวนบิตต่อพิกเซลคือ 24 บิต หมายความว่าสามารถแสดงสีได้ถึง 16,777,216 สี
Red 8 bit Green 8 bit Blue 8 bit
RGB = 24 bit
ดูจากรูปแมวผมก็คงจะเข้าใจนะครับ

Create Date : 24 เมษายน 2553 | | |
Last Update : 24 เมษายน 2553 22:51:14 น. |
Counter : 3094 Pageviews. |
| |
|
|
|
|
| |
|
|