• กล้องไลน์สแกน เหมาะอย่างยิ่งสำหรับการถ่ายวัตถุที่เคลื่อนไหว เช่น รถไฟ ให้ได้ภาพความละเอียดสูงโดยไม่บิดเบี้ยว
  • การประมวลผลภาพต้องใช้อัลกอริทึมและเทคนิคหลากหลาย เช่น การตรวจจับบริเวณที่สนใจ, การประมาณความเร็ว, การสุ่มตัวอย่างใหม่
  • งานปรับปรุงคุณภาพ เช่น การลบแถบแนวนอนและแนวตั้ง และ การลดสัญญาณรบกวน มีความสำคัญมาก
  • การลงมือทำครอบคลุมถึงการจัดการข้อมูลขนาดใหญ่ การใช้ 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 แบบฟิล์ม และมีความหลากหลายกับคุณภาพในระดับสูงมาก
  • เว็บไซต์มักล่มบ่อยจากปัญหาทางเทคนิค และไม่สามารถติดต่อได้

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น