วันพฤหัสบดีที่ 22 พฤษภาคม พ.ศ. 2557

PHP แสดงข้อมูลจาก วันเกิด (วัน เดือน ปี) เป็นอายุ กี่ปี กี่เดือน กี่วัน

เป็น script php การแปลงวันเกิด ให้แสดงผลในรูแบบ อายุกี่ปี กี่เดือน กี่วัน จากการทดสอบก็ค่อนข้างจะใช้ได้ครับ ไม่มีคำสั่งที่ซับซ้อนที่ยุกยาก นอกจากบวก ลบ เลขธรรมดา  จึงเป็น สคริป (script) การแปลงวันที่ ที่เป็นวันเกิด เป็นวันเดือนปี อย่างง่าย ที่สามารถนำไปทดลอง ใช้งานได้ครับ

ตัวอย่างการใช้คำสั่ง
echo show_year_month_day_for_age('2003-05-01');

ผลลัพธ์

11 ปี 0 เดือน 21 วัน

จากวันที่ด้านบนจะนับเป็น 21 วันเพราะวันที่ 22 ยังไม่ผ่านตามคำสั่งนี้เลยยังไม่นับวันที่ 22 ด้วย ทำให้ผลลัพธ์ที่ได้เป็น 21 วัน

ตัวอย่างคำสั่ง

function show_year_month_day_for_age($pbday)
{
$dinm = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$today = date("Y-m-d");
list($byear , $bmonth , $bday) = explode("-" , $pbday);
list($tyear , $tmonth , $tday) = explode("-" , $today);
$result_y = $today-$byear;
$result_m = $tmonth-$bmonth;
if($result_m น้อยกว่า 0) {
$result_y = $result_y-1;
$result_m = 12-abs($result_m);
}
$result_d = $tday-$bday;
if($result_d น้อยกว่า 0) {
if($result_m!=0) {
$result_m = $result_m-1;
} else {
$result_y = $result_y-1;
$result_m = 12-1;
}
$d = $dinm[$tmonth-1];
if($tmonth==2 && ($tyear%4)==0) { //ปีที่มี ก.พ. 29 วัน
$d = $d+1;
}
$result_d = $d-abs($result_d);
}
$age = $result_y." ปี ".$result_m." เดือน ".$result_d." วัน";
 
return($age);
}

จากตัวอย่างคำสั่งด้านบนอาจจะมีผิดพลาดได้ครับแต่เท่าที่ลองทดสอบยังไม่เจอข้อผิดพลาด หากนำไปใช้อาจจะปรับให้มีความสมบุรณ์มากขึ้นไปอีกครับ


ปล.

คำว่า  น้อยกว่า  คือเครืองหมาย น้อยกว่า ใส่ไม่ได้ระบบบอกว่าเป็น รหัส html ไม่ผ่าน เลยต้องเพิ่มเป็นข้อความเอาครับ

วันอังคารที่ 15 เมษายน พ.ศ. 2557

Selections with ImageJ

การเลือกจะหมายถึงการเลือกพื้นที่ที่สนใจ (ROI) ปกติจะเลือกโดยใช้เครื่องมือจากโปรแกรม เพราะว่า ImageJ สามารถแสดงผลจำลองการเลือก ROIs (อาจจะดูเพิ่มเติมไดในหัวข้อ Overlays และ ROI Manager) การเลือกจะมีผลการทำงานเพียงครั้งเดียว (ต่อการเลือกแต่ละครั้ง) การเลือกอาจจะมาจาก การวัดขนาด (Analyze->Measure) การวาด (Edit->Draw) การเติม (Edit->Fill) หรือ Filtered (Process->Filters->submenu) ขึ้นอยู่กับพื้นที่การเลือกที่สนใจ การเลือกพื้นที่นั้นสามารถเลือกได้หลายพื้นที่พร้อมๆ กัน

การเลือกจะกำหนดพื้นที่การเลือกจากสีทั้งหมด 9 สี (Red , Green, Blue, Magenta, Cyan, Yellow, Orange, Black and White) หลังจากการเลือกแล้วสามารถเติมสีพื้นที่เป็นสีใด ๆ ก็ได้ โดยใช้เมนู Edit->Selection->Properties สีเส้นพื้นที่สามารถเปลี่ยนแปลงได้จากเมนู Edit->Options->Color ด้วยการดับเบิลคลิกที่ เครื่องมือจุด หรือ ใช้คีย์บอร์ดในการสั่งงานก็ได้ โดยจะมีจุดแสดงขึ้นมาให้สังเกตได้

จาก 3 ตัวอย่างที่ได้จากการใช้เครื่องมือในการเลือกพื้นที่ใน ImageJ


การใช้งาน ROIs
มีคำสั่งจำนวนมากที่สามารถกำหนดการวาดเส้นสำหรับการเลือกได้ ดูเพิ่มเติมได้จาก Edit->Selection->submenu และ สามารถสรุปคร่าว  ๆ ได้ดังนี้

Adjusting การเปลี่ยนแปลงพื้นที่การเลือกโดยใช้ Brush Selection Tool
Deleting ด้วยการคลิกเมาส์ออกนอกพื้นที่การเลือกหรือเลือกที่เมนู Edit->Selectio->Select None และสามารถใช้เมนู Edit->Selection->Restore Selection หากเปลี่ยนใจอยากจะเลือกเหมือนเดิม
Managing สำหรับการย้ายหน้าต่างการทำงานไปอีกหน้าต่างอื่น โดยใช้ Edit->Selection->Restore Selection แล้วเลือก Analyze->Tools->Synchronize สำหรับสร้างเขตการเลือกมากกว่า 1 ภาพ
Moving เพียงแค่คลิกแล้วลากก็สามารถย้ายได้แล้ว
Nudging การเลือกคลิกเลือกที่จุดและทำงานร่วมกับปุ่มลูกศร
Resizeing ใช้เครื่องมือ Brush Selection ในการปรับขนาดของ ROI ขณะที่ลากสามารถทำงานร่วมกับปุ่ม Alt ได้



picture : ImageJ user guide

วันพุธที่ 12 มีนาคม พ.ศ. 2557

Color Images with ImagJ

ImageJ มีสีที่ใช้หลัก 3 แบบ คือ 

1. pseudocolor images
2. RGB images 
3. Composite images

1. Pseudocolor Images
หรือ indexed color เป็นภาพ 1 channel ภาพระดับเทา (8, 16, 32 bit) เก็บค่าสีด้วย lookup table หรือ LUT เป็นตารางที่จะจับคู่ภาพระดับเทาเปรียบเทียบกับภาพสีที่มี RGB (red, green, blue) ในลักษณะของเฉดสีเทา (colorized pixels)  ดังนั้นสีที่ปรากฎในสีแบบ Pseudocolor Image จะแสดงด้วยค่าความสว่างของภาพมากกว่าจะเป็นค่าสีของภาพ

ภาพ 8 บิต เช่น ภาพ GIFs เป็นตัวอย่างภาพแบบ Pseudocolor Image โดยใช้ LUT ในการเก็บค่าสีของภาพ ภาพจะมีค่าสีจำนวน 256 สี (24 bit จะมี 16.7 ล้านสี) ซึ่งจะทำให้ขนาดไฟล์เล็ก การลดขนาดสีที่เป็นจริงลงเหลือ 256 สีสามารถจัดการด้วยอัลกอริทึมของ quantization ใน ImageJ ใช้ทฤษฏีของ Heckbert's median-cut color quantization algorithm (ดูเพิ่มเติม Image->Type->menu) 

2. สีจริงแบบ RGB
ซึ่งเป็นสีที่มีความฉลาด เช่น green ใน RGB นั้นจะมีผลต่อสีเขียวในกลุ่มสีตัวอย่าง ภาพ RGB จะได้จากกล้องแบบ CCD 

โครงสร้างสี
โครงสร้างสีอธิบายด้ยเส้นสีจากอุปกรณ์ เพราะมนุษย์มองทุกอ่างเป็นสีซึงแสดงจากสีหลัก 3 สี และมีหลายโมเดลที่อยู่ในกลุ่มนี้คือ RGB, HSB, CIE Lab หรือ YUV
RGB เป็นสีที่ใช้โดยทั่ไปเนื่องจากพวก HSB มีการวิเคราะห์ค่าละเอียดเหมาะกับการประมวลผลภาพมากกว่า ใน HSB ค่า H = ค่าสี, S= ค่าความเข้มสี และ V=
ค่าความสว่าง

3. Color Composite Images
เป็นค่าสีที่สามารถจัดาร channel ของสีได้ และได้ใช้โครงสร้างสีพื้นฐานมาจาก RGB โดยโมเดลสีนี้มีคุณสมบัติดังนี้
1. แต่ละ channel จะอยู่แยกกันและสามารถเลือกใช้งาน หรือ ไม่ใช้งานก็ได้ ได้จากเมนู Image->Color->Channels Tools...
2. แต่ละ Channel เลือกได้เป็น 8 16 หรือ 32 บิต ก็ได้โดยแสดงผลด้วย lookup table
3. มากกว่า 3 channel สามารถรวม (merged) หรือยกช่อง channel ก็ได้

วันพฤหัสบดีที่ 20 กุมภาพันธ์ พ.ศ. 2557

Stacks, Virtual Stacks and Hyperstacks

ImageJ สามารถแสดงภาพหลายภาพในหน้าต่างเดียวกันได้ ด้วยการรวมกลุ่มภาพซ้อน ๆ กัน เอาไว้ โดยกลุ่มภาพที่ได้รวมกันนี้จะเรียกว่า Stack ภาพที่นำมาสร้าง Stack นั้นจะเรียกว่า Slice หลาย ๆ Slice รวมกันก็จะเป็น Stack นั้นเอง กลุ่ม Pixel ที่รวมกันในแบบ Stack นั้นจะเรียกว่า voxel (volumetric pixel) โดยจะรวมค่า ความสว่าง และค่าอื่น ๆ เอาไว้ด้วย

ทุก Slice ที่จะนำมาสร้าง Stack นั้นจะต้องมีขนาดที่เท่ากัน ค่า bit depth ที่เท่ากันด้วย ส่วนของ Scrollbar ที่อยู่ด้านล่างของหน้าต่าง Stack นั้นสามารถใช้เลื่อนแสดงภาพแทนปุ่ม Start ได้ หากต้องการตั้งค่าการเล่นภาพแบบเคลื่อนไหว สามารถคลิกขวาที่ปุ่ม Play หรือ Pause ได้

การกำหนดตัวกรองภาพก่อนการเปิดภาพขึ้นมาแบบ Stack มีหลายรูปแบบด้วยกัน และหากต้องการเปิดภาพแบบที่มีคุณภาพของภาพแบบไม่บีบอัดสามารถเปิดภาพได้จากเมนู File->Import->Raw  แต่หากมี Folder รูปภาพและต้องการเปิดภาพจาก Folder นั้นก็สามารถทได้ด้วยการเลือกภาพแบบเรียงลำดับตามจำนวนภาพใน Folder หรือ กำหนดเองได้ โดยใช้เมนู File->Import->Raw ก็ได้ นอกจากการนำเข้าภาพมาเป็น Stack แล้วยังสามรถเพิ่มและลดภาพได้ในภายหลังจากที่ได้เพิ่มเข้ามาในตอนแรกได้ด้วย

นี้นับว่าเป็นส่วนหนึ่งของการกำหนดให้โปรแกรมสามารถแสดงผล เพื่อให้เราสามารถวิวดูตัวอย่างภาพก่อนจะประมวลผลในขั้นตอนอื่น ๆ ต่อไปอีกได้

ขั้นตอนการเพิ่มไฟล์ เพื่อนำมาสร้างเป็น Stack สำหรับการประมวลผลภาพหมู่

หน้าต่างนี้สำหรับกำหนดจำนวนภาพใน folder  เพื่อกำหนดจำนวนภาพใน folder เพื่อเข้ามาสร้างเป็นภาพหมู่ โดยมีตัวเลือกให้ลองเลือกใช้งานอีกหลายตัวเลือก

เมือกดปุ่ม OK จากภาพด้านบน โปรแกรมก็จะสร้าง Stack ให้แต่ออาจจะมองเห็นแค่ภาพเดียว สามารถกดปุ่ม Play หรือ Scrollbar สำหรับเลื่อนดูภาพต่อไปได้

นี้เป็นตัวอย่างการจัดเรียงภาพแบบให้ทุก Slice แสดงผลอยู่ในหน้าต่างเดียวกัน

ตัวอย่างการแสดงภาพแบบ Montage....
ยังสามารถแสดงกราฟดูค่า mean ค่า Max ค่า Min ได้ด้วย มีทั้งกราฟและตัวเลข



ตัวอย่างนี้เป้นตัวอย่างการรวมทุกภาพใน Stack มาเป็นภาพเดียวกัน ด้วยความสามารถก็จะได้ที่รวมทุกภาพเข้าไว้ด้วยกันออกมาตามตัวอย่างนี้เลยครับ


Virtual Stacks

เป็นส่วนที่อยู่บนดิส ทำหน้าที่ตรงข้ามกับการทำงานของ Ram และ Virtual Stack เป็นเพียงทางเดียวที่จะโหลดภาพ แบบเป็นลำดับที่ไม่สามารถจัดเก็บลง Ram ได้ การใช้งาน Virtual Stack นั้นมีข้อกำหนดที่ควรจดจำเมื่อจำเป็นต้องใช้งาน ดังนี้

- Virtual Stack สามารถอ่านได้เพียงอย่างเดียว เพราะฉะนั้นการเปลี่ยนแปลงส่วนใดของ Slice จะไม่สามารถจัดเก็บได้ เมื่อเปลี่ยน Slice ในการทำงาน แต่สามารถใช้ Macro ช่วนในการทำงานได้ โดยไปที่เมนู Process->Batch->Virtual Stack...

- หากใช้คำสั่ง Image->Crop โปรแกรมอาจจะเกิด Out of Memory ได้ เพราะ Stack จะถูกสร้างขึ้นเรื่อย ๆ แต่ Virtual ไม่ได้ถุกสร้างตาม มีเพียงเท่าเดิม

Stack เมื่อต้องทำงานร่วมกับ Hyperstacks สามารถเรียกใช้ผ่านเมนู File->Open Sample->Mitosis ... จำนวนมิติของ Hyperstacks สามารถลดลงได้ด้วยคำสั่ง Image->Hyperstacks->Reduce Dimensionality หรือ Image . Stacks . Z Project. . . หรือ Image .Hyperstacks . Channels Tool...  ตัวอักษร (V) ที่อยู่ในหน้าต่าง จะหมายถึง Virtual image (Virtual Stack)

- ไฟล์รูปแบบ TIFF จะสามารถทำงานได้เร็วกว่า ไฟล์รูปแบบ JPEG แต่ก็สามารถแปลงจาก JPEG เป็น TIFF ได้ด้วยการ File->Save as ->Image Sequence ...


Hyperstacks

เป้นการเก็บข้อมูลภาพในหลายมิติ เป็นส่วนเพิ่มเติมจากการทำงานแบบ Stack จะมีจำนวนมิติเป็น 4D หรืแ 5D เช่น ความกว้าง (x) ความยาว (y) จำนวนแบรน (c) และค่า time frame (f) หน้าต่างของ Hyperstack จะเป็นหน้าต่างคล้ายกับ Virtual Stack เข่น Scrollbar ส่วนค่า f นั้นจะเป็นปุ่มที่อยู่กับการเล่นและหยุดของ Hyperstacks


ส่วนของการทำงานของ Hyperstacks

วันอาทิตย์ที่ 26 มกราคม พ.ศ. 2557

ความแตกต่างระหว่าง Definition, Theorem, Lemma, Corollary, Proposition, Conjecture, Claim, Axiom/Postulate, Identity, Paradox

หลากหลายคำนิยามทางคณิตศาสตร์บางครั้งก็เกิดความสงสัยระหว่างคำพวกนี้ ว่าใช้แตกต่างกันอย่างไร และแต่ละคำมีระดับความสำคัญอย่างไร และลองหาคำตอบ ได้คำตอบมาถูกผิดอย่างไรก็ ขอ อภัยด้วยครับ

Definition - เป็นการอธิบายความจริง หรือ เท็จของ ของคำนิยามทางคณิตศาสตร์ โดยจะอธิบายคุณสมบัติทั้งหมดของคำนั้นที่เป็นจริง

Theorem - เป็นประโยคทางคณิตสาสตร์ที่อธิบายด้วยการให้เหตุผลที่เข้มงวด ในบทความทางคณิตศาสตร์ Theorem จะสงวนเอาไว้อธิบายคำตอบที่มีความสำคัญ

Lemma - เป็นคำตอบที่มีความสำคัญรองลงมาเพื่อใช้ในการช่วยพิสูจน์ Theorem บางครั้งอาจจะใช้ Lemma ในการพิสูจน์หรืออธิบาย Lemma ได้เหมือนกัน

Corollary - เป็นผลลัพธ์ที่พิสูจน์อย่างเข้มงวดโดยใช้ Theorem

Proposition - เป็นการพิสุจน์ที่ได้คำตอบน่าสนใจ แต่ทั่วไปแล้วจะให้ความสำคัญน้อยกว่า Theorem

Conjecture - เป็นประโยคสมการที่ไม่สามารถพิสูจน์ได้ แต่เชื่อว่าเป็นจริง

Claim - การได้คำตอบหลังจากมีการพิสูจน์แล้วบางคร้งใช้เหมือน Lemma ที่ไม่ค่อยเป็นทางการ

Axiom/Postulate - เป็นการอ้างสมมติฐานที่เชื่อว่าเป็นจริง โดยไม่มีการพิสูจน์ เป็นการสร้างฐานความจริงที่พิสูจน์ได้จาก Theorem

Identity - เป็นคณิตศาสตร์ที่อธิบายความเท่ากันของตัวแปร

Paradox - สามารถใช้แสดงความจริง หรือ เท็จทั้งคู่ของ Axiom และ Definition และสามารถใช้อธิบายความขัดแข้งของช่องโหว่ Theorem ได้



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



ขอบคุณ
http://divisbyzero.files.wordpress.com/2008/09/thcorlem.pdf