Sunday, December 30, 2012

GUI MATLAB plans for 2013

หลายเดือนที่ผ่านมาผมพยายามจัดการกับการศึกษาของตัวเอง ทำให้ไม่ค่อยได้เพิ่มเติมเกี่ยวกับ Blog นี้เท่าที่ควรจะเป็น ด้วยเหตุนี้ผมควรมีแผนการพัฒนาที่ชัดเจนและเตือนสติว่าให้แบ่งเวลามาให้บ้าง ในปี พ.ศ. 2556 นี้ผมวางแผนสำหรับ Blog ไว้ดังนี้


1. ชำระบัญชีที่ค้างเรื่อง ทฤษฎีเกี่ยวกับ Color image (RGB) ให้เสร็จ
2. มุ่งศึกษาเรื่อง Video processing
3. มุ่งศึกษาเรื่อง Pattern recognition
4. ศึกษาและพัฒนา Particle tracking and Particle counting

นี่แผนที่จะทำให้ผมได้เขียนเรื่องที่ผมศึกษาบน Blog นี้อย่างน้อยเดือนละหนึ่งเรื่องก็ยังดี ความมุ่งหวังและความสำคัญของหัวข้อต่างๆ นั้นอาจเป็นเรื่องที่ตายไปแล้วหากแต่ผมยังไม่มีความรู้ในด้านนี้จึงต้องศึกษา เพื่อนำไปใช้กับงานของผมและถ้าโชคดีอาจค้นพบว่าเรื่องต่างๆ มันยังไม่ตายสนิทก็เป็นได้ เป็นเวลากว่าหนึ่งปีที่เริ่มทำงานพวกนี้ ทำให้เห็นว่าบางศาสตร์สาขาวิชา ยังมีความต้องการการพัฒนาจากงานด้านนี้อยู่และดูเหมือนว่าจะช่วยทำให้ชีวิตพวกเขามีความสุขและง่ายขึ้น ดังนั้นการเลือกศึกษาศาสตร์ด้านนี้ของกระผมก็ไม่ได้เป็นการผลิตขยะหรือทรากปรักหักพังทางการศึกษาเสียทีเดียว

(ถ้าว่างจะจัดการเรื่อง การพัฒนา GUI สำหรับเรื่อง Rutherford scattering ให้สำเร็จสี่ตอน)

Sunday, December 16, 2012

Real time image and video processing with MATLAB

ก่อนอื่นต้องรับตามตรงว่า ผมยังไม่มีความรู้เกี่ยวกับ video processing ครับก็เลยลองค้นหาดูว่าใครทำอะไร มีปัญหา หรือช่องทางช่องว่างให้เราแทรกเข้าไปทำในส่วนที่ยังขาดหายไปหรือเปล่า แต่อย่างไรก็ตามครับ ผมก็ต้องเรียนจากชาวบ้านไปก่อน ผมไปเจออยู่เวบไซต์หนึ่งครับเห็นว่าเป็นตัวอย่างที่ไม่ซับซ้อนและทำงานได้ดีครับ เวบไซต์ที่ว่าก็คือ Matlabtips.com  และตัวอย่างที่ได้ลองเอามารันดูตามนี้ครับ ลองทำเป็นวีดิโอเพื่อนับจำนวนรถที่วิ่งผ่านถนนหน้าห้องทำงานครับ ก็พอจะมองเห็นว่าโปรแกรมนี้น่าเอาไปประโยชน์อย่างอื่นได้อีก ในภาพด้านล่างมีทั้งหมดสามรูปที่ผม print screen จากคอมพิวเตอร์ส่วนตัว ภาพเล็กด้านซ้ายสุดแสดงภาพที่ capture จากวีดิโอ เมื่อยังไม่มีวัตถุวิ่งผ่าน ภาพกลางเป็นมอเตอร์ไซต์วิ่งผ่าน และขวาสุดเป็นรถยนต์ที่วิ่งผ่านไป จะเห็นว่าค่าโดยเฉลี่ยของวีดิโอเฟรมเปลี่ยนแปลงในลักษณะเป็นพีคให้เราเห็นนะครับ ถ้าพัฒนาต่อปรับทั้งโปรแกรม เครื่องมือ และวิธีการ เก็บข้อมูล ผมว่าน่าจะใช้ประโยชน์ได้ในหลายแง่มุมครับ



   
และนี่เป็นตัวอย่างในยูทูปครับ ที่เจ้าของโค๊ดเขาทำไว้ครับ





ต้องติดตามกันต่อไปว่าเราจะต้มยำทำแกงกับโปรเจ็กนี้ต่อไปอย่างไรนะครับ ไม่แน่ผมอาจจะเอาไปนับเม็ดเลือดก็ได้นะครับ (เคยส่องเม็ดเลือดแดงบริเวณหางของปลาทอง สมัยเรียน) ก็เป็นโปรเจ็กที่น่าสนใจหรือไม่ก็เอาไปให้น้องๆที่สนใจ ไปพัฒนาเล่นๆ จะได้มีโปรเจ็กทำหากใครชอบแนวนี้ หรือจะเอาไปรวมกับวิธีการตรวจจับอะไรสักอย่างร่วมกับเทคนิคอื่น เช่นวัดการวาวแสงของวัตถุ วัดด้วยเทคนิคทางไฟฟ้า สรุปหลักการใหญ่ๆ มันก็มีไม่กี่แนวคิด แต่เวลาลงมือทำนี่สิไม่ใช่เรื่องง่ายๆ หลักการที่ว่าส่วนใหญ่ต้องอาศัยวิชาฟิสิกส์ทั้งนั้นละครับ เช่น ตรวจจับด้วย แสง ไฟฟ้า (กระแสไฟฟ้า สภาพการนำไฟฟ้า ค่าความจุไฟฟ้า ...) สนามแม่เหล็ก สนามไฟฟ้า คลื่นชนิดต่างๆ เป็นต้น

 ถ้าท่านไหนคิดอะไรได้หรือพัฒนาอะไรไปบ้างก็เอาแบ่งกันชมบ้างนะคร๊าบ

Wednesday, October 3, 2012

RBS: Rutherford Backscattering Spectrometry part I

วันนี้กลับมาอ่านเรื่อง Rutherford scattering และลองเข้าไปดูใน cyber space ว่ามีใครเขียน m-file เกี่ยวกับ การทดลองเรื่องนี้บ้างก็มีอยู่พอควรเลยครับ (จริงๆแล้ว มีเยอะมากครับ แต่ผมเฉพาะเจาะจงที่พัฒนาด้วย MATLAB อย่างเดียว) ที่โดดเด่น ท่านนี้เลยครับ Javier E. Hasbun เขียนหนังสือเรื่อง "Classical Mechanics With MATLAB Applications"  เขาอัพโหลด code ในตัวอย่างหนังสือไว้ที่ ===> mathwork ถ้าสนใจลองไปติดตามกันได้
จึงจะหยิบยกเอาส่วนที่คำนวนเกี่ยวกับพลังงานของ scattered particles มาพิจารณากัน เนื่องจากว่าห่างหายไปพอควรกับ blog นี้ก็เลยถือโอกาศมาขยับกันหน่อย ในเรื่องนี้ผมยังทำ GUI เหมือนเดิมอย่าพึ่งตกใจว่าพูดถึงฟิสิกส์มากไป มีความจำเป็นที่ต้องกล่าวถึงที่มาที่ไปจริงๆครับ วางแผนไว้ว่าจะแบ่งเป็นสี่ตอนครับ ทฤษฎีสองตอน ทำ GUI สองตอนครับ (หวังไว้ว่าอย่างนั้น) กลับมาที่ Rutherford scattering กันต่อ เราจะเริ่มด้วยการพิจารณา


$\textbf{Kinematics of Elastic Collisions}$

สำหรับ RBS นั้นเราจะเริ่มต้นด้วย การระดมยิ่งด้วย ไอออนที่มีพลังงานค่าเดียว (Monoenergetic particles) ไปยัง อะตอมของธาตุเป้า (Target atoms) เราเรียกไอออนที่เข้าไปชนว่า Incident ions หรือ Projectile ions ภาษาไทยขอเรียกว่า ไอออนกระสุน ตามเอกสารอ้างอิง [1] หลังจากชนแล้วไอออนกระสุนบางตัวจะกระเจิงกลับหลัง (Back scattering) มาตกกระทบที่หัววัด ทำให้ทราบว่าไอออนตัวนั้นกระเจิงออกมาแล้วเหลือพลังงานเท่าไร หลักการของหัววัดจะกล่าวถัดไป รูปด้านล่างเป็นการจัดชุดการทดลอง RBS

                                       
                            รูปที่ 1 ลักษณะการจัดวางเครื่องมือสำหรับการทดลอง RBS (บน) และ Elastic collision รูปนี้เขียนมาจาก เอกสารอ้างอิงที่ [2]

จากรูป ไอออนกระสุนมีมวล ความเร็ว และพลังงานเป็น $M_{1},\;v_{0}$ และ $E_{0}$ วิ่งเข้าไปชน อะตอมของธาตุเป้าที่อยู่นิ่ง มีมวลเป็น $M_{2}$ หลังจากชน ไอออนกระสุนกระเจิงกลับหลังด้วยมุม $\theta$ เรียกว่า Scattering angle โดยมีความเร็วและพลังงานเป็น $v_{1}$ และ $E_{1}$ ส่วนอะตอมของธาตุเป้า เคลื่อนที่ถอยหลังไปด้วยมุม $\phi$ มีความเร็วและพลังงานเป็น $v_{2}$ และ $E_{2}$ เรียก ว่า Recoil atom

การพิจารณาการถ่ายโอนพลังงานของการชนแบบไม่ยืดหยุ่น จะอาศัยกฎการอนุรักษ์พลังงาน และกฎการอนุรักษ์โมเมนตัม ซึ่งสามารถเขียนออกมาเป็นสมการดังนี้

$ (1)\;\;\;\;\;\;\;\;\;\; \frac{1}{2}M_{1}v_{0}^{2}=\frac{1}{2}M_{1}v_{1}^{2}+\frac{1}{2}M_{2}v_{2}^{2} $

$ (2)\;\;\;\;\;\;\;\;\;\;M_{1}v_{0}=M_{1}v_{1}cos\theta +M_{2}v_{2}cos\phi $

$ (3)\;\;\;\;\;\;\;\;\;\;0=M_{1}v_{1}sin\theta-M_{2}v_{2}sin\phi $

จากนั้นเราจะหาค่าอัตราส่วน $\frac{E_{1}}{E_{0}}$ หรือเรียกว่า $Kinematic\;factor\;\;K=\frac{E_{1}}{E_{0}}$

เริ่มจากกำจัดตัวแปร $\phi$ ทิ้งก่อน โดยการ ยกกำลังสองของสมการ 2 และ 3 แล้วจับมาลบกันจะได้สมการดังนี้

$ (4)\;\;\;\;\;\;\;\;\;\;M_{1}^{2}v_{0}^{2}=M_{2}^{2}v_{2}^{2}-M_{1}^{2}v_{1}^{2}+2M_{1}^{2}v_{0}v_{1}cos\theta$

จัดรูปใหม่ เพื่อกำจัด $v_{2}$ โดยเขียนสมการได้ดังนี้

$ (5)\;\;\;\;\;\;\;\;\;\;M_{2}^{2}v_{2}^{2}=M_{1}^{2}v_{1}^{2}+M_{1}^{2}v_{0}^{2}-2M_{1}^{2}v_{0}v_{1}cos\theta$

จากนั้นนำสมการที่ 5 ไปแทนในสมการที่ 1 จะได้สมการดังนี้

$ (6)\;\;\;\;\;\;\;\;\;\;M_{1}v_{0}^{2}=M_{1}v_{1}^{2}+\frac{M_{1}^{2}}{M_{2}}v_{0}^{2}+\frac{M_{1}^{2}}{M_{2}}v_{1}^{2}-2\frac{M_{1}^{2}}{M_{2}}v_{0}v_{1}cos\theta$

จากนั้น หารตลอดด้วย $M_{1}v_{0}^{2}$ และจัดรูปเป็นสมการกำลังสอง ได้ดังนี้

$ (7)\;\;\;\;\;\;\;\;\;\;0=(1+\frac{M_{1}}{M_{2}})(\frac{v_{1}}{v_{0}})^2-(\frac{2M_{1}cos\theta}{M_{2}})(\frac{v_{1}}{v_{0}})+(\frac{M_{1}}{M_{2}}-1)$

จากนั้นก็แก้สมการกำลังสอง จะได้คำตอบคือ

$ (8)\;\;\;\;\;\;\;\;\;\;\frac{v_{1}}{v_{0}}=\frac{M_{1}cos\theta}{M_{1}+M_{2}}\pm [(\frac{M_{1}}{M_{1}+M_{2}})^2cos^2\theta+(\frac{M_{2}-M_{1}}{M_{1}+M_{2}})]^{1/2}$

หรือ

$ (9)\;\;\;\;\;\;\;\;\;\;\frac{v_{1}}{v_{0}}=\frac{M_{1}cos\theta\pm[M_{2}^{2}-M_{1}^{2}sin^2\theta]^{1/2}}{M_{1}+M_{2}}$

สำหรับอัตราส่วนของพลังงาน เมื่อ $M_{1}<M_{2}$ จะเขียนได้ว่า

$ (10)\;\;\;\;\;\;\;\;\;\;\frac{E_{1}}{E_{0}}=[\frac{M_{1}cos\theta+[M_{2}^{2}-M_{1}^{2}sin^2\theta]^{1/2}}{M_{1}+M_{2}}]^2$

 โดยที่ $Kinematic\;factor,\;K=[\frac{M_{1}cos\theta+[M_{2}^{2}-M_{1}^{2}sin^2\theta]^{1/2}}{M_{1}+M_{2}}]^2$

ดังนั้น $E_{1}=KE_{0}$ หากย้อนไปพิจารณาสมการที่ 10 จะเห็นว่าพารามิเตอร์ $E_{0},\;E_{1}$ วัดได้โดยตรงจากหัววัด มุม $\theta$ เซตได้จากการทดลอง $M_{1}$ รู้อยู่แล้วในทางปฏิบัติจาก switching magnet (คัดเลือกมวลและประจุ) หรือใช้แหล่งกำเนิดที่รู้ชนิดของอนุภาคเช่น Alpha source (แต่คงต้องเป็นแหล่งกำเนิดที่แรงหน่อย) ดังนั้นจะเห็นว่าการทดลองนี้สามารถหา องค์ประกอบของตัวอย่างว่าประกอบด้วยธาตุอะไรบ้าง รายละเอียดติดตามได้จากเอกสารอ้างอิง (Refs. 1 และ 2)

ในตอนนี้ต้องจบไว้แค่นี้ครับ แล้วจะมาต่อในตอนถัดไป

References

[1] รองศาสตราจารย์ ดร. สมศร สิงขรัตน์ และ ดร. ธีรศักดิ์ คำวรรณะ, คู่มือแนะนำ เทคนิค RBS, RBS/channeling, PIXE และ IL: 4 เทคนิควิเคราะห์ธาตุด้วยลำไอออนในระดับไมโครเมตรและนาโนเมตร, ศูนย์วิจัยฟิสิกส์ของพลาสมาและลำอนุภาค, ภาควิชาฟิสิกส์และวัสดุศาสตร์ คณะวิทยาศาสตร์ มหาวิทยาลัยเชียงใหม่ 2553

[2] Terry L. Alford, Leonard C. Feldman and James W. Mayer. Fundamentals of Nanoscale Film Analysis, Springer 2007.

Thursday, August 30, 2012

Mean Square Displacement (MSD)


MSD Part I หลักการเบื้องต้นและเครื่องมือที่จำเป็นสำหรับการหา MSD ในงานเชิงชีวฟิสิกส์ อ่านรายละเอียดเพิ่มเติม >>> MSD I
MSD Part II
ทฤษฏีเริ่มต้นด้วย One-dimensional random walk เพื่อพาไปสู่สมการ mean square displacement ซึ่งมีรายละเอียดเกี่ยวกับความเข้าใจในเรื่อง diffusion ที่น่าจะมีพื้นฐานความเข้าใจไว้เบื้องต้น อ่านรายละเอียดเพิ่มเติม >>> MSD II
MSD Part III
ขั้นตอนและวิธีการเชิงเทคนิคเพื่อหาค่า MSD exponent ซึ่งเป็นค่าที่ใช้บ่งบอกพฤติกรรมของอนุภาคที่เคลื่อน อ่านรายละเอียดเพิ่มเติม >>> MSD III
MSD Part IV
ขั้นตอนการทำ MSD program โดยยืนบนพื้นฐาน GUI ของ MATLAB เพื่อใช้คำนวนหา MSD exponent อ่านรายละเอียดเพิ่มเติม >>> MSD IV

Tuesday, July 24, 2012

Image processing & Mean square displacement (MSD) part IV (GUI MATLAB)

ขาดหายไปนานสำหรับหัวข้อนี้ ตอนแรกคิดไว้จะให้เสร็จสิ้นในตอนที่ 4 นี้แต่ทว่าตัวโปรแกรมยังไม่สมบูรณ์ครับ ด้วยเหตุผลที่ผมต้องไปทำงานหลักที่สำคัญกับชีวิตผม จึงจำเป็นที่ต้องเขียนทั้งๆที่มันไม่สมบูรณ์นี่แหละ ผมต้องย้อนไปสักนิด ว่าการหา MSD นั้นในที่นี้ผมจะใช้ โปรแกรม SpotTracker ซึ่งเป็น plug-in ของ ImageJ ในการหาตำแหน่งของอนุภาคที่เราสนใจจากนั้น เอาตำแหน่งมาคำนวนหา MSD โดยใช้ source code ที่ช่วยๆ กันเขียนขึ้นกับเพื่อนและรุ่นพี่สมัยเรียน แต่ผมจับมาใส่ใน GUI MATLAB

รูปร่างหน้าตาโปรแกรมก็จะประมาณนี้ ครับ


ตัวโปรแกรมจะถูกแบ่งหน้าที่การทำงานเป็น 3 ส่วน ได้แก่

1. ส่วน Image processing ส่วนนี้คงต้องเป็นโปรเจกยาว เพราะต้องการให้มีหน้าที่ ทำได้ทั้งรูปและวิดิโอ รวมไปถึง การทำ tracking ด้วย ตอนนี้เอาไว้แสดง วีดิโอและภาพเท่านั้น

2. ส่วนแสดง Random walk แบบ 2 มิติ

3. ส่วนการคำนวน ประกอบด้วย ส่วนแสดงเส้นทางการเคลื่อนที่ของอนุภาค (Trajectory), velocity correlation และการคำนวน MSD exponent

-หากเป็นตำแหน่งของ Random walk จาก simulation เมื่อเลือก MSD cal. check box โปรแกรมจะคำนวน MSD exponent ให้
-หากจะคำนวน MSD exponent ของอนุภาคต้อง load positions ที่ได้จาก SpotTracker เข้ามาก่อนถึงจะคำนวนได้

หัวข้อนี้เนื้อหาสั้นครับ แต่โปรแกรมยาวพอควร หากผมต้องการพักสมองจากงานหลักเมื่อใดคงจะมาพัฒนาส่วนที่ยังขาดครับ งานนี้ไม่ง่ายเลยสำหรับผม แต่เชื่อว่าสักวันต้องเสร็จ 555 !

ไฟล์ต่างเข้าไปโหลดในนี้ได้เลย ImageProMSD

Tuesday, July 3, 2012

How to interface webcam with MATLAB

    วันนี้ข้ามมาเขียนเรื่องนี้ก่อนครับ มีน้องท่านหนึ่ง เขามาฝากข้อความไว้ ว่าสนใจเรื่องการติดต่อ Web camera แล้วให้มาแสดงผลใน GUI ของ MATLAB ตัวผมก็ไม่เคยทำเอาละว้าจะเริ่มไงก่อนดีละเนี่ย

    ปัจจุบันเทคโนโลยีด้านอิเล็กทรอนิกส์เจริญขึ้นอย่างรวดเร็ว ผลก็คือ เราก็มีเทคโนโลยีที่ดี และราคาถูกลง เช่นกันด้าน soft ware ก็มีการพัฒนาไปมาก เช่นโปรแกรมด้าน image processing ที่มีความสามารถหลากหลาย ก็แถมติดมากับแผ่น driver กล้อง web camera เลยก็ยังมี อีกทั้ง smart phone สมัยนี้มาแรงจริงๆครับ เทคโนโลยีของเขาถือว่าก้าวล้ำนำสมัย แต่ถ้าเรานั่งใช้นั่งรอเขาทำของใหม่ๆมาให้เราใช้ก็สะดวกอีกแบบครับ แต่ถ้าเราพอจะมีความรู้อยู่บ้าง และความต้องการด้าน soft ware ที่เฉพาะเจาะจง เพื่อให้เข้ากับงานของเรา การพัฒนาขึ้นใช้เองก็เป็นอีกทางออกหนึ่งครับ คิดเสียว่าเหมือนเราเขาโรงเรียนตอนเด็กยังไงทุกคนก็เริ่มจาก หัดท่องหัดเขียน (ก ข, a b c) เหมือนๆ กันครับ ไม่เป็นไรของแพงย่อมต้องดีอยู่แล้ว แต่ของที่ทำขึ้นเองก็ต้องดีในแบบฉบับของเราและแน่นอนมันภูใจครับ แต่หากท่านใดต้องการความสะดวกรวดเร็ว  และมีกำลังทรัพย์ผมถือว่าเป็นความได้เปรียบอย่างหนึ่งครับ
    กลับมาที่น้องเขาฝากข้อความไว้ (ไม่รู้จะกลับมาดูอีกไหม) ก็ประจวบเหมาะที่ผมเคยซื้อเจ้า webcam (Oker, web camera 177) มาไว้ใช้งานเก็บข้อมูลบางอย่าง ไว้นานแล้วเหมือนกัน ตอนนั้นผมใช้ soft ware ทั่วไปที่มีแจกกันใน cyber space ผมก็คิดไปคิดมา ว่าจะเริ่มยังไง เพราะไม่เคยทำมาก่อน สุดท้ายก็ลองมั่ว กันสักพักแต่ก็โชคดีที่หา key word ได้ถูกเลยค้นได้ง่ายหน่อย ผมค้นสองทาง ทางแรกใน internet และทางที่สอง MATLAB Help เว็บไซต์หนึ่งที่ผมเข้าไปดูและ ขอขอบคุณไว้ตรงนี้  Video & Image Acquisition using MATLAB

ก่อนอื่นผมใช้คำสั่งพวกนี้ครับ เพื่อตรวจสอบที่เกี่ยวกับข้อมูลวิดีโอ

>> imaqhwinfo('winvideo')

ans =

       AdaptorDllName: [1x81 char]
    AdaptorDllVersion: '3.2 (R2008b)'
          AdaptorName: 'winvideo'
            DeviceIDs: {[1]  [2]  [3]}
           DeviceInfo: [1x3 struct]
ปรากฏว่าพบ Devices สามตัวด้วยกัน ผมก็ตรวจดูทีละตัวว่าตัวไหนกำกับด้วย DeviceID อะไร
ในที่นี้ Oker 177 กำหนดเป็นตัวที่ 2 ก็ลองตรวจดูรายละเอียด ก็อย่างที่เห็นด้านล่างเลยครับ

>> dev2=imaqhwinfo('winvideo',2)

dev2 =

          DefaultFormat: 'RGB24_640x480'
    DeviceFileSupported: 0
             DeviceName: 'USB Video Device'
               DeviceID: 2
      ObjectConstructor: 'videoinput('winvideo', 2)'
       SupportedFormats: {1x18 cell}

จากนั้นผมก็คำสั่ง videoinput เพื่อเตรียม video ให้กับ object ของเราในที่นี้ให้ชื่อว่า vid ส่วน winvideo
นั้นเป็นชื่อ adapter ที่ใช้ติดต่อกับ webcam ส่วนเลข 2 ก็เป็น device ID จากนั้นใช้คำสั่ง preview เพื่อแสดง video

>> vid=videoinput('winvideo',2);
>> preview(vid);


จากนั้นก็ลองทำ GUI ขึ้นมาหน้าตาประมาณนี้ จุดประสงค์ของ GUI นี้คือ แสดง video ที่รับมาจาก webcam สามารถ capture เป็นรูปภาพได้พร้อมจัดเก็บ มีชุดประมวลผลด้านภาพ หรือ วิดีโอ (คงต้องเพิ่มเติมทีหลัง ตอนนี้ยังไม่มีปัญหาที่ชัดเจนว่าจะเอาไปใช้แก้ปัญหาอะไร)



ในเบื้องต้นยังไม่ได้พัฒนาอะไรเลย แค่ติดต่อ webcam แล้ว capture ภาพนิ่งเท่านั้น เวอร์ชันต่อไปคงทำส่วนของ processing ครับ



สำหรับไฟล์ต่างที่แสดงในนี้ หากใครสนใจจะลองเอาไปเป็นแนวทางหรือเอาไปพัฒนาต่อ ตามลิ้งนี้เลย Download files>>> webcam1

ในส่วนของคำสั่งที่จะปรากฏใน m-file มีรายละเอียดหลัก มีดังนี้


% --- Executes on button press in disconnect.
function disconnect_Callback(hObject, eventdata, handles)
% hObject    handle to disconnect (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
closepreview

% --- Executes on button press in connect.
function connect_Callback(hObject, eventdata, handles)
% hObject    handle to connect (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes1);

check1=get(handles.Camera1,'value');
check2=get(handles.Camera2,'value');
check3=get(handles.Camera3,'value');

if (check1==1)
obj=videoinput('winvideo',1);
elseif (check2==1)
obj=videoinput('winvideo',2);
else
obj=videoinput('winvideo',3);
end

vidRes = get(obj, 'VideoResolution'); % Resolution of device ex. 640x480
nBands = get(obj, 'NumberOfBands'); % number of channels ex. 3=RGB image
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(obj, hImage);

handles.objVideo=obj;
guidata(hObject, handles);

% --- Executes on button press in capture.
function capture_Callback(hObject, eventdata, handles)
% hObject    handle to capture (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes3);
im=getsnapshot(handles.objVideo);
handles.image=im;
imshow(handles.image);
%delete(handles.objVideo);% clear memory
guidata(hObject, handles);

% --- Executes on selection change in listbox1.
function listbox1_Callback(hObject, eventdata, handles)
% hObject    handle to listbox1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
files = dir(fullfile(theFolder, '*.jpg'));
set(handles.listbox1, 'string', {files.name})
% Hints: contents = get(hObject,'String') returns listbox1 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listbox1


% --- Executes during object creation, after setting all properties.
function listbox1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to listbox1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in save.
function save_Callback(hObject, eventdata, handles)
% hObject    handle to save (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%current_image=handles.image;
imsave

% --- Executes on button press in CloseWindow.
function CloseWindow_Callback(hObject, eventdata, handles)
% hObject    handle to CloseWindow (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
close(ancestor(hObject,'figure'))


% --- Executes on button press in Camera1.
function Camera1_Callback(hObject, eventdata, handles)
% hObject    handle to Camera1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Camera1


% --- Executes on button press in Camera2.
function Camera2_Callback(hObject, eventdata, handles)
% hObject    handle to Camera2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Camera2


% --- Executes on button press in Camera3.
function Camera3_Callback(hObject, eventdata, handles)
% hObject    handle to Camera3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Camera3


% --- Executes on button press in processingUnit.
function processingUnit_Callback(hObject, eventdata, handles)
% hObject    handle to processingUnit (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
process_check=get(handles.processingUnit,'value');
if (process_check==1)
setappdata(0, 'cap_image', handles.image);% ?????????????????? handles.dataShow ????? test_data
ImagePro;
end% open externalTable GUI
% Hint: get(hObject,'Value') returns toggle state of processingUnit

Tuesday, June 19, 2012

Image processing & Mean square displacement (MSD) part III

          ในส่วนนี้จะกล่าวถึงวิธีการ ขั้นตอน เพื่อให้ได้มาซึ่ง MSD ของระบบที่เราสนใจ

รูปที่ 1: (ก) แสดงเส้นทางการเดินของ Random walker ในสองมิติ เส้นทึบแสดงการกระจัดที่เป็น single step และเส้นประแสดงการกระจัดที่เป็น double step,  (ข) กราฟระหว่าง time intervals กับ square displacements  และ (ค) แสดง linear fit เพื่อดูว่า diffusion exponent เป็นเท่าไรเพื่อนำไปแปลความหมายต่อไป (รูปที่1 ยกมาจาก Ref. [1] ขอกราบขอบพระคุณมา ณ ที่นี้)
           ในรูปที่1 (ก) นั้น ในทางเทคนิคก็จะเป็นภาพหรือวิดิโอที่ผู้ศึกษา ถ่ายบันทึกการเคลื่อนที่ของอนุภาค แล้วใช้โปรแกรม particle tracking มาช่วยหาตำแหน่งอนุภาคที่เราสนใจ ก่อนที่จะไปถึงกระบวนค้นหา MSD นั้นขอหยิบยกรายละเอียดทางเทคนิคของ MSD มากล่าวอีกครั้งหนึ่ง
          พิจารณารูปที่1 (ก) จากตำแหน่งที่ 1 ไปยังตำแหน่งที่  2 และถัดไปมีเวลาห่างกันเป็น $\Delta {t}$ ซึ่งเรียกว่า lag time จากนั้นลองหาค่า displacement ที่ lag time เท่ากับ $\Delta {t}$

$\; \; \; \; \; \; \; \; \; \;x_{1}=x(t_{1})\; \; \; \; \; \; \; \; \; \; x_{2}=x(t_{1}+\Delta{t}) \; \; \; \; \; \; \; \; \; \; \Delta x_{1}(\Delta t)=x_{2}-x_{1}$

$\; \; \; \; \; \; \; \; \; \; y_{1}=y(t_{1})\; \; \; \; \; \; \; \; \; \; y_{2}=y(t_{1}+\Delta{t})\; \; \; \; \; \; \; \; \; \; \Delta y_{1}(\Delta t)=y_{2}-y_{1}$

$\; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; $


$\; \; \; \; \; \; \; \; \; \; x_{i}=x(t_{i})\; \; \; \; \; \; \; \; \; \; x_{i+1}=x(t_{i}+\Delta{t})\; \; \; \; \; \; \; \; \; \; \Delta x_{i}(\Delta t)=x_{i+1}-x_{i}$

$\; \; \; \; \; \; \; \; \; \; y_{i}=y(t_{i})\; \; \; \; \; \; \; \; \; \; y_{i+1}=y(t_{i}+\Delta{t})\; \; \; \; \; \; \; \; \; \; \Delta y_{i}(\Delta t)=y_{i+1}-y_{i}$

ดังนั้นค่า square displacement ก็สามารถได้ว่า

สำหรับ single lag time $\Delta t$

$\; \; \; \; \; \; \; \; \; \; (\Delta r_{i}(\Delta{t}))^{2}=(\Delta x_{i}(\Delta{t}))^{2}+(\Delta y_{i}(\Delta{t}))^{2}$

สำหรับ double lag time $\Delta t$

 $\; \; \; \; \; \; \; \; \; \; (\Delta r_{i}(\Delta{t}))^{2}=(\Delta x_{i}(\Delta{t}))^{2}+(\Delta y_{i}(\Delta{t}))^{2}$

 $\; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \;$

สำหรับ n lag time $n\Delta t$

$\; \; \; \; \; \; \; \; \; \; (\Delta r_{i}(\Delta{t}))^{2}=(\Delta x_{i}(\Delta{t}))^{2}+(\Delta y_{i}(\Delta{t}))^{2}$

และค่า mean square displacement ตลอดการเคลื่อนที่สำหรับ single lag time $\Delta{t}$ สามารถเขียนได้เป็น

$\; \; \; \; \; \; \; \; \; \; \left \langle (\Delta r_{i}(\Delta{t}))^{2} \right \rangle=\frac{1}{n}\left ( (\Delta r_{1}(\Delta{t}))^{2}+(\Delta r_{2}(\Delta{t}))^{2}+\Delta r_{3}(\Delta{t}))^{2}+\cdots  \right )=\frac{1}{n}\sum_{i=1}^{n}r_{i}^{2}(\Delta t)$

          ในทำนองเดียวกันนะครับ ถ้าเป็น double step ในช่วงเวลา $2\Delta t$ หรือจะเป็น $3\Delta t$, $4\Delta t$ ซึ่งจะให้ได้ข้อมูล MSD เหมือนในรูปที่ 1 (ข)

ขอยกสมการในเอกสารการศึกษาของ Kanthang และคณะ [3]  ที่หาค่า MSD สำหรับตลอดเส้นทางการเคลื่อนที่ของโปนตีนชนิดหนึ่งซึ่งอยู่ในแบคทีเรียที่ชื่อว่า E. coli

$\; \; \; \; \; \; \; \; \; \;\left \langle (\Delta r)^2 \right \rangle=\frac{1}{N-1-n}\sum_{i=1}^{N-1-n}\left \{ \left [ x(i\Delta t+n\Delta t)-x(i\Delta t) \right ]^2 + \left [ y(i\Delta t+n\Delta t)-y(i\Delta t) \right ]^2 \right \}$

โดยที่
$N$ คือ the total number of frames, $n$ คือ the number of the time interval ซึ่งเกี่ยวข้องกับ lag time

และ $i$ คือ the positive integer



References

[1]  Jakob C. Schweizer, January 26, 2007. Practical Course: Single-Particle-Tracking. 
[2] M.J. Saxton, K. Jacobson, "SINGLE-PARTICLE TRACKING: Applications to Membrane Dynamics" Annu. Rev. Biophys. Biomol. Struct. 26, 373 (1997)
[3] Kanthang P, Ngamsaad W, Nuttavut N, Triampo W, Triampo D, Krittanai C, "Biophysical approach for studying the MinD protein dynamics and energy landscape: a novel use of the spot tracking technique" European Physical Journal-Applied Physics 2011, 55(1):11201.
 [4] Unai S, Kanthang P, Junthon U, Ngamsaad W, Triampo W, Modchang C, Krittanai C, "Quantitative analysis of time-series fluorescence microscopy using a spot tracking method : application to Min protein dynamics" Biologia 2009, 64(1):27-42.
[5] D. Sage, F.R. Neumann, F. Hediger, S.M. Gasser, M. Unser, "Automatic Tracking of Individual Fluorescence Particles: Application to the Study of Chromosome Dynamics," IEEE Transactions on Image Processing, vol. 14, no. 9, pp. 1372-1383, September 2005.
[6] ImageJ, free software, available online: http://rsbweb.nih.gov/ij/

Thursday, June 7, 2012

Image processing & Mean square displacement (MSD) part II

เนื้อหาหลักๆ ที่เป็นทฤษฎี ผมพยายามแปลมาจากหนังสือเรื่อง Random Walks in Biology เขียนโดย Howard C. Berg ขอกราบขอบพระคุณเป็นภาษาไทยไว้ ณ ที่นี้ด้วยครับ ส่วนของเนื้อหาที่เป็นสมการผมจะพยายามหาแหล่งอ้างอิงที่เป็นหนังสือ (ที่คิดว่าหาอ่านได้ในห้องสมุดคณะวิทยาศาสตร์ในมหาวิทยาลัยทั่วไป) และลิงค์บนอินเตอร์เน็ต อย่างไรก็ดีหากท่านผ่านเข้ามาเจอไซต์นี้แล้ว พบว่าเขียนด้วยความเข้าใจผิดหรือคลาดเคลื่อนตรงไหนขอได้รับความกรุณา แก้ให้ถูกต้องด้วยครับ ขอขอบคุณ

$\textbf{Microscopic theory}$

ลองพิจารณาในระบบเล็กๆดูก่อน พิจารณาที่โมเลกุลหรืออนุภาคเล็กๆ ซึ่งเคลื่อนที่อันเนื่องมาจากพลังงานความร้อน สมมติพิจารณาอนุภาคที่มีมวล $m$ มีความเร็วในแนวแกน $x$ เป็น $v_x$ ดังนั้นอนุภาคนี้จะมีพลังงานจลน์คือ $\frac{1}{2}mv_{x}^{2}$ โดยเฉลี่ยแล้วปริมาณนี้ (มีความผันผวนตลอดเวลา) สามารถเขียนได้เป็น

$(1) \: \: \: \: \: \: \: \: \: \: \: <\frac{1}{2}mv_{x}^{2}>=\frac{1}{2}kT\: \: \: , k=Boltzmann\: constant $

$ \: \: \: \: \: \: \: \: \: \: \: \: \: \:\: \: \:\: \: \:\: \: \:\: \: \:\: \: \:\: \: \:\: \: \:\: \: \:\: \: \: \: \: \: \: \: \: \:, T=Absolute\:\:temperature$

จากความสัมพันธ์ในสมการที่ (1) เราสามารถเขียน root-mean-square velocity ได้เป็น

$ \frac{1}{2}m<v_{x}^{2}>=\frac{1}{2}kT $

$<v_{x}^{2}>^{1/2}=\left(\frac{kT}{m}\right)^{1/2} $

ยกตัวอย่างเช่น protein lysozyme มีมวลโมเลกุลเท่ากับ $ 1.4\times 10^{4}\:g $ ดังนั้นโปรตีนนี้จำนวน 1 โมเลกุลจะมีมวล $ m=2.3\times10^{-20}\:g $ ถ้าที่อุณหภูมิห้อง 300 K ดังนั้นค่า $<v_{x}^{2}>^{1/2}=13\:\:m/s $ ลองคิดดูเล่นๆนะครับว่า โปรตีนชนิดนี้ใช้เวลาเพียง 1 วินาที ในการข้ามถนน 4 เลน แต่ทว่าในความเป็นจริงมิได้เป็นอย่างนั้นเพราะโปรตีนอยู่ในสารละลายไม่ได้อยู่ในสุญญากาศ ดังนั้นต้องวิ่งไปชนกับโมเลกุลของน้ำก่อนอย่างแน่นอน

$\textbf{One-dimensional random walk}$

ต่อไปลองพิจารณา diffusion ในหนึ่งมิติกันดูบ้างพิจารณาการเคลื่อนที่ของอนุภาค (Random walker) ในแนวแกน $ x $ โดยที่ เมื่อเริ่มต้นที่เวลา $ t=0 $ อนุภาคอยู่ที่ตำแหน่ง $ x=0 $ มีเงื่อนไขข้อกำหนด สำหรับ random walk ดังนี้

กฏเกณฑ์สำหรับ 1-D Random Walk

1. แต่ละย่างก้าวของอนุภาคที่เคลื่อนที่ไปทางซ้ายหรือขวา จะใช้เวลา $\tau$ เคลื่อนที่ด้วยความเร็ว $\pm v_{x}$ ดังนั้นจะได้ระยะกระจัดเป็น $\delta =\pm v_{x}\tau$ เพื่อให้ง่ายที่สุด
$\tau$ และ $\delta$ จะถูกกำหนดให้เป็นค่าคงที่แต่ในความเป็นจริงจะขึ้นกับ ขนาดของอนุภาค ลักษณะของเหลวที่เป็นตัวกลาง และอุณหภูมิ $T$

2. โอกาสที่อนุภาคจะเคลื่อนที่ไปทาง ซ้ายหรือขวา มีโอกาสเท่ากันคือ $\frac{1}{2}$

3. อนุภาคเคลื่อนที่อย่างอิสระต่อกันไม่มีการชนระหว่างอนุภาคด้วยกัน ในทางปฏิบัติทำได้โดยการทำให้เจือจาง คือใส่อนุภาคจำนวนน้อยๆเมื่อเทียบกับปริมาตรของ ของเหลวตัวกลาง

    ต่อไปจะพิจารณากฏเกณฑ์ทั้ง 3 ข้อ เพื่อดูว่าเราจะได้อะไรบ้าง ก่อนอื่นสมมติว่ากำลังพิจารณาระบบ (ensemble) ที่มีอนุภาคจำนวน $N$ ตัว ให้ $x_{i}(n)$ เป็นอนุภาคตัวที่ $i$ ที่ก้าวเดินไปแล้ว $n$ ครั้ง
จากกฏข้อที่ 1 ตำแหน่งของอนุภาคที่เดินไปแล้ว $n$ ตรั้ง จะห่างจากตำแหน่งที่ $n-1$ เป็น $\pm \delta$ ซึ่งเขียนความหมายทางคณิตศาสตร์ได้เป็น

$(2) \; \; \; \; \; \; \; x_{i}(n)=x_{i}(n-1)\pm \delta\; ,\pm$ ได้มาจากกฏข้อที่ 2 และ 3

เราสามารถเขียนค่าเฉลี่ยของระยะกระจัด (Mean displacement) ของอนุภาคในระบบเมื่อก้าวเดินไปแล้ว $n$ ครั้ง ได้ว่า

$(3) \; \; \; \; \; \; \; <x(n)>=\frac{1}{N}\sum_{i=1}^{N}x_{i}(n)\;,$ ของทุกอนุภาค

จากนั้นเขียน $x_{i}(n)$ ในเทอมของ $x_{i}(n-1)$

$\; \; \; \; \; \; \; \; <x(n)>=\frac{1}{N}\sum_{i=1}^{N}\left \{ x_{i}(n-1)\pm\delta \right \}$

$\; \; \; \; \; \; \; \; <x(n)>=\frac{1}{N}\sum_{i=1}^{N}x_{i}(n-1)$

$(4) \; \; \; \; \; \; \; <x(n)>=<x(n-1)>$

สมการที่ 4 บอกให้เราทราบว่า mean displacement ไม่ได้มีการเปลี่ยนแปลง จากก้าวหนึ่งไปสู่อีกก้าวหนึ่ง (step to step) จากนั้นลองมาดูว่าอนุภาคจะแผ่กระจายออกไปอย่างไร ห่างจากจุดเริ่มต้นเท่าไร ซึ่งจะพิจารณาถึงค่า root-mean-square displacement
$<x^{2}(n)>^{1/2}$ เอาง่ายๆ ก็คือพิจารณาหาค่าขนาดของการกระจัดนั่นเอง เราจะเริ่มต้นที่หา $<x^{2}(n)>$ โดยการเขียน $x_{i}(n)$ ให้อยู่ในรูปของ $x_{i}(n-1)$

$\; \; \; \; \; \; \; \; x_{i}(n)=x_{i}(n-1)\pm \delta$

จากนั้นยกกำลังสองทั้งสองข้าง จะได้

$(5) \; \; \; \; \; \; \; x_{i}^{2}(n)=x_{i}^{2}(n-1)\pm 2\delta x_{i}(n-1)+\delta^{2}$

จากนั้นก็หาค่าเฉลี่ย ดังสมการด้านล่าง

$\; \; \; \; \; \; \; \; <x(n)>=\frac{1}{N}\sum_{i=1}^{N}x_{i}(n)$

ดังนั้นหาค่าเฉลี่ยของ $(5)$ ก็จะได้ว่า

$\; \; \; \; \; \; \; \; <x^{2}(n)>=\frac{1}{N}\sum_{i=1}^{N}\left \{ x_{i}^{2}(n-1)\pm 2\delta x_{i}(n-1)+\delta ^{2} \right \}$

$(6) \; \; \; \; \; \; \; <x^{2}(n)>=<x^{2}(n-1)>+\delta^{2}$

โดยเฉลี่ยแล้วพจน์ที่สองก็จะหายไป ทีนี้ลองพิจารณาสมการที่ $(6)$ ที่จุดเริ่มต้นแน่นอนว่า อนุภาคอยู่ที่จุด $(0,0)$ ที่เวลา $t=0,\;x_{i}(0)=0$

$\; \; \; \; \; \; \; \; <x^{2}(0)>=0$

$\; \; \; \; \; \; \; \; <x^{2}(1)>=<x^{2}(0)>+\delta^{2}=\delta^{2}$

$\; \; \; \; \; \; \; \; <x^{2}(2)>=<x^{2}(1)>+\delta^{2}=2\delta^{2}$

$\; \; \; \; \; \; \; \; \; \; \; \vdots \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \;\vdots$

$(7) \; \; \; \;  <x^{2}(n)>=<x^{2}(n-1)>+\delta^{2}=n\delta^{2}$

จากนั้นเราจะเขียน $n$ ให้อยู่ในรูปของเวลา $t$ ซึ่งต้องย้อนกลับไปดูกฎข้อที่ 1 ก็จะทำให้เราได้ว่า $t=n\tau$ ดังนั้นสามารถเขียน  $n=\frac{t}{\tau}$

$\therefore \; \; \; \; \; \; \; <x^{2}(t)>=\frac{t}{\tau}\delta^{2}$

$(8) \; \; \; \; \; \; \; <x^{2}(t)>=\left (\frac{\delta^{2}}{\tau}  \right )t$

เขียนสมการที่ $(8)$ ใหม่เป็น

$(9) \; \; \; \; \; \; \; \; \; <x^{2}>=2Dt,\; D=diffusion\;coefficient$

$(10) \; \; \; \; \; \; \; <x^{2}(t)>^{1/2}=(2Dt)^{1/2}$

จะเห็นว่าอนุภาคจะกระจายตัวออกไปโดยขึ้นกับเวลา แต่เป็น $t^{1/2}$ เช่น ถ้าเราต้องให้อนุภาคเคลื่อนที่ไปไกล 2 เท่า ก็ต้องใช้เวลานานเป็น 4 เท่า ถ้าต้องการให้ไปไกลเป็น 10 เท่า ก็ต้องรอนานเป็น 100 เท่า อะไรอย่างนั้นนะครับ ดังนั้นเราจึงเห็นว่าหมึกที่หยดไปในน้ำจะใช้เวลานานขึ้นเมื่อเทียบกับการกระจายในช่วงต้นๆ ครับ 

$\textbf{References}$

- Howard C. Berg. "Random Walks in Biology", Princeton University Press, 1993, pp. 5-36.

Monday, May 21, 2012

Image processing & Mean square displacement (MSD) part I


ครั้งนี้ผมขอก้าวข้ามมาเขียนเรื่องที่เป็นวิชาการสักหน่อยครับ (Stochastic Process) เนื่องจากเมื่อต้นเดือน พฤษภาคม ที่ผ่านมาผมได้มีโอกาสไปร่วมงานประชุมวิชาการ และเข้าร่วมฟังการประกวดโครงงานก่อนจบของนักศึกษาระดับปริญญาตรี (Senior project) มีทั้งหมด 5 ท่านด้วยกัน รางวัลที่ 1 นั้นเป็นของมหาวิทยาลัยเชียงใหม่ครับ นำเสนอเกี่ยวกับ ผลของการไหลแบบดีนในท่อสี่เลี่ยมโค้งขนาดไมโครเมตร ศึกษาทั้งทาง ทฤษฎีและการทดลอง (หรือพูดอีกแบบหนึ่งคือ วัด Dean number และศึกษาว่ามีผลกับการเกิดปรากฎการณ์แบบ Dean อย่างไร) ซึ่งถือว่ามีประโยชน์ทั้งทางวิชาการ และการนำไปใช้ด้าน Lab-on-a Chip
                ส่วนเรื่องที่ผมจะนำมาเขียนในครั้งนี้ได้รับรางวัลรองชนะเลิศอันดับ 2 หรือ 3 ไม่แน่ใจ แต่เรื่องที่นำเสนอคือ การหาค่า Boltzmann constant จากการเคลื่อนที่แบบบราวน์ (Brownian motion) ในสองมิติ น้องเขาใช้เทคนิคที่เรียกว่า particle tracking โดยใช้ CCD camera ถ่ายภาพ micro bead ที่ล่องลอยเคลื่อนที่ไปมาในของเหลวที่เตรียมไว้ ผ่านกล้องจุลทรรศน์กำลังขยายสูง (แต่จำไม่ได้ว่ากี่ x) แต่ผมคงฟังไม่ทันในเรื่องของ algorithm ที่ใช้คำนวณ mean square displacement งงๆ เล็กน้อย  แต่ผมว่าถือเป็นงานที่ดีเลยทีเดียวครับ มีเครื่องมือที่ทันสมัย การทำความเข้าใจกับเรื่องนี้ก็ไม่ใช่เรื่องง่าย สำหรับปริญญาตรี ผมว่าดีครับ ดังนั้นเพื่อเป็นการทบทวนความรู้และสร้างความเข้าใจที่แม่นยำของตัวเอง ผมจึงเขียนบันทึกนี้ขึ้นมาเพื่อนำเสนองานที่เกี่ยวข้องกับเรื่องของ Image processing และใช้ใช้ประโยชน์ในงานด้านฟิสิกส์
                ก่อนอื่นขอแนะนำเทคนิค Particle tracking ก่อนนะครับ เทคนิคนี้โดยรวม ใช้ศึกษาพฤติกรรมของอนุภาคที่ผู้ศึกษาสนใจ ในเรื่อง dynamic ของมันครับ ข้อมูลที่ผู้ศึกษาอยากได้ก็คือ ตำแหน่งและเวลาของอนุภาคครับ ก่อนการพัฒนาโปรแกรมคอมพิวเตอร์สำหรับการ track ผู้ที่ศึกษาต้องถ่ายรูปแล้ว วัดหาตำแหน่งโดยใช้แรงงานคนนี่แหละครับ ลองคิดดูว่าถ้าเราถ่ายรูปไว้สัก 500 หรือ 1000 รูป ต้องใช้เวลาเก็บข้อมูลนานขนาดไหน (ถือเป็นเรื่องที่ต้องใช้ความบากบั่นและอดทนสูงมาก ครับ) นี่ยังไม่คิดถึงความคลาดเคลื่อนที่เกิดจากการวัดอีกนะครับ แต่เมื่อมีการพัฒนา tracking software ก็ทำให้งานในสาขานี้ ง่ายขึ้น และพัฒนาผลงานดีๆกันได้มากขึ้น มีคู่มือปฏิบัติการที่เขียนไว้ดีมากเกี่ยวกับ single particle tracking ลองดูที่นี่เลยครับ Practical Course: Single-Particle-Tracking 
Particle tracking technique แปลตรงๆ เป็นภาษาไทยว่า “เทคนิคการติดตามอนุภาค” อนุภาคในที่นี้จะเป็นอะไรก็ได้ที่มีลักษณะเป็นกลุ่มก้อนสามารถระบุได้ว่าเป็นวัตถุหนึ่งวัตถุ เช่น micro bead, cell, molecule, atom, pollen, dust particle เ็ป็นต้น (หรือแม้กระทั่งตัวบุคคล ลูกฟุตบอล ก็สามารถ ใช้เทคนิคได้เช่นกันครับ แต่จะศึกษาอะไรก็ว่ากันไปครับ) เทคนิคนี้เริ่มจาก การถ่ายภาพของอนุภาคที่เราสนใจว่ามันมีพฤติกรรมเชิงพลวัต (dynamic) อย่างไร ภาพที่ได้จะเป็น video หรือ image sequence ก็ได้ (ดังนั้นภาพจะบอก ตำแหน่งใน space ซึ่งจะเป็น 2 หรือ 3-dimension ก็แล้วแต่ว่าถ่ายภาพแบบไหน) จากนั้นใช้ Particle tracking software หาตำแหน่งของอนุภาคที่เราสนใจบันทึกออกมาเป็นพิกัดของอนุภาค ณ เวลานั้นๆ เมื่อได้ตำแหน่งจาก tracking software และเวลา จากข้อมูลการถ่ายภาพ  ข้อมูลดังกล่าว (ตำแหน่งและเวลา) จะถูกนำไปวิเคราะห์เพื่อแปลความหมายตามงานที่ผู้ศึกษาสนใจต่อไป
Mean square displacement (MSD) เป็นปริมาณสำคัญ ที่มักถูกใช้วิเคราะห์ว่า dynamic ของอนุภาคที่เราสนใจ ว่าเป็นอย่างไรและสามารถแปลผลออกมาทาง กายภาพ และ/หรือ ชีวภาพ ได้ว่าอย่างไร เช่น อนุภาคเลื่อนอย่างอิสระ เคลื่อนโดยถูกหน่วง เคลื่อนที่แบบมีจังหวะเวลาหน่วงอันเนื่องปัจจัยภายนอกหรือปฏิสัมพันธ์ของอนุภาคเอง เป็นต้น

ขอยกตัวอย่างให้เห็นภาพโดยรวมของความแตกต่างระหว่าง Deterministic  process กับ Stochastic process ก่อนนะครับ
สำหรับ Deterministic  process เช่น สมมติเราเดิน กรุงเทพ ฯ - ปัตตานี ระยะทาง 1,000 กิโลเมตร ด้วยเครื่องโบอิง 747 บินที่อัตราเร็วเฉลี่ย 970 กิโลเมตรต่อชั่วโมง เราจะคำนวณได้ทันทีเลยว่าจะใช้เวลาเดินทางจาก กรุงเทพ ฯ ถึง ปัตตานี ประมาณ 1 ชั่วโมง
แต่ถ้าเป็น Stochastic process สมมติเราจะเดินออกจากประตูบ้านถึงประตูรั้วบ้าน แต่มีเงื่อนไขว่า จะโยนเหรียญเพื่อกำหนดทิศทางการเดิน ถ้าออกหัวเราจะเดินหน้า 1 ก้าว แต่ถ้าออกก้อยจะเดินถอยหลัง 1 ก้าว ถ้าถามว่าหลังจากโยนเหรียญไปแล้ว 10 ครั้ง เรายืน ณ จุดใด แบบนี้นี่เราตอบไม่ได้ ไม่รู้ว่าจะอยู่จุดใด และถ้าทำการเดินแบบนี้ซ้ำๆ กัน ผ่านไป 10 ครั้งรับรอง ตำแหน่งสุดท้ายที่เรายืนไม่ซ้ำกันแน่ (แต่ก็พอมีโอกาสที่จะซ้ำอยู่ครับเพราะเราสมมติเดินใน 1 มิติ แต่ถ้าเราเพิ่มเงื่อนไข ซ้าย-ขวา เข้าไปอีกโอกาสที่จะซ้ำจะน้อยลงไปอีก)
คงจะเห็นภาพความแตกต่างนะครับ ทีนี้ลองดูภาพประกอบครับ เส้นทางการเดินของ Random walker เป็นอย่างไรกันบ้างนะครับ
>>> Brownian motion

นี่เป็นการ์ตูนสำหรับ Brownian motion ครับ ในเหตุการจริง เช่น เกสรดอกไม้ที่ล่องลอยในน้ำ ถ้าจะเปรียบเทียบ ลูกบอลใหญ่สีน้ำเงินสมมติเป็นเกสรดอกไม้ ส่วนลูกบอลเล็กสีแดงสมมติเป็นโมเลกุลของน้ำครับ
 

แต่ตอนนี้ขอยกสิ่งจำเป็นต้องใช้สำหรับเรื่องนี้ก่อนครับ (จำเป็นสำหรับวิเคราะห์ dynamic ของอนุภาค)

1. Image sequence (วีดิโอ หรือ ภาพ การเคลื่อนที่ของอนุภาคที่เราสนใจ)
                      ผมขอ link ไปที่นี่เลยครับ เป็นตัวอย่าง video จาก free software ครับ
            2. Particle tracking software (Single or multiple tracking)
                     ผมใช้  Single particle tracking เป็น Plug in ของ ImageJ ซึ่งเป็น free software ครับ
            3. Mean square displacement calculation
                     เขียน source code ใน MATLAB ครับ

งานวิจัยที่น่าสนใจเกี่ยวกับ Random walk in biological system
- http://www.agnld.uni-potsdam.de/~metz/
Acknowledgements
 
References
 - David A Drubin1, Arman M. Garakani and Pamela A, Silver, "Motion as a phenotype: the use of live-cell imaging and machine visual screening to characterize transcription-dependent chromosome dynamics", BMC Cell Biology, April 2006. 1Harvard Medical School and Department of Cancer Biology, Boston, MA, USA. >>> link.
- Frank Neumann, "A study of chromatin mobility by live fluorescence microscopy in Saccharomyces cerevisiae", University of Geneva, Ph.D Thesis. 2004.
- Jakob C. Schweizer, January 26, 2007. Practical Course: Single-Particle-Tracking. >>> link.

Wednesday, May 16, 2012

Update data in edit text

ผมออกแบบโปรแกรมซึ่งต้องมีช่องให้ผู้ใช้กรอกข้อมูลตัวเลขบางอย่าง แล้วผมก็เขียน handles มารับค่าเก็บไว้ ซึ่งพบว่ามีปัญหากับการ update ข้อมูลตัวนั้น ดังนั้นวิธีการง่ายๆ ที่จะทำให้ข้อมูล update ทุกครั้งที่ผู้ใช้เปลี่ยนแปลง ก็คือไม่ต้องเก็บใน handles แต่มาใช้คำสั่ง get() รับค่าแล้วใช้ใน callback นั้นๆเลย ก็พอจะแก้ปัญหาเบื้องต้นได้เช่นกัน แต่อย่างไรก็ตามสำหรับการทำงานที่ซับซ้อมผมเองก็ยังแก้ไขอยู่ หากสำเร็จเสร็จแล้ว จะนำมาบอกเล่าเพิ่มเติม

ดังนั้นครั้งนี้ผมเสนอตัวอย่างเพื่อแสดงการแก้ปัญหา ดังที่เขียนถึงด้านบน ด้วยการทำเครื่องคิดเลขอย่างง่ายๆ (และอย่าง... ด้วย) แต่ก็จะเห็นตัวอย่างการใช้งาน คำสั่งต่างๆได้ง่ายครับ ขอให้สังเกตไปที่ callback ของ edittext และ ปุ่ม calculate (ดูในไฟล์ตัวอย่าง)

นี่เป็นตัวอย่าง source code ครับ สังเกตบรรทัดสีเหลืองครับ ใช้ get ไปรับค่าจาก edittext (ในที่นี้ผมตั้งชื่อเป็น firstNo กับ secondNo) จากค่อยเปลี่ยนจากตัวแปร แบบอักษรมาเป็นตัวเลข เพื่อนำไปคำนวนตามหน้าที่ของ callback นั้นๆ

% --- Executes on button press in pushPlus.
function pushPlus_Callback(hObject, eventdata, handles)
% hObject    handle to pushPlus (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
No1 = str2double(get(handles.firstNo,'String'));
No2 = str2double(get(handles.secondNo,'String'));
results=No1+No2;

set(handles.result,'String',results);

guidata(hObject, handles);

ส่วนไฟล์ที่ผมลองทำโหลดได้จากนี่เลยครับ testCal.fig, testCal.m
 

Thursday, April 26, 2012

Recall the last input parameters after exiting the program and set default input parameters

ผมพัฒนาโปรแกรมอยู่ตัวหนึ่งครับ การใช้งานผู้ใช้ต้องใส่ input parameter หลายค่าในหลายๆที่ด้วย ซึ่งอาจทำให้ผู้ใช้งานเหนื่อยใจกับเรื่องนี้ เช่น ถ้ารันโปรแกรมกับตัวอย่าง input parameter เหมือนเดิมแต่ต้องกลับมานั่งใส่ทีละตัวทุกครั้ง ผมเลยต้องพยายามหาแนวทางเพื่อแก้ปัญหานี้ อันนี้ถามจากผู้รู้จากเว็บไซต์นี้ครับ shadowwares (ขอชมว่าเป็นมืออาชีพครับสำหรับไซต์นี้)

ดังนั้นในครั้งนี้ผมนำเสนอ การเรียกข้อมูล input เก่า (ครั้งล่าสุดหลังจากปิดโปรแกรม) พร้อมด้วยการกำหนดค่า เริ่มต้นไว้ด้วย (default) โดยได้รับคำแนะนำจากไซต์ที่กล่าวข้างต้น ผมใช้คำสั่ง save และ load ครับ แต่ปัญหาการใช้ คำสั่ง load ก็คือเราต้องมีไฟล์โปรแกรมโหลดก่อนครับ ดังนั้นในที่นี้ผมจะจัดเตรียมไว้ด้วยครับ (ผมทำง่ายๆ คือ ตอนแรกอย่าพึ่งใช้คำสั่ง load สั่งให้ save ก่อน เราก็จะได้ไฟล์เพื่อโหลดละครับ)

ผมจึงจำลองการเขียนกราฟของสองฟังก์ชันขึ้นมา ได้แก่ sine and sinc functions (y=sin(x) and y=sin(x)/x) ผู้ใช้งานสามารถกำหนดค่า x จากการใส่ค่าเริ่มต้น ค่าสุดท้าย และ step size ของการเพิ่มค่า x นอกจากนี้ยังมีโหมดให้เลือกใช้ค่า default ที่โปรแกรมกำหนดมาให้ใช้ได้อีกด้วยในที่นี้กำหนดให้ x เริ่มตั้งแต่ -50 ถึง 50 โดยเพิ่มค่าทีละ 0.1 หรือ x=[-50 : 0.1 : 50]

การแก้ไข source code นั้นผมขอยกมาเฉพาะส่วนครับ รายละเอียดไปดูใน DefaultParameter.m เอา ผมสร้าง GUI ขึ้นมาและให้ชื่อว่า DefaultParameter.fig และไฟล์ที่เตรียมไว้ชื่อ parameters.mat

ปกติผมไม่ค่อยได้แก้ไขส่วนนี้ครับ แต่ถ้าเราจะจัดการให้โปรแกรมรู้จักค่าต่างๆ ตั้งแต่เปิดใช้งานต้องนำมาใส่ไว้ในส่วนนี้ครับ อธิบายประมาณนี้เลยครับ
- ก่อนอื่นโหลดไฟล์ที่เก็บ parameters ต่างๆมาก่อน (คำสั่ง load)
- กำหนดให้ edit text handles รับค่าที่โหลดมาไปใช้ (คำสั่ง set)
- รับค่าจาก  edit text handles มาไว้ใน handles ที่เราตั้งไว้ (คำสั่ง get)

% --- Executes just before DefaultParameter is made visible.
function DefaultParameter_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to DefaultParameter (see VARARGIN)
% Choose default command line output for DefaultParameter
handles.output = hObject;
%Load the last variable from file.mat
load parameters.mat;
%-------------------------------------------
set(handles.editInitial,'String',InitialValue);
set(handles.editFinal,'String',FinalValue);
set(handles.editStep,'String',StepSizeValue);
%-------------------------------------------
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;

%---set initial value for if condition in PlotOperate_Callback
handles.SincPlotCheck=0; % กำหนดค่าให้ก่อน ใช้กับปุ่มกด plot graph
handles.SinePlotCheck=0;
% Update handles structure
guidata(hObject, handles);

ส่วนนี้จะทำงานเมื่อกดปุ่ม default parameters โปรแกรมจะเรียกค่า defaults ที่กำหนดไว้มาให้ตัวแปร
นั่นคือในที่นี้ default ก็คือ x = [-50 : 0.1 : 50]

% --- Executes on button press in pushDefault.
function pushDefault_Callback(hObject, eventdata, handles)
% hObject    handle to pushDefault (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%set default parameters, when the default buttom was pressed
set(handles.editInitial,'String','-50');
set(handles.editFinal,'String','50');
set(handles.editStep,'String','0.1');
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;
guidata(hObject, handles);

ในส่วนนี้จะทำงาน โดยแสดงกราฟบน axes1 ได้แก่
การเขียนกราฟของ sine function และ sinc function (sinX/X)

% --- Executes on button press in PlotOperate.
function PlotOperate_Callback(hObject, eventdata, handles)
% hObject    handle to PlotOperate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.axes1;
Initial  = str2double(handles.InitialValue); %#ok<*ST2NM>
Final    = str2double(handles.FinalValue);
Stepsize = str2double(handles.StepSizeValue);
x        = [Initial : Stepsize : Final];
y=sin(x);
yy=sinc(x);%sin(x)./x;

if handles.SinePlotCheck==1
    plot(x,y);
elseif handles.SincPlotCheck==1
    plot(x,yy);
else
    plot(x,y,'g');hold on;
    plot(x,yy,'r');hold off;
end

guidata(hObject, handles);

%save structure handles in file.mat
save parameters.mat -struct handles; % คำสั่งบันทึกพารามิเตอร์ต่างๆก่อนปิดโปรแกรม