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