การประมวลผลภาพจากกล้องไลน์สแกนสำหรับการถ่ายภาพรถไฟ
(daniel.lawrence.lu)- กล้องไลน์สแกน เหมาะอย่างยิ่งสำหรับการถ่ายวัตถุที่เคลื่อนไหว เช่น รถไฟ ให้ได้ภาพความละเอียดสูงโดยไม่บิดเบี้ยว
- การประมวลผลภาพต้องใช้อัลกอริทึมและเทคนิคหลากหลาย เช่น การตรวจจับบริเวณที่สนใจ, การประมาณความเร็ว, การสุ่มตัวอย่างใหม่
- งานปรับปรุงคุณภาพ เช่น การลบแถบแนวนอนและแนวตั้ง และ การลดสัญญาณรบกวน มีความสำคัญมาก
- การลงมือทำครอบคลุมถึงการจัดการข้อมูลขนาดใหญ่ การใช้ 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 แบบฟิล์ม และมีความหลากหลายกับคุณภาพในระดับสูงมาก
- เว็บไซต์มักล่มบ่อยจากปัญหาทางเทคนิค และไม่สามารถติดต่อได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ฉันก็ชอบไอเดียนี้มากเหมือนกัน เคยลองใช้โดรนสแกนต้นไม้ที่ใหญ่ที่สุดในนิวอิงแลนด์ด้วยวิธีคล้ายกัน ผลลัพธ์ยังไม่ค่อยดีนัก แต่ก็คิดว่าอาจจะลองใหม่อีกครั้ง
ผลลัพธ์
โปรเจ็กต์นี้เป็นส่วนหนึ่งของเรื่องนี้
ฉันก็ใช้กระบวนการคล้ายกัน แต่ถ่ายด้วยกล้องธรรมดาแล้วนำเฟรมมาต่อกันด้วยมือเพื่อทำเป็นแอนิเมชัน
ลักษณะเด่นของวิธีนี้คือจะเห็นว่าตัวแบบถูกโฟกัสอย่างเป็นธรรมชาติ ขณะที่ฉากหลังถูกเปลี่ยนเป็นลวดลายนามธรรม
แต่ละ ‘เส้น’ กว้างประมาณ 15px
ตัวอย่าง1 ตัวอย่าง2 ตัวอย่าง3
ฉันถ่าย timelapse พระอาทิตย์ตกของเส้นขอบฟ้าโตเกียว แล้วใช้เทคนิคคล้ายกันร่วมกับ motion tracking เพื่อให้เวลาไหลจากซ้ายไปขวาของเฟรม
ในงานนี้แต่ละเส้นมี 4 พิกเซล และแอนิเมชันต้นฉบับมีความละเอียด 8k
วิดีโอที่เกี่ยวข้อง motion tracking
ลองไปหา example รถไฟแบบ line scan เพิ่มเติมแล้ว ดูได้ที่นี่
ทำให้นึกถึงการทดลองยุคแรก ๆ ที่ใช้ flatbed scanner เหมือนเป็น digital back
ตัวอย่าง: ลิงก์
สงสัยว่าถ้าใช้กล้อง line scan ถ่ายวิวเคลื่อนไหวจากรถยนต์หรือรถไฟ ภาพจะออกมาเป็นแบบไหน คิดว่าอาจเกิดความบิดเบี้ยวที่น่าสนใจจากเอฟเฟกต์ parallax
Osaka Nankai 6000 Series: ภาพ
วิวฝรั่งเศส: ภาพ1
มาร์แซย์: ภาพ2
แคลิฟอร์เนีย: ภาพ3 ภาพ4
ต้นไม้สีม่วงเป็นแบบนั้นเพราะกล้องไวต่อ near-infrared หลังจากซื้อ IR-cut filter แล้วก็ยังไม่ได้ลองถ่ายภาพรถไฟอีกเลย บางภาพก็มี frame drop หรือ artifact อื่น ๆ อยู่ด้วย
ถ้าเร็วแบบรถหรือรถไฟจะมองไม่ออกดี ต้องช้ามาก ๆ ถึงจะได้ความบิดเบี้ยวที่ดูโอเค
บทความนี้น่าสนใจมาก โดยเฉพาะภาพเคเบิลคาร์ที่น่าประทับใจมาก
การเลือกฉากหลังว่าจะใช้อะไรคงเป็นเรื่องให้คิดสนุกเหมือนกัน
ถ้าจำไม่ผิด ตอนโอลิมปิกครั้งก่อน Omega ใช้การผสมระหว่างกล้อง strip camera ที่เส้นชัยกับ high-frequency line display
ในกล้องทั่วไปมันจะเห็นเป็นเส้นกะพริบ แต่ในฉากหลังของภาพ photofinish จะมีโลโก้ Omega อยู่
เป็นอะไรที่ละเอียดมาก แต่ก็น่าทึ่งที่ทำออกมาได้
อยากแนะนำวิดีโอนี้เกี่ยวกับกล้อง photo finish ในสนามแข่งม้า คิดว่าคนอื่น ๆ ก็น่าจะดูแล้วสนุกเหมือนกัน
ภาพที่รถไฟหยุดคมกริบอยู่ระหว่างแถบสีได้อย่างสมบูรณ์แบบนั้นให้ความรู้สึกถึงความเร็วอย่างมหาศาล
ฉันคิดว่าการลดนอยส์ (denoising) ดูไม่ค่อยเป็นธรรมชาติเท่าไร และเหมือนจะยิ่งเน้น artifact ที่เหลืออยู่ โดยเฉพาะ color fringe ตามรายละเอียดต่าง ๆ
ฉันว่าน่าจะปิดฟังก์ชันนี้ไปเลยจะดีกว่า
แล้วในส่วนของกระบวนการ demosaic ก็สงสัยว่าถ้าลองทำ เวอร์ชันนี้ ของ RCD จะได้ภาพความละเอียดสูงแบบไม่มี artifact หรือเปล่า
ส่วนการแก้ลายแถบแนวตั้งก็ไม่ได้ทำงานดีในทุกกรณี บางทีกลับสร้างลายเพิ่มขึ้นมาอีก
ยังมีงานที่ต้องทำอีกมาก
RCD demosaicing คือขั้นต่อไปทันที ปัญหา color fringing เกิดจากการใช้ linear interpolation แบบง่ายกับช่องสีแดงและน้ำเงิน
เพราะช่องสีเขียวครอบคลุมทั้งภาพ ฉันเลยคิดว่าน่าจะมีวิธี interpolate ได้ดีขึ้นโดยใช้ช่องนี้เป็นตัวนำ