สร้างภาพถ่ายพาโนรามาที่น่าทึ่งด้วย Python OpenCV

การต่อภาพโดยใช้ Python และ OpenCV เกี่ยวข้องกับการรวมภาพหลายภาพเพื่อสร้างมุมมองแบบพาโนรามาหรือมุมกว้าง กระบวนการนี้มักใช้ในการถ่ายภาพเพื่อรวมภาพที่ซ้อนทับกันและสร้างภาพพาโนรามาแบบไร้รอยต่อ ต่อไปนี้เป็นโครงร่างพื้นฐานของวิธีการต่อภาพโดยใช้ OpenCV:

การประมวลผลภาพล่วงหน้า

โหลดรูปภาพที่คุณต้องการต่อโดยใช้ cv2.imread() ฟังก์ชัน ของ OpenCV

แปลงภาพเป็นโทนสีเทา cv2.cvtColor() หากจำเป็น

ตรวจหาคุณสมบัติหลักในภาพโดยใช้อัลกอริธึมการตรวจหาคุณสมบัติ เช่น SIFT, ORB หรือ AKAZE

การจับคู่คุณสมบัติ

ใช้เทคนิคการจับคู่คุณลักษณะเพื่อค้นหาจุดที่สอดคล้องกันระหว่างรูปภาพ

OpenCV มีฟังก์ชันที่เหมือน cv2.BFMatcher() หรือ cv2.FlannBasedMatcher() สำหรับการจับคู่ฟีเจอร์

การประมาณค่าโฮโมกราฟฟี

คำนวณโฮโมกราฟีเมทริกซ์โดยใช้จุดที่ตรงกันซึ่งพบในขั้นตอนที่แล้ว

เมทริกซ์โฮโมกราฟฟีอธิบายการเปลี่ยนแปลงระหว่างสองภาพ

การแปรปรวนและการเย็บ

ใช้เมทริกซ์โฮโมกราฟฟีเพื่อบิดภาพหนึ่งภาพให้ตรงกับอีกภาพหนึ่ง

cv2.warpPerspective() สามารถใช้ฟังก์ชัน นี้ เพื่อจุดประสงค์นี้ได้

รวมภาพที่บิดเบี้ยวกับภาพอื่นเพื่อสร้างภาพพาโนรามาแบบต่อเนื่อง

การผสม(ไม่จำเป็น)

ใช้เทคนิคการผสมภาพเพื่อผสานภาพที่เย็บเข้าด้วยกันอย่างลงตัว

สามารถใช้เทคนิคเช่นการผสมเชิงเส้นหรือการผสมหลายแถบ

แสดงหรือบันทึก

แสดงภาพพาโนรามาแบบเย็บต่อโดยใช้ cv2.imshow() หรือบันทึกโดย cv2.imwrite() ใช้

 

ต่อไปนี้คือตัวอย่างโค้ดอย่างง่ายที่แสดงกระบวนการต่อภาพโดยใช้ OpenCV:

import cv2  
  
# Load images  
image1 = cv2.imread('image1.jpg')  
image2 = cv2.imread('image2.jpg')  
  
# Convert images to grayscale  
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)  
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)  
  
# Detect key features and descriptors  
orb = cv2.ORB_create()  
keypoints1, descriptors1 = orb.detectAndCompute(gray1, None)  
keypoints2, descriptors2 = orb.detectAndCompute(gray2, None)  
  
# Feature matching  
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)  
matches = matcher.match(descriptors1, descriptors2)  
  
# Apply ratio test to filter good matches  
matches = [match for match in matches if match.distance < 0.7 * max(len(matches), 1)]  
  
# Find corresponding points  
src_pts = [keypoints1[match.queryIdx].pt for match in matches]  
dst_pts = [keypoints2[match.trainIdx].pt for match in matches]  
  
# Calculate homography matrix  
homography, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)  
  
# Warp and stitch images  
stitched_image = cv2.warpPerspective(image1, homography,(image1.shape[1] + image2.shape[1], image1.shape[0]))  
stitched_image[0:image2.shape[0], 0:image2.shape[1]] = image2  
  
# Display or save the stitched image  
cv2.imshow('Stitched Image', stitched_image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

โปรดทราบว่าตัวอย่างนี้เป็นการสาธิตอย่างง่าย ในทางปฏิบัติ คุณอาจต้องจัดการกับปัญหาต่างๆ เช่น การจัดแนวภาพ การผสม และการแก้ไขความผิดเพี้ยนเพื่อให้ได้ภาพพาโนรามาคุณภาพสูง