- กล้องไลน์สแกน เหมาะอย่างยิ่งสำหรับการถ่ายวัตถุที่เคลื่อนไหว เช่น รถไฟ ให้ได้ภาพความละเอียดสูงโดยไม่บิดเบี้ยว
- การประมวลผลภาพต้องใช้อัลกอริทึมและเทคนิคหลากหลาย เช่น การตรวจจับบริเวณที่สนใจ, การประมาณความเร็ว, การสุ่มตัวอย่างใหม่
- งานปรับปรุงคุณภาพ เช่น การลบแถบแนวนอนและแนวตั้ง และ การลดสัญญาณรบกวน มีความสำคัญมาก
- การลงมือทำครอบคลุมถึงการจัดการข้อมูลขนาดใหญ่ การใช้ Python, numpy และการปรับปรุงเชิงทดลองหลายรูปแบบ
- สามารถได้มุมมองเพิ่มเติมจากการเปรียบเทียบกับตัวอย่างภาพถ่ายไลน์สแกนของช่างภาพคนอื่น
ภาพรวมของกล้องไลน์สแกน
- กล้องไลน์สแกนสแกนภาพด้วยพิกเซลเพียงหนึ่งแถว (หรือสองแถว) ที่ความเร็วสูงมาก
- กล้องจะถูกติดตั้งอยู่กับที่ และเมื่อรถไฟวิ่งผ่านหน้ากล้อง รูปร่างทั้งหมดจะถูกบันทึกออกมา
- พื้นหลังที่อยู่นิ่งจะถูกทำซ้ำในทุกคอลัมน์แนวตั้งของภาพ จึงเกิด เอฟเฟ็กต์ลายแถบเฉพาะตัว
- วิธีนี้ทำให้สามารถถ่าย ภาพความละเอียดสูงโดยไม่บิดเบี้ยว ตลอดความยาวทั้งขบวนรถไฟ จึงมีประโยชน์กับงานอดิเรกอย่างการทำโมเดลรถไฟด้วย
- กล้องสตริปที่ใช้ฟิล์มก็ทำงานด้วยหลักการคล้ายกัน แต่ต่างกันตรงที่มีปัญหาเรื่องความไวแสง จึงต้องปรับความเร็วฟิล์มด้วยตนเอง
อุปกรณ์กล้อง
- ใช้รุ่น [Alkeria Necta N4K2-7C] ซึ่งติดตั้งเซนเซอร์ภาพแบบ Bayer array คู่ ขนาด 4096×2
- ข้อมูลดิบถูกเก็บเป็นอาร์เรย์ไบนารี 16 บิต
- มีการถ่ายภาพในสภาพแวดล้อมหลากหลาย เช่น รถไฟใต้ดินในเมือง
การตรวจจับบริเวณที่สนใจ (ROI)
- เมื่อสแกนเป็นเวลานานจะเกิดข้อมูลพื้นหลังจำนวนมาก จึงจำเป็นต้องมี อัลกอริทึมตรวจจับช่วงที่มีวัตถุเคลื่อนไหวโดยอัตโนมัติ
- ใช้การผสมผสานระหว่างฟังก์ชันพลังงาน (อิงจาก gradient) และค่าสูงสุดของพิกเซล เพื่อแยกโครงสร้างแนวตั้ง (การเคลื่อนไหว) ออกจากโครงสร้างแนวนอน (พื้นหลัง)
- ภาพถูกแบ่งเป็นหลายชังก์ และคำนวณคะแนนจากพลังงานเปอร์เซ็นไทล์ที่ 99 ของแต่ละชังก์
- ชังก์ที่มีคะแนนสูงกว่าค่าต่ำสุดอย่างน้อย 1.5 เท่าถูกมองว่าเป็น บริเวณที่มีวัตถุเคลื่อนไหว
- วิธีเดิม ๆ ไม่สามารถทำให้ใช้ได้ทั่วไป แต่แนวทางปัจจุบันทำงานได้มีประสิทธิภาพกว่ากับสถานการณ์ที่หลากหลาย
การประมาณความเร็ว
- เมื่อวัตถุเคลื่อนที่ หาก การประมาณความเร็วล้มเหลว ภาพจะเกิดการยืดหรือบีบจนบิดเบี้ยว
- คำนวณความเร็วการเคลื่อนที่ในแต่ละชังก์โดยเปรียบเทียบ ช่องสีเขียว (Green) สองช่อง ของกล้อง
- สำหรับแต่ละชังก์ จะลองเลื่อนค่าเล็กน้อยตั้งแต่ -7 ถึง +7 แล้วคำนวณผลรวมค่าสัมบูรณ์ของความต่างระหว่างสองช่อง เพื่อสร้าง cost array
- เพื่อหาจุดพีกระดับ subpixel จะใช้การอินเตอร์โพเลชันสไตล์ [mean shift] ที่อิง Gaussian และใช้ spline เพื่อแก้ความเปลี่ยนแปลงโดยรวม
- ค่า spline ที่สกัดได้หมายถึง ช่วงห่างระหว่างตัวอย่างในอนุกรมเวลาต้นฉบับ และถูกใช้เพื่อแก้ความบิดเบี้ยวของภาพ
การสุ่มตัวอย่างใหม่
- คำนวณตำแหน่งตัวอย่างตาม spline แล้วดึงภาพใหม่ออกมา
- มีการพิจารณากรณียกเว้น เช่น ถ้า spline เป็นลบให้กลับภาพซ้ายขวา หรือถ้าเข้าใกล้ 0 มากให้ถือเป็นข้อผิดพลาด
- สำหรับแต่ละตำแหน่งตัวอย่าง จะเก็บข้อมูลความกว้างของตัวอย่างไว้ด้วย และใช้ ฟังก์ชันวินโดว์ที่เหมาะสม เช่น Hann window เพื่อเพิ่มประสิทธิภาพการป้องกัน aliasing
- การเลือกคอลัมน์แบบง่าย ๆ หรือใช้วินโดว์สี่เหลี่ยมไม่เหมาะ เพราะจะเกิดอาร์ติแฟกต์หยาบเมื่ออัปแซมปลิง
การดีโมเสก
- จำเป็นต้องใช้การดีโมเสกแบบกำหนดเอง เช่น bilinear interpolation ที่คำนึงถึงออฟเซ็ตเชิงพื้นที่ของ Bayer array แบบ 2 คอลัมน์
- หลังจากประมาณความเร็วแล้ว จะใช้การอินเตอร์โพเลชันเชิงเส้นเพื่อแก้ปัญหาอย่าง fringing
- เนื่องจากข้อมูลจากช่องสีเขียวสองช่องแตกต่างกัน จึงอาจมีโอกาสฟื้นฟูภาพสีเต็มได้ดีกว่า Bayer array ทั่วไป
การลบแถบแนวตั้ง
- clock jitter (stripes) และความสว่างของวัตถุที่เปลี่ยนแปลง ทำให้เกิดแถบแนวตั้งในภาพ
- แก้ลายแถบด้วย ฟังก์ชันแก้ไขรายคอลัมน์ โดยใช้การถดถอยเชิงเส้นและค่าน้ำหนักแบบ Gaussian (iteratively reweighted least squares)
- ฟังก์ชันแก้ไขเหล่านี้ก่อให้เกิดโครงสร้างแบบกรุปทางคณิตศาสตร์ และเพื่อป้องกัน drift เมื่อสะสมการแก้ไข จึงพิจารณาการแก้ระบบเชิงเส้นแบบ band-diagonal
- ในการใช้งานจริง ยังสามารถใช้ ฟิลเตอร์ exponential smoothing เพื่อลดสัญญาณรบกวนความถี่สูงได้
- การแก้ลายแถบต้องทำก่อนการประมาณความเร็วเสมอ
การลดสัญญาณรบกวน
- ใช้ เทคนิคลดสัญญาณรบกวนแบบอิงแพตช์ (block matching) โดยใช้ประโยชน์อย่างเต็มที่จากพื้นผิวที่ซ้ำกันบนตัวรถไฟ
- ใช้เวกเตอร์คุณลักษณะของแพตช์ขนาด 3×3 พิกเซล แล้วลดสัญญาณรบกวนด้วยการถัวเฉลี่ยแบบถ่วงน้ำหนักภายในกลุ่มแพตช์ที่คล้ายกัน
- ถ้าเตรียมข้อมูลล่วงหน้าด้วยการมองเป็นการแจกแจงปัวซง (แปลงรากที่สอง) ตามความเข้มของสัญญาณก่อนนำมาเปรียบเทียบ จะช่วยให้ประสิทธิภาพดีขึ้น
- เทคนิค total variation denoising แบบเดิมทำให้พื้นผิวสูญหายมากเกินไป จึงไม่เหมาะ
- ข้อจำกัดของวิธีนี้คือใช้การคำนวณมากและทำงานช้า
การแก้เอียง (Skew)
- ถ้ากล้องไม่ได้ตั้งฉากแนวตั้งพอดี จะเกิด อาการที่ทั้งภาพเอียงเล็กน้อย
- การตรวจจับ skew ควรทำหลังการประมาณความเร็ว และก่อนการสุ่มตัวอย่างใหม่ขั้นสุดท้าย เพื่อให้สูญเสียข้อมูลน้อยที่สุด
- สามารถตรวจจับอัตโนมัติจากโครงสร้างแนวตั้งด้วยวิธีอย่าง Hough transform
การปรับสี
- ปัจจุบันใช้ เมทริกซ์ปรับสีแบบแมนนวล เพื่อจูนโทนสี
- ในทางปฏิบัติ คุณภาพที่ได้ค่อนข้างดี รวมถึงโทนผิวที่ดูเป็นธรรมชาติ
รายละเอียดการนำไปใช้จริง
- ไปป์ไลน์ทั้งหมดถูกพัฒนาด้วย Python และ numpy
- เนื่องจากข้อมูลมีขนาดใหญ่มาก (4096 แถว × หลายแสนคอลัมน์) จึงเลือกใช้วิธี ประมวลผลเป็นชังก์ในแต่ละขั้นตอน เพื่อรับมือปัญหาหน่วยความจำไม่พอ
- ไม่สามารถจัดสรรหน่วยความจำแบบครั้งเดียวทั้งหมดได้ จึงต้องประมวลผลและบันทึกข้อมูลเป็นส่วน ๆ ในแต่ละขั้น
ประสบการณ์ในการพัฒนา
- มีการลองใช้เครื่องมือ AI เพื่อช่วยเขียนโค้ด แต่ผลลัพธ์มีข้อจำกัด
- มักพบว่า AI สร้างโค้ดที่ไม่มีประสิทธิภาพ เช่น ทำให้ปัญหาเชิงเส้นกลายเป็น ความซับซ้อนเชิงเวลาแบบกำลังสองโดยไม่จำเป็น
- ในการจัดการอาร์เรย์ขนาดใหญ่ ยังมีปัญหาด้านหน่วยความจำ เช่น การสร้าง mask ทั้งชุดโดยไม่จำเป็น
- อย่างไรก็ดี บางส่วน เช่น API การจัดโครงสร้างโค้ด หรือการทำภาพประกอบ (Matplotlib) สามารถทำได้มีประสิทธิภาพขึ้นด้วยความช่วยเหลือจาก AI
ตัวอย่างภาพถ่ายรถไฟแบบไลน์สแกนของผู้อื่น
Adam Magyar
- [Adam Magyar] ทำโปรเจกต์ "Stainless" และ "Urban Flow" ด้วยกล้องไลน์สแกนขาวดำที่พัฒนาขึ้นเอง
- เคยถ่ายผลงานที่สะอาดมากแม้ใน สภาพแสงน้อยอย่างภายในรถไฟใต้ดิน
- จำเป็นต้องเลือกตำแหน่งถ่ายเพื่อหลีกเลี่ยงแสงกะพริบของไฟในรถไฟใต้ดิน
KR64 บล็อก
- [kr64.seesaa.net] เผยแพร่ ภาพถ่ายรถไฟแบบไลน์สแกนหลากหลายจากทั่วญี่ปุ่น เป็นจำนวนมาก
- คาดว่าใช้กล้อง slit-scan แบบฟิล์ม และมีความหลากหลายกับคุณภาพในระดับสูงมาก
- เว็บไซต์มักล่มบ่อยจากปัญหาทางเทคนิค และไม่สามารถติดต่อได้
ยังไม่มีความคิดเห็น