Group Blog
 
All Blogs
 

การแยกบริเวณรูปภาพ ( 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 : 14373 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 : 6459 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 : 8430 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 : 8495 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 : 3003 Pageviews.  

1  2  

jubchay
Location :


[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 7 คน [?]




Friends' blogs
[Add jubchay's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.