Cách tạo ảnh toàn cảnh tuyệt đẹp bằng Python và OpenCV

Thư viện OpenCV Python giúp bạn tự động hóa quá trình hợp nhất nhiều ảnh thành một ảnh toàn cảnh. Dưới đây là cách tạo ảnh toàn cảnh đẹp bằng Python và OpenCV.

Python

Ảnh toàn cảnh là kỹ thuật chụp góc rộng hơn một bức ảnh bình thường. Kỹ thuật này ghép nhiều hình ảnh lại với nhau để tạo thành một hình duy nhất, chụp lại toàn bộ cảnh theo 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 quá trình này và tạo ảnh toàn cảnh dễ dàng.

Thiết lập môi trường Python

Để làm theo hướng dẫn dưới đây, bạn cần hiểu cách dùng Python cơ bản. Mở Python IDE bất kỳ và tạo một môi trường ảo mới. Tạo file Python mới. Trên terminal, chạy lệnh sau để cài OpenCV.

pip install opencv-contrib-python

Bạn sẽ dùng thư viện opencv-contrib-python để tải ảnh và chỉnh sửa chúng. Nó có class cv2.Stitcher mà bạn sẽ dùng để tạo ảnh toàn cảnh.

Nhập thư viện được yêu cầu

Nhập các mô đun cv2 và os vào tập lệnh của bạn. Bạn sẽ dùng hệ điều hành để điều hướng qua các đường dẫn hệ thống.

import cv2
import os

Mô đun OS được tích hợp sẵn trong Python. Đây là lí do tại sao bạn không cần cài đặt nó bên ngoài.

Tải ảnh

Tạo một hàm để tải ảnh bạn muốn ghép. Đầu tiên, tạo một danh sách trống chứa ảnh ban đầu. Sau đó, lặp qua từng file trong đường dẫn thư mục để kiểm xem file đó có phải ở dạng ảnh hay không. Nếu đúng, tải và đưa nó vào danh sách ảnh.

def load_images(folder_path):
    # Load images from a folder and resize them.
    images = []
    for filename in os.listdir(folder_path):
        # Check if file is an image file
        if filename.endswith('.jpg') or filename.endswith('.png'):
            # Load the image using OpenCV and resize it
            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 file ảnh hơn để đa dạng hóa chương trình. Code này sẽ chỉ tìm định dạng file .jpg.png.

Chỉnh lại kích thước ảnh để đảm bảo tính đồng nhất và xử lý nhanh hơn

Đây là bước tạo chức năng chỉnh lại kích thước danh sách ảnh. Hàm này sẽ lặp qua từng ảnh trong danh sách và chỉnh lại kích thước của nó. Cuối cùng, đưa các ảnh đã chỉnh lại kích thước vào 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

Chỉnh lại kích thước đảm bảo việc ghép nối ảnh đồng nhất. Nó cũng giảm kích thước file để xử lý nhanh hơn.

Dùng mô đun Stitcher của OpenCV để ghép ảnh

Tạo chức năng ghép ảnh đã chỉnh 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 này sẽ lấy một danh sách ảnh làm đầu vào. Dùng mô đun Stitcher để ghép chúng lại với nhau. Cuối cùng, hàm này sẽ trả về một ảnh được ghép kèm 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 ghép nối thành công (ví dụ, được biểu thị bằng mã trạng thái cv2.STITCHER_OK), một ảnh ghép sẽ được trả về. Nếu không, bạn sẽ nhận được kết quả None.

Cắt ảnh đã ghép

Tạo chức năng cắt ảnh ghép như sau: đầu tiên, chuyển đổi ảnh ghép sang dạng grayscale. 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

Ảnh ghép được cắt bằng hình chữ nhật bao quanh.

Xem trước và lưu ảnh ghép bằng OpenCV

Tạo chức năng hiện ảnh ghép trong 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):
    # Display the stitched image
    cv2.namedWindow('Stitched Image', cv2.WINDOW_NORMAL)
    cv2.imshow('Stitched Image', image)
    cv2.waitKey(0)

    # Save the stitched image
    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 ở cùng một thư mục chứa ảnh gốc.

Kiểm soát luồng chương trình của bạn

Chức năng này sẽ tải tất cả ảnh từ thư mục cụ thể. Chỉnh lại kích thước và ghép chúng lại với nhau. Cắt ảnh đã ghép, hiện cửa sổ xem trước nó, rồi lưu nó vào ổ đĩa. Nếu có ít hơn 2 ảnh trong thư mục, hàm này sẽ xuất một thông báo lỗi và trả về kết quả nhưng không có bất kỳ hoạt động ghép hay lưu.

def stitch_folder(folder_path, width=800, height=800):
    # Stitch all images in a folder and save the result.
    # Load the images from the folder
    images = load_images(folder_path)

    # Check if there are at least two images in the folder
    if len(images) < 2:
        print('Not enough images in folder:', folder_path)
        return

    # Resize the images
    resized_images = resize_images(images, width, height)

    # Stitch the images
    stitched_image = stitch_images(resized_images)
    if stitched_image is None:
        print('Stitching failed for folder:', folder_path)
        return

    # Crop the stitched image
    cropped_image = crop_image(stitched_image)

    # Preview and save the stitched image
    folder_name = os.path.basename(folder_path)
    preview_and_save_image(cropped_image, folder_path, folder_name)

Chuyển đường dẫn thư mục chứa ảnh bạn muốn ghép

stitch_folder('sample_images')

Ảnh bạn dùng nên chứa các tính năng chồng chéo. Chúng có thể là cảnh quan nổi bật tới mẫu họa tiết trong ảnh. OpenCV dùng chúng làm điểm tham chiếu để căn chỉnh ảnh.

Nếu không có những tính năng này, OpenCV sẽ khó căn ảnh và tạo hình toàn cảnh thống nhất.

Kiểm tra chương trình

Thu thập ảnh bạn muốn biến thành ảnh toàn cảnh. Đảm bảo chúng có các tính năng chồng lấp.

Ví dụ: Hãy quan sát ngọn đồi ở ảnh đầu tiên.

Ảnh trong Python

Ở ảnh thứ 2, ngọn đồi hiện rõ hơn một chút. Tất cả nhờ tính năng xếp chồng.

Ghép ảnh bằng Python

Lưu ảnh vào thư mục. Chuyển đường dẫn đó vào hàm stitch_folder để ghép. Sau đó chạy chương trình.

Ảnh ghép hoàn thiện

Trên đây là cách tạo ảnh ghép bằng Python và OpenCV. Hi vọng bài viết hữu ích với các bạn.

Thứ Hai, 03/04/2023 14:54
52 👨 931
0 Bình luận
Sắp xếp theo
    ❖ Cơ sở dữ liệu