Tạo Ảnh Toàn Cảnh Tuyệt Đẹp với Python OpenCV

Việc ghép ảnh bằng cách sử dụng Python và OpenCV liên quan đến kết hợp nhiều ảnh để tạo thành một hình ảnh toàn cảnh hoặc rộng. Quy trình này thường được sử dụng trong nhiếp ảnh để kết hợp các ảnh chồng lấn lại với nhau và tạo ra một bức tranh toàn cảnh mượt mà. Dưới đây là một phác thảo cơ bản về cách ghép ảnh bằng OpenCV:

Tiền xử lý ảnh

Tải các ảnh bạn muốn ghép bằng hàm cv2.imread() của OpenCV.

Chuyển đổi ảnh sang độ xám bằng cv2.cvtColor() nếu cần.

Phát hiện các điểm đặc trưng trong ảnh bằng các thuật toán như SIFT, ORB hoặc AKAZE.

Khớp điểm đặc trưng

Sử dụng các kỹ thuật khớp điểm đặc trưng để tìm các điểm tương ứng giữa các ảnh.

OpenCV cung cấp các hàm như cv2.BFMatcher() hoặc cv2.FlannBasedMatcher() cho việc khớp điểm đặc trưng.

Ước tính ma trận đồng dạng (homography)

Tính toán ma trận đồng dạng bằng cách sử dụng các điểm tương ứng được tìm thấy ở bước trước.

Ma trận đồng dạng mô tả sự biến đổi giữa hai ảnh.

Biến đổi và ghép ảnh

Sử dụng ma trận đồng dạng để biến đổi một trong các ảnh để căn chỉnh với ảnh kia.

Hàm cv2.warpPerspective() có thể được sử dụng cho mục đích này.

Kết hợp ảnh đã biến đổi với ảnh kia để tạo thành hình ảnh ghép mượt mà.

Làm mờ ảnh

Áp dụng các kỹ thuật làm mờ ảnh để kết hợp ảnh ghép một cách mượt mà.

Các kỹ thuật như làm mờ tuyến tính hoặc làm mờ đa băng có thể được sử dụng.

Hiển thị hoặc Lưu

Hiển thị hình ảnh ghép bằng cách sử dụng cv2.imshow() hoặc lưu nó bằng cv2.imwrite().

 

Dưới đây là một ví dụ mã đơn giản thể hiện quá trình ghép ảnh bằng OpenCV:

import cv2

# Tải ảnh
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')

# Chuyển đổi ảnh sang độ xám
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

# Phát hiện điểm đặc trưng và mô tả
orb = cv2.ORB_create()
keypoints1, descriptors1 = orb.detectAndCompute(gray1, None)
keypoints2, descriptors2 = orb.detectAndCompute(gray2, None)

# Khớp điểm đặc trưng
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = matcher.match(descriptors1, descriptors2)

# Áp dụng kiểm tra tỉ lệ để lọc các điểm khớp tốt
matches = [match for match in matches if match.distance < 0.7 * max(len(matches), 1)]

# Tìm các điểm tương ứng
src_pts = [keypoints1[match.queryIdx].pt for match in matches]
dst_pts = [keypoints2[match.trainIdx].pt for match in matches]

# Tính ma trận đồng dạng
homography, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)

# Biến đổi và ghép ảnh
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

# Hiển thị hoặc lưu hình ảnh ghép
cv2.imshow('Hình ảnh ghép', stitched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Xin lưu ý rằng ví dụ này là một bản mô phỏng đơn giản. Trong thực tế, bạn có thể cần xử lý các vấn đề như căn chỉnh ảnh, làm mờ và chỉnh sửa để đạt được hình ảnh toàn cảnh chất lượng cao.