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

Monday, May 30, 2011

การกรองความถี่สูงและความถี่ต่ำ (Hi & Low pass filtering)

สงสัยอายุที่เพิ่มขึ้นจะมีส่วนทำให้ความจำลดลง เพราะลืมทุกทีเมื่อต้องมาทำงานกับตัวกรอง (Filter) ทั้งสองแบบนี้ วันนี้เลยขอบันทึกความเข้าใจไว้กันลืม!!!

การกรองความถี่สูง (Hi pass filter)
เป็นการกรองสัญญานที่ยอมให้ข้อมูลความถี่สูงผ่านได้ ตัวอย่างการใช้งานคือ การเพิ่มความคมชัด (Sharpening)

การกรองความถี่ต่ำ (Low pass filter)
เป็นการกรองสัญญานที่ยอมให้ข้อมูลความถี่ต่ำผ่านได้ ตัวอย่างการใช้งานคือ การทำเบลอ (Blurring)

ส่วนรายละเอียดของการใช้ตัวกรองในการทำ PanSharpening ไว้มีโอกาสจะเข้ามาเพิ่มภายหลัง

Wednesday, March 23, 2011

gdal_merge ใน FWtools 2.4.7 ใช้งานไม่ได้

ผมลองใช้ gdal_merge ใน FWtools เวอร์ชัน 2.4.7 แล้วปรากฏว่า ไม่สามารถทำงานได้อย่างถูกต้อง กล่าวคือ โปรแกรมจะต่อชนภาพให้ แต่ภาพนั้นไม่มีค่า Digital Number (DN) วิธีแก้ไขง่ายที่สุดที่คิดได้คือ กลับไปใช้งานเวอร์ชัน 2.4.6 ปรากฏว่า Work!!! ใช้งานได้
จังอยากแนะนำทุกท่านที่อาจเจอปัญหาเดียวกับผม...

Thursday, February 24, 2011

PostGIS: สร้าางตารางข้อมูลใหม่จาก ข้อมูลที่สืบค้น

บางครั้งเราต้องการสร้างตารางข้อมูลใหม่ (ชั้นข้อมูลเชิงตำแหน่งใหม่) ในฐานข้อมูลเชิงตำแหน่ง (Spatial Database) ตัวอย่างเช่น ชั้นข้อมูลเส้นทางคมนาคมถนน ซึ่งในฐานข้อมูลนั้นมีข้อมูลอรรถาธิบาย (Attribute) มากมายเกินความจำเป็น อาทิ ชื่อถนน ความกว้างช่องจราจร ความยาวของส่วนย่อย ประเภทพื้นผิว สภาพถนน โดยที่เราต้องการชั้นข้อมูลใหม่ที่มีเพียงแค่ชื่อถนน (road name: rdname) และพิกัดของแต่ละจุดเท่านั้น (geometry: the_geom) เราจะทำอย่างไร???
หลังจากศึกษาในคู่มือของ Postgis พบว่าโปรแกรมได้เตรียมฟังก์ชัน create table as สำหรับการตอบวัตถุประสงค์ในครั้งนี้ เรามาดูตัวอย่างการใช้งานกันเลยนะครับ

SQL syntax: create table table_name as select *** from *** where ***

ตัวอย่าง
create table road_name as
select rdname, the_geom from road

Wednesday, February 9, 2011

แก้สมการ Overdetermined เพียงกระพริบตา (ปี๊บๆ)

Ex: จากตัวอย่างหนังสือเรื่อง GIS & MCDA ของ จาเซ็ค หน้าที่ 211 เราต้องการหาค่าแลมดา (Lamda: L) โดยมีสมการเงื่อนไขดังนี้
L1 = 0.5(L2) + 0.3(L3)
L2 = 0.7(L1) + 0.7(L2)
L1 + L2 + L3 = 1
ปรากฏว่าในหนังสือได้คำตอบคือ L1 = 0.4, L2 = 0.3 และ L3 = 0.3 จะพบว่าค่าที่ได้นั้นใช้ได้ในบางเงื่อนไขเท่านั้น (คำตอบมีได้หลายคำตอบหรือคำตอบนั้นไม่ใช่ Unique solution) ทำให้ผลลัพธ์อาจผิดพลาดได้ ........... แล้วเราจะทำอย่างไีีร
ก่อนอื่นเรามาดูเงื่อนไขหรือข้อมูลที่เรามีก่อนดังนี้ครับ
1. เรามีตัวไม่ทราบค่า (Unknown) 3 ตัวคือค่าแลมดา L1, L2, L3
2. เรามีสมการอย่างน้่อย 3 สมการ (ตามตัวอย่างในหนังสือ)
3. จากการศึกษาพบว่า ในหนังสือนั้นขาดการนำเอาเงื่อนไขบางอย่างมาสร้างสมการคือ L3 = 0.3(L1) + 0.5(L2)
4. เมื่อเรามีสมการเพิ่มขึ้นจะพบว่า เงื่อนไขของระบบสมการนี้จะเข้าสู่เงื่อนไขของ Overdetermined system (จำนวนสมการมากกว่าจำนวนตัวไม่ทราบค่า)
คราวนี้เรามาดูวิธีแก้ระบบสมการเชิงเส้นที่ Overdetermined ด้วยเมทริกซ์ดังตัวอย่างดังนี้

Condition Equation:
L1 = 0.5(L2) + 0.3(L3)
L2 = 0.7(L1) + 0.7(L2)
L3 = 0.3(L1) + 0.5(L2)
L1 + L2 + L3 = 1
A = [-1 .5 .3; .7 -1 .7; .3 .5 -1; 1 1 1]
X = [a; b; c]
L = [0; 0; 0; 1]

V = AX+L
N = transpose (A)*A
U = transpose (A)*L
Normal Equation:
transpose (X)* transpose (N) + transpose (U) = 0
หรือ N*X + U = 0 หรือ N*X = -U
X = - inv(N) * U

ส่วนวิธีการคำนวณด้วย Matlab มีดังนี้
a = [-1 .5 .3; .7 -1 .7; .3 .5 -1; 1 1 1]
l = [0; 0; 0; 1]
x = a\l
คำตอบที่ได้คือ
x = [0.2941; 0.4118; 0.2941] หรือ
L1 = 0.2941
L2 = 0.4118
L3 = 0.2941

Saturday, January 29, 2011

ตัวอย่างการใช้ While ด้วย Python

อ่านประวัติของ Archimedes อยู่ดีๆ ดันโยงไปที่ โยฮันน์ คาร์ล ฟรีดริช เกาส์ ซะงั้น เลยอดไม่ได้ที่จะทึ่งถึงความอัจฉริยะของ เกาส์ เมื่อมีอายุได้เพียง 7 ขวบ เหตุการณ์เกิดขึ้นเมื่อคุณครูได้สั่งให้นักเรียนบวกเลขตั้งแต่ 1 ถึง 100 ชั่่วขณะเพียงแค่หันหลัง เด็กชายเกาส์ก็ตอบขึ้นมาว่า 5,050 เมื่อถูกถามว่าได้คำตอบนั้นมาได้อย่างไร เด็กชายเกาส์เขียนอธิบายดังนี้

100+99+98+...+1 = 101+101+101+...+101 = 101×50 = 5050 ดังนั้นคำตอบคือ 5050

เป็นไงละครับ....ไม่ใ่ช่อัจริยะคิดไม่ได้นะเนี่ย
อ้างอิงจาก http://th.wikipedia.org/wiki/คาร์ล_ฟรีดริช_เกาส์

เรามาทดลองดูว่าการบวกเลขตั้งแต่ 1-100 นั้นหากเขียนด้วยภาษา Python โดยใช้ While loop นั้นต้องเขียนอย่างไร
############################
i = 1
total = 0
while (i<=100):
total = total + i;
i = i + 1;
print total
############################

Wednesday, January 19, 2011

Pansharpening: Brovey transformation

การแปลงแบบ Brovey นั้นจะอาศัยค่าความสว่าง (ฺBrightness Value - BV) ของข้อมูลภาพแบบหลายช่วงคลื่น (Multispectral image) และค่าความสว่างของข้อมูลภาพแบบช่วงคลื่นเดียว (Panchromatic image) มาทำการคำนวณหาค่าความสว่างของข้อมูลภาพที่ผ่านการหลอมรวม (Fused image) ดังภาพที่ 1 ดังนี้
ภาพที่ 1 สมการการแปลงแบบ Brovey





Wednesday, January 5, 2011

Factror/Variable/Parameter

ความแตกต่างของ Factror/Variable/Parameter (ปัจจัย/ตัวแปร/พารามิเตอร์) จากการค้นคว้าเบื้องต้นพบว่า ทั้ง 3 คำ นี้มีความเกี่ยวเนื่องกันอยู่โดยขอยกตัวอย่างเพื่อความเข้าใจดังนี้
โจทย์คือ ผมต้องการหาพื้นที่เหมาะสมสำหรับการเพาะปลูกข้าว
ปัจจัย (Factor) ที่ผมใช้พิจารณาสำหรับการหาพื้นที่เหมาะสมคือ ข้อมูลดิน
ตัวแปร (Variable) ที่ผมสนใจคือ แร่ธาตุในดิน เช่น ไนโตรเจน (N) โปแตสเซียม (P) และฟอสฟอรัส (K)
พารามิเตอร์ (Parameter) คือ ปริมาณของแร่ในดิน

Wednesday, November 10, 2010

Monday, October 18, 2010

แหล่งเรียนรู้เรื่อง พีชคณิตเชิงเส้น (Linear Algebra)

ขอหยุดเรื่อง Python ไว้สักพัก เพราะมีเรื่องกวนใจให้อยากรู้บางเรื่อง นั่นคือ การแปลงแบบ Wavelet หรือ Wavelet transformation ซึ่งผมสนใจประยุกต์ใช้ในการทำ Pan-sharpening สำหรับภาพดาวเทียมธีออส ค้นไปค้นมาดันไปเกี่ยวกับพีชคณิตเชิงเส้น (Linear Algebra) ซะได้ เลยต้องบันทึกไว้สักหน่อยว่ามีเว็บไชต์ที่น่าสนใจเกี่ยวกับพีชคณิตเชิงเส้น ได้แก่

  • เครื่องมือช่วยคำนวณและขั้นตอนการทำงาน เช่น การทำ row echelon, การคำนวณ Identity matrix ด้วยวิธี reduced row echelon หรือ การแก้ปัญหาระบบสมการเชิงเส้น เป็นต้น
  • แหล่งเรียนรู้เรื่อง Linear algebra
  • แหล่งเรียนรู้เรื่อง Linear algebra (Mathworld)

Tuesday, September 28, 2010

งูงู ปลาปลากับไพธอน ตอนที่ 1 Number & String เบื้องต้นในภาษา python

จากหนังสือ Learning Python: Help for Programmers ของ Mark Lutz และ David Asher ที่พูดถึง Built-in Object type เบื้องต้นในภาษาไพธอน (Python) ได้แก่ Numbers, Strings, Lists, Dictionaries, Tuples และ Files นั้น ผมพอจะสรุปได้ดังนี้ครับ
1. Numbers
Numbers ในภาษาไพธอนนั้นจำแนกออกเป็น 5 กลุ่มหลักคือ
  • Integer (int) เช่น 12345 หรือ 123456789 เป็นต้น
  • Floating (float) เช่น 1.2345 หรือ 123.456 เป็นต้น
  • Long integer (long) เช่น 9999999L (unlimited size) เป็นต้น
  • Complex number (complex) จะประกอบด้วย real-part + imagery-part เช่น 3j หรือ 1.2j+3.4j เป็นต้น
  • Octal ({ฐาน 8) or Hex (ฐาน 16) ใช้สำหรับระบุตัวเลขที่ต้องขึ้นต้นด้วย 0 (ศูนย์) สำหรับ Hex นั้นจำเป็นต้องขึ้นต้นด้วย 0x หรือ 0X เท่านั้น ไม่สามารถใช้เลขฐานสิบได้ ตัวอย่างของOctal/Hex เช่น 0x9ff เป็นต้น
ตัวอย่างการประมวลผลข้อมูล Numbers มีดังนี้
  • การบวก การลบ การคูณและการหาร เช่น x+y, x-y, x*y และ 3/2.0 เป็นต้น
  • การเปลี่ยนเครื่องหมาย เช่น +x หรือ -x เป็นต้น
  • การยกกำลัง เช่น x**y หรือ pow(x, y) เป็นต้น
  • ในภาษาไพธอนนั้นมีการใช้กฏการมีลำดับที่เหนือกว่า (Precedence rule) สำหรับการใช้ตัวดำเนินการแบบผสม เช่น a+b*c การคำนวณจะเริ่มจากการนำค่าของตัวแปร b คูณกับค่าของตัวแปร c ก่อนแล้วจึงนำมาบวกกับค่าของตัวแปร a เป็นต้น
2. Strings
อักขระ (Strings) นั้นคือตัวอักษรหรือตัวเลขที่อยู่ในเครื่องหมาย single qoute ('.....') หรือ Double qoute (".....") เช่น 'Sawarin' หรือ 'My name is Sawarin' หรือ "Sawarin's book" เป็นต้น

การประมวลผล String ที่ใช้งานแพร่หลายแบ่งออกเป็น 2 ประเภทหลักคือ
  • Indexing เป็นการอ้างถึงตำแหน่งของอักขระในแต่ข้อความจากตำแหน่งเริ่มต้น (0) ไปจนถึงตำแหน่งสุดท้ายของข้อความ ในภาษาไพธอนนั้นสามารถอ้างอิงตำแหน่งจากส่วนท้ายของข้อความได้โดยเริ่มจากตำแหน่งที่ -1 เช่น
>>> myname = 'Sawarin'
>>> myname[0]
'S'
>>> myname[-3]
'r'
  • Slicing เป็นการตัดส่วนของข้อความที่ต้องการโดยการระบุตำแหน่งของอักขระที่ต้องการภายในเครื่องหมาย [....] เช่น myname[0:1] จะหมายถึง เลือกเฉพาะอักขระลำดับที่ 0 ถึง 1 (แต่ไม่รวม 1) จะได้ 'S' หรือ myname[4:] จะหมายถึง เลือกเฉพาะอักขระลำดับที่ 1 ถึงอักขระตำแหน่งสุดท้าย จะได้ 'rin' หรือ myname[:-1] จะหมายถึง เลือกเฉพาะอักขระลำดับที่ -1 จากท้ายข้อความจนถึงอักขระตำแหน่งเริ่มต้น (ตำแหน่งที่ 0) จะได้ 'Sawari' หรือ owner = "Sawarin's book" แล้ว owner[:-5] จะได้ "Sawarin's" เป็นต้น
เพื่อความเข้าใจของลำดับของอักขระในข้อความสามารถดูเพิ่มเติมได้จากภาพที่ 1 ดังนี้
ภาพที่ 1 ตัวอย่างลำดับของอักขระในข้อความ