Cách tạo ảnh toàn cảnh tuyệt đẹp với Python và OpenCV
Chụp ảnh toàn cảnh là kỹ thuật chụp trường nhìn rộng hơn mà một bức ảnh đơn lẻ không thể đạt được. Kỹ thuật này ghép nhiều hình ảnh lại với nhau để tạo ra một hình ảnh duy nhất ghi lại toàn bộ khung cảnh một cách chân thực.
Với sự trợ giúp của Python, bạn có thể tự động hóa quy trình này và tạo ảnh toàn cảnh đẹp một cách dễ dàng.
Mục Lục
Thiết lập môi trường Python của bạn
Để làm theo, bạn nên có hiểu biết cơ bản về Python. Khởi chạy bất kỳ IDE Python nào và tạo một môi trường ảo mới. Tạo một tệp Python mới. Và trên thiết bị đầu cuối, hãy chạy lệnh sau để cài đặt OpenCV.
pip install opencv-contrib-python
Bạn sẽ sử dụng opencv-contrib-python thư viện để tải hình ảnh và thao tác với chúng. Nó có cv2.Stitcher lớp mà bạn sẽ sử dụng để tạo ảnh toàn cảnh.
Mã nguồn đầy đủ và hình ảnh mẫu được sử dụng trong bài viết này có sẵn trong kho lưu trữ GitHub này.
Nhập các thư viện cần thiết
Nhập khẩu cv2 Và hệ điều hành mô-đun vào kịch bản của bạn. Bạn sẽ sử dụng HĐH để điều hướng qua các đường dẫn hệ thống.
import cv2
import os
Mô-đun hệ điều hành là một mô-đun tích hợp sẵn của Python. Đây là lý do bạn không cần phải cài đặt nó bên ngoài.
Đang tải hình ảnh
Tạo một chức năng để tải các hình ảnh bạn muốn ghép. Đầu tiên, tạo một danh sách trống sẽ lưu trữ các hình ảnh ban đầu. Sau đó lặp qua từng tệp trong đường dẫn thư mục để kiểm tra xem tệp có phải là hình ảnh hay không. Nếu đó là hình ảnh, hãy tải và nối nó vào danh sách hình ảnh.
def load_images(folder_path):
images = []
for filename in os.listdir(folder_path):
if filename.endswith('.jpg') or filename.endswith('.png'):
image = cv2.imread(os.path.join(folder_path, filename))
images.append(image)
return images
Bạn có thể thêm nhiều định dạng tệp hình ảnh để đa dạng hóa chương trình của mình. Mã này sẽ chỉ tìm kiếm .jpg Và .png các định dạng tập tin.
Thay đổi kích thước hình ảnh để có đường may đồng nhất và xử lý nhanh hơn
Tạo một chức năng sẽ thay đổi kích thước danh sách hình ảnh. Hàm sẽ lặp qua từng hình ảnh trong danh sách và thay đổi kích thước của nó. Cuối cùng, nối các hình ảnh đã thay đổi kích thước vào một danh sách mới.
def resize_images(images, width, height):
resized_images = []
for image in images:
resized_image = cv2.resize(image, (width, height))
resized_images.append(resized_image)
return resized_images
Thay đổi kích thước đảm bảo rằng các hình ảnh được ghép đồng nhất. Nó cũng làm giảm kích thước tệp để xử lý nhanh hơn.
Sử dụng Mô-đun Stitcher của OpenCV để ghép hình ảnh
Tạo một chức năng để ghép các hình ảnh đã thay đổi kích thước lại với nhau. Kỹ thuật này thường được gọi là tạo ảnh toàn cảnh. Hàm sẽ lấy một danh sách các hình ảnh làm đầu vào. Sử dụng thợ khâu mô-đun để ghép chúng lại với nhau. Cuối cùng, hàm sẽ trả về một hình ảnh được ghép và mã trạng thái.
def stitch_images(images):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch(images)
if status == cv2.STITCHER_OK:
return stitched_image
else:
return None
Nếu đường may thành công (như được chỉ báo bởi cv2.STITCHER_OK mã trạng thái), hàm sẽ trả về hình ảnh đã ghép. Nếu không, nó sẽ trở lại Không có.
Cắt ảnh đã ghép
Tạo một chức năng sẽ lấy hình ảnh đã ghép và trả lại sau khi cắt xén nó. Đầu tiên, chuyển đổi hình ảnh đã ghép thành thang độ xám. Sau đó, áp dụng ngưỡng nhị phân để tạo ảnh nhị phân. Cuối cùng, tìm đường viền lớn nhất trong ảnh nhị phân và tính toán hình chữ nhật giới hạn của nó.
def crop_image(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect(contours[0])
cropped_image = image[y:y + h, x:x + w]
return cropped_image
Hình ảnh đã ghép được cắt bằng hình chữ nhật bao quanh.
Xem trước và lưu hình ảnh đã ghép bằng OpenCV
Tạo một chức năng sẽ hiển thị hình ảnh đã ghép trong một cửa sổ tương tác và sẽ lưu nó vào đĩa.
def preview_and_save_image(image, folder_path, folder_name):
cv2.namedWindow('Stitched Image', cv2.WINDOW_NORMAL)
cv2.imshow('Stitched Image', image)
cv2.waitKey(0)
output_filename = os.path.join(folder_path, folder_name + '_panorama.jpg')
cv2.imwrite(output_filename, image)
print('Stitched image saved for folder:', folder_name)
Ảnh toàn cảnh được lưu trong cùng thư mục chứa ảnh gốc.
Kiểm soát luồng chương trình của bạn
Tạo một chức năng sẽ kiểm soát luồng chương trình của bạn. Nó sẽ tải tất cả các hình ảnh từ thư mục được chỉ định. Thay đổi kích thước và ghép chúng lại với nhau. Cắt hình ảnh đã ghép, hiển thị bản xem trước của nó, sau đó lưu nó vào đĩa. Nếu có ít hơn hai hình ảnh trong thư mục, chức năng sẽ in thông báo lỗi và quay lại mà không thực hiện bất kỳ thao tác ghép hoặc lưu nào.
def stitch_folder(folder_path, width=800, height=800):
images = load_images(folder_path)
if len(images) < 2:
print('Not enough images in folder:', folder_path)
return
resized_images = resize_images(images, width, height)
stitched_image = stitch_images(resized_images)
if stitched_image is None:
print('Stitching failed for folder:', folder_path)
return
cropped_image = crop_image(stitched_image)
folder_name = os.path.basename(folder_path)
preview_and_save_image(cropped_image, folder_path, folder_name)
Vượt qua đường dẫn thư mục chứa hình ảnh bạn muốn ghép.
stitch_folder('sample_images')
Hình ảnh mà bạn sử dụng phải chứa các tính năng chồng chéo. Các tính năng này có thể là bất kỳ thứ gì, từ các mốc nổi bật đến các mẫu kết cấu trong ảnh. OpenCV sử dụng chúng làm điểm tham chiếu để căn chỉnh hình ảnh.
Nếu không có các tính năng này, OpenCV sẽ khó căn chỉnh các hình ảnh và tạo một bức tranh toàn cảnh liền mạch.
Kiểm tra chương trình của bạn
Thu thập các hình ảnh mà bạn muốn chuyển thành ảnh toàn cảnh. Đảm bảo rằng chúng có các tính năng chồng chéo.
Hãy nhìn vào ngọn đồi trong hình ảnh đầu tiên này.
Trong hình ảnh thứ hai này, ngọn đồi có thể nhìn thấy một chút. Điều này tạo ra một tính năng chồng chéo.
Lưu hình ảnh vào một thư mục. Chuyển đường dẫn thư mục đến stitch_folder chức năng để khâu. Và sau đó chạy chương trình.
Chương trình đã ghép các hình ảnh lại với nhau và tạo ra một hình ảnh toàn cảnh với tầm nhìn rộng hơn về khung cảnh. Lưu ý rằng để tạo hình ảnh toàn cảnh ở trên, chín hình ảnh đã được sử dụng có trong kho lưu trữ GitHub đã đề cập ở trên.
Thao tác hình ảnh bằng OpenCV
Tạo ảnh toàn cảnh thể hiện một số kỹ thuật xử lý ảnh mà OpenCV cung cấp. Có nhiều kỹ thuật bạn có thể sử dụng để thao tác hình ảnh cho phù hợp với nhu cầu của bạn. Làm việc trên nhiều dự án liên quan đến thao tác hình ảnh sẽ giúp bạn cải thiện kỹ năng thị giác máy tính nói chung.