ค้นหาข้อมูลในบล็อก (Search in this blog)

Wednesday, August 28, 2013

การหาค่าสถิติเบื้องต้นของข้อมูลภาพด้วย Matlab



วันนี้จะขออนุญาตนำเสนอวิธีการเรียกใช้งานฟังก์ชันพื้นฐานที่อาจจะเป็นเรื่องง่ายมากๆสำหรับท่านที่เคยใช้งาน Matlab เป้นประจำแต่สำหรับผมนานๆใช้ทีเลยต้องบันทึกไว้กันลืมสักหน่อย (-_-)" ตัวอย่างการคำนวนหาค่าสถิติเบื้องต้นที่จะทดลองใช้งานในครั้งนี้ได้แก่ค่า Maximum, Minimum, Mean/Average และ Standard Deviation เป็นต้นครับ
การประมวลผลข้อมูลภาพนั้นเจ้า Matlab จะมองข้อมูลภาพและค่าของจุดภาพในรูปของเมทิรกซ์ (Matrix) โดยขนาดของเมทริกซ์จะเท่ากับขนาดของข้อมูลภาพ เช่น ข้อมูลภาพหนึ่งมีขนาด 100 x 100 จุดภาพ จำนวน 4 ช่วงคลื่น (band) นั้นเมื่อนำข้อมูลภาพเหล่านี้เข้าสู่โปรแกรม Matlab แล้ว โปรแกรมจะทำการแปลงข้อมูลให้อยู่ในรูปของเมทริกซ์ที่มีขนาดและมิติเท่ากับข้อมูลต้นฉบับ โดยค่าของจุดภาพ  (Pixel values/Brightness values - BV/Digital Number - DN) จะถือว่าเป็นสมาชิกของเมทริกซ์ที่มีตำแหน่ง (ลำดับ) เหมือนข้อมมูลภาพครับ
 
ตัวอย่างการนำเข้าข้อมูลภาพเพื่อการวิเคราะห์และประมวลผลภาพด้วย Matlab นั้นสามารถทำได้โดยใช้ฟังก์ชัน imread ดังตัวอย่างดังนี้

การแปลงข้อมูลภาพให้เป็นเมทริกซ์
##############################
>>imred('C:\images\theos.tif')                   % หรือ
>>imred('C:\images\theos.tif');                  % หรือ
>>theos = ('C:\images\theos.tif');


การหาขนาดของข้อมูลภาพหรือเมทริกซ์ สามารถทำได้โดยใช้คำสั่ง size ดังตัวอย่าง
##############################
>>size(theos)
ans =

        1500        1500           4                 
%
ขนาดของเมทริกซ์คือ row, column, band ตามลำดับครับ

 ส่วนการเปลี่ยนข้อมูลภาพให้เป็นเมทริกซ์แบบแยกช่วงคลื่นสามารถทำได้ดังนี้
##############################
band1 = theos(:,:,1);
band2 = theos(:,:,2);
band3 = theos(:,:,3);
band4 = theos(:,:,4);                                
%
ตรงนี้ต้องระวังการเรียงลำดัของช่วงคลื่นนะครับ

ใน Matlab นั้นมีฟังก์ชันการคำนวณสถิติพื้นฐานไว้ให้อยู่แล้วนะครับ เราสามารถเรียกใช้งานได้ดังตัวอย่างครับ
ค่า Maximum ค่า Minimum
##############################
>>max(max(band1))
>>max(band1(:))                                  
%
การใช้ band1(:) นั้นจะใช้เมื่อต้องการหาค่าของเมทริกซ์ทั้งทาง row และ column ครับ
>>min(band1(:));

ค่า Mean/Average
##############################
>>mean2(band1)                                      
%
ฟังก์ชัน mean2 สามารถใช้ได้กับเมทริกซ์ 2 มิติครับ

ค่า Standard Deviation
##############################
>>std2(band1)                                          
%
ฟังก์ชัน std2 สามารถใช้ได้กับเมทริกซ์ 2 มิติครับ


ครั้งหน้าถ้าว่างๆจะขอแนะนำวิธีการประมวลผลภาพเบื้องต้นครับ

Wednesday, July 17, 2013

สัมประสิทธิ์แคปปา (Kappa coefficient)

วันนี้คุณน้องสาวสุดที่เลิฟ  ได้ส่งข้อความมาถามว่าเคยใช้ Kappa coefficient  สำหรับการิเคราะห์ข้อมูลไหมและต่างจาก Pearson correlation coefficient อย่างไร ผมเห็นว่าเป็นคำถามที่น่าสนใจและน่าจะเป็นประโยชน์สำหรับเพื่อนๆบางท่าน เลยอยากจะขออนุญาตแบ่งปันประสบการณ์ดังนี้ครับ

Kappa coefficient หรือชื่อทางการคือ Cohen's kappa coefficient นั้นเป็นค่าสถิติที่ใช้ทดสอบความสอดคล้อง (Consistency) กันของข้อมูล 2 กลุ่ม ในบางกรณีอาจใช้สำหรับเปรียบเทียบการประเมินค่าของข้อมูลชุดเดียวกันจากผู้ประเมิน 2 คน โดย Kappa coefficient นั้นไม่จำเป็นต้องอาศัยสมมุติฐานที่ว่าข้อมูลที่สนใจนั้นมีการแจกแจงแบบปกติ (Normal distribution) หรือที่เรียกว่า Non-parametric statistic
ผลลัพธ์ที่ได้จาก Kappa coefficient นั้นจะอธิบายถึงความสอดคล้องระหว่างกันของ 2 ชุดข้อมูลนั่นเอง ฟังดูอาจ งง งง ผมขอยกตัวอย่างในงานการรับรู้จากระยะไกล (Remote Sensing) นั้นมักจะใช้การหาค่า Kappa coefficient  ประกอบการประเมินความถูกต้องของการจำแนกข้อมูล (Classification) กล่าวคือ เมื่อเราได้ค่าความถูกต้องของการจำแนกขข้อมูล (เช่น Overall accuracy) เมื่อเทียบกับข้อมูลอ้างอิงแล้ว เราต้องการแสดงระดับของความสอดคล้อง (Agreement) ระหว่างข้อมูลอ้างอิงและผลการจำแนกข้อมูลที่ได้จากการทดลองด้วยวิธีการจำแนกแบบต่างๆ เราก็จะใช้เจ้าค่า Kappa coefficient นี่เองเป็นตัวบ่งชี้ (คล้ายกับระดับความเชื่อมั่น เน้น นะครับ แค่ "คล้าย")

ส่วน Pearson correlation coefficient นั้นจะต้องอาศัยสมมุติฐานที่ว่าข้อมูล 2 ชุดข้อมูลที่นำมาเปรียบเทียบกันนั้นมีความสัมพันธ์เชิงเส้นระหว่างกัน (Linear correlation) ซึ่งก็หมายถึง ต้องมีการขึ้นต่อกัน (Dependency) ระหว่างชุดข้อมูล โดยค่าที่ได้จากการคำนวณ Pearson correlation coefficient จะบ่งบอกความสัมพันธ์ระหว่างของชุดข้อมูลว่ามีทิศทางอย่างไร (ระหว่าง -1 ถึง +1)

ประเด็นที่น่าสนใจคือ แล้วเราจะใช้เจ้า Kappa coefficient และ Pearson correlation coefficient ตอนไหน ตรงนี้จากประสบการณ์ผมคิดว่า เราต้องดูสมมุติฐานงานวิจัยของเรา ว่า เราสนใจในประเด็นใด เช่น พฤติกรรมหรือแนวโน้มของข้อมูล (Pearson correlation coefficient ) หรือดูความสอดคล้องระหว่างกันของข้อมูล ((Kappa coefficient)

Monday, July 8, 2013

การตัดข้อมูลภาพด้วย gdalwarp

วันนี้ขอเสนอวิธีการตัดข้อมูลภาพด้วย gdalwarp ตัวอย่างของปัญหาคือ ผมมีข้อมูลภาพดาวเทียมหลายภาพ (อาจมาจากหลากหลายช่วงเวลาหรือหลายแหล่งข้อมูล) ความต้องการของผมคือ ผมต้องการใช้แค่บางส่วนของภาพเหล่านั้น เช่น พื้นที่ศึกษาของผมนั้นเป็นส่วนหนึ่งของภาพดาวเทียม หากนำเอาข้อมูลทั้งภาพไปประมวลผลจะทำให้เกินความจำเป็นและเสียเวลาในการประมวลผลข้อมูลเพิ่มมากขึ้น โดยทั่วไปแล้วเราสามารถแก้ปัญหานี้ได้โดยการตัดภาพออกเป็นส่วนย่อยๆ หรือ เลือกเอาเฉพาะพื้นที่ที่ต้องการโดยใช้เครื่องมือของโปรแกรม OpenEV ที่ Export --> Advance Options --> Interactive Options ที่สามารถเลือกได้หลายแบบทั้ง Windows Input หรือ Draw ROI แต่วิธีการดังกล่าวมีข้อจำกัดคือ สามารถทำได้ครั้งละหนึ่งไฟล์เท่านั้น ดังนั้นผมจึงขอเสนอวิธีที่จะช่วยลดเวลาจากการเรียกเปิดข้อมูลทีละภาพเพื่อทำการตัดข้อมูลเฉพาะพื้นที่ที่ต้องการโดยกาารใช้คำสั่ง FOR บน DOS และเจ้า gdalwarp ดังนี้

>>FOR %i IN (*.tif) DO gdalwarp -te xmin ymin xmax ymax input_files output_files

ตัวอย่างการใช้งานจริงดังนี้ครับ

C:\THEOS_PANSHARP>FOR %i IN (*.tif) DO gdalwarp -te 832600
1656400 835600 1659400 %i urban_%i

*** โดย "urban_" คือ prefix ที่ผมใส่ไว้ในหน้าไฟล์ผลลัพธ์เพื่อให้แยกความแตกต่างระหว่างไฟล์ต้นฉบับและไฟล์ภาพที่ตัดแล้ว เช่น ไฟล์ต้นฉบับ ผมมีหลายไฟล์ได้แก่ bt.tif, mt.tif, pca.tif, ihs.tif, mihs.tif, gs.tif, ehlers.tif, hpf.tif และ wvlet.tif ส่วนไฟล์ที่ตัดเอาเฉพาะพื้นที่ศึกษาหรือพื้นที่ที่ต้องการจะได้เป็นไฟล์ใหม่คือ
urban_bt.tif
urban_mt.tif
urban_pca.tif
urban_ihs.tif
urban_mihs.tif
urban_gs.tif
urban_ehlers.tif
urban_hpf.tif และ urban_wvlet.tif  ตามลำดับครับ

Tuesday, June 4, 2013

Font encoding เจ้าปัญหา!!!

วันนี้ขอแนะนำวิธีอ่าน Font ยึกยือของไฟล์ข้อมูล หัวข้อนี้ได้บทเรียนจากปัญหาของเครื่องแม่ข่ายที่เมื่อมีผู้อัพโหลดไฟล์ภาพแล้ว ระบบได้จัดการสร้างชื่อไฟล์อัตโนมัติ แต่ชื่อไฟล์ที่สร้างขึ้นนั้นไม่สามารถอ่านออกได้ (มีปัญหาเฉพาะภาษาไทย) ดังภาพตัวอย่างที่ 1


ภาพที่ 1 ไฟล์ข้อมูลที่มีปัญหาเกี่ยวกับการเข้ารหัส (Encoding)

วิธีการแก้ไขเพื่อให้อ่านชื่อไฟล์ได้สามารถทำได้หลายแนวทาง วันนี้จะขอแนะนำแนวทางหนึ่งที่คิดออกดังนี้ครับ
1. อ่านชื่อไฟล์ด้วย DOS command prompt  (dir) แล้วทำการเก็บรายชื่อไฟล์ที่อ่านได้เป็นไฟล์อักขระ (Text file) ด้วยคำสั่งดังตัวอย่าง
#dir >filename.txt
2. เมื่อเปิดไฟล์ filename.txt ด้วย text editor เช่น notepad แล้วจะพบว่าชื่อไฟล์สามารถแสดงผลเป็นภาษาไทยได้อย่างถูกต้อง
3. เขียนชุดคำสั่งเพื่อเปลี่ยนชื่อไฟล์ (rename) ด้วย  DOS command prompt


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

Sunday, May 12, 2013

วิธีการสร้าง Tile ข้อมูลภาพ

การสร้าง Tile ให้ข้อมูลภาพนั้นจะช่วยให้การเรียกอ่านข้อมูลภาพมีประสิทธิภาพมากยิ่งขึ้น วิธีการสร้างสามารถทำได้หลายแนวทาง วันนี้จะขอเสนอวิธีการหนึ่งที่ผู้ใช้งาน GDAL หรือ FWTOOLS สามารถทำงานได้ทันทีโดยไม่ต้องติดตั้งโปรแกรมอื่นๆเพิ่มเติม (LibTIFF จะถูกรวมอยู่แล้วใน GDAL)
ตัวอย่างการทำงาน ผมต้องการแปลงระบบพิัดข้อมูลภาพพร้อมทั้งสร้าง TILE ข้อมูลภาพไปพร้อมกัน ผมสามารถทำได้ดังนี้
>>gdalwarp -t_srs epsg:4326 -co "TILED=YES" -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 image.tif tiled_image.tif
เมื่อ -co คือการเรียกใช้งานทางเลือกพิเศษ (Create Options) โดยทางเลือกที่เรียกใช้งานมีดังนี้
              "TILED=YES"                        การทำ Tile ข้อมูล
              "BLOCKXSIZE=n"                การระบุขนาดของ Tile ทางแกน X
              "BLOCKYSIZE=n"                การระบุขนาดของ Tile ทางแกน Y
ภายหลังจากการสร้าง Tile ข้อมูลภาพแล้วสามารถเรียกดูผลลัพธ์ได้จากการใช้งาน gdalinfo โดยสังเกตจากขนาดของ Block ดังนี้
ตัวอย่างข้อมุลภาพที่มีการทำ Tile ด้วยขนาด 512x512 จุดภาพ