خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه ایجاد پانورامای خیره کننده با پایتون و OpenCV

کتابخانه OpenCV Python امکان خودکارسازی فرآیند ادغام چندین تصویر در یک تصویر پانوراما را فراهم کرده است.

عکاسی پانوراما تکنیک ثبت میدان دید وسیع تری است که یک عکس نمی تواند به آن دست یابد. این تکنیک چندین تصویر را به هم می چسباند تا یک تصویر واحد ایجاد کند که کل صحنه را به روشی همه جانبه ثبت کند.

با کمک پایتون می توانید این فرآیند را خودکار کرده و به راحتی پانورامای زیبایی ایجاد کنید.

راه اندازی محیط پایتون

برای پیگیری، باید درک اولیه ای از پایتون داشته باشید. هر IDE پایتون را راه اندازی کنید و یک محیط مجازی جدید ایجاد کنید. یک فایل پایتون جدید ایجاد کنید. و در ترمینال دستور زیر را برای نصب OpenCV اجرا کنید.


pip install opencv-contrib-python

شما از کتابخانه opencv-contrib-python برای بارگذاری تصاویر و دستکاری آنها استفاده خواهید کرد. دارای کلاس cv2.Stitcher است که از آن برای ایجاد پانوراما استفاده خواهید کرد.

کد منبع کامل و نمونه تصاویر استفاده شده در این مقاله در این مخزن GitHub موجود است.

واردات کتابخانه های مورد نیاز

ماژول های cv2 و os را به اسکریپت خود وارد کنید. شما از سیستم عامل برای پیمایش در مسیرهای سیستم استفاده خواهید کرد.

import cv2
import os

ماژول سیستم عامل یک ماژول داخلی پایتون است. به همین دلیل است که نیازی به نصب خارجی ندارید.

در حال بارگذاری تصاویر

یک تابع برای بارگذاری تصاویری که می خواهید بخیه کنید ایجاد کنید. ابتدا یک لیست خالی ایجاد کنید که تصاویر اولیه را ذخیره می کند. سپس از طریق هر فایل در مسیر پوشه حلقه بزنید و بررسی کنید که آیا فایل یک تصویر است یا خیر. اگر یک تصویر است، آن را بارگیری کرده و به لیست تصاویر اضافه کنید.


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

برای تنوع بخشیدن به برنامه خود می توانید فرمت های فایل تصویری بیشتری اضافه کنید. این کد فقط به دنبال فرمت های فایل .jpg و .png است.

مطلب مرتبط:   الگوی طراحی روش الگو چیست؟

تغییر اندازه تصاویر برای یک دوخت یکنواخت و پردازش سریعتر

یک تابع ایجاد کنید که اندازه لیست تصاویر را تغییر دهد. این تابع در هر تصویر در لیست حلقه می زند و اندازه آن را تغییر می دهد. در نهایت، تصاویر تغییر اندازه را به یک لیست جدید اضافه کنید.


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

تغییر اندازه باعث می شود که دوخت تصاویر یکنواخت باشد. همچنین حجم فایل را برای پردازش سریعتر کاهش می دهد.

استفاده از ماژول Stitcher OpenCV برای دوخت تصاویر

یک تابع برای دوخت تصاویر تغییر اندازه به هم ایجاد کنید. این تکنیک معمولا به عنوان ایجاد یک پانوراما شناخته می شود. این تابع لیستی از تصاویر را به عنوان ورودی می گیرد. از ماژول Stitcher برای دوخت آن ها به هم استفاده کنید. در نهایت، تابع یک تصویر دوخته شده و یک کد وضعیت را برمی گرداند.


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

اگر دوخت موفقیت آمیز بود (همانطور که با کد وضعیت cv2.STITCHER_OK نشان داده شده است)، تابع تصویر دوخته شده را برمی گرداند. در غیر این صورت، None را برمی گرداند.

برش تصویر دوخته شده

تابعی ایجاد کنید که تصویر دوخته شده را بگیرد و پس از برش دادن آن را برگرداند. ابتدا تصویر دوخته شده را به مقیاس خاکستری تبدیل کنید. سپس یک آستانه باینری برای ایجاد یک تصویر باینری اعمال کنید. در نهایت، بزرگترین کانتور را در تصویر باینری پیدا کنید و مستطیل مرزی آن را محاسبه کنید.


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

تصویر دوخته شده با استفاده از مستطیل مرزی برش داده می شود.

مطلب مرتبط:   GPT-4 در مقابل GPT-3.5: 5 تفاوت کلیدی توضیح داده شده است

پیش نمایش و ذخیره تصویر دوخته شده با استفاده از OpenCV

عملکردی ایجاد کنید که تصویر دوخته شده را در یک پنجره تعاملی نمایش دهد و آن را در دیسک ذخیره کند.


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)

تصویر پانوراما در همان پوشه ای که حاوی تصاویر اصلی است ذخیره می شود.

کنترل جریان برنامه شما

یک تابع ایجاد کنید که جریان برنامه شما را کنترل کند. تمام تصاویر را از پوشه مشخص شده بارگذاری می کند. اندازه را تغییر دهید و آنها را به هم بدوزید. تصویر دوخته شده را برش دهید، پیش نمایش آن را نمایش دهید و سپس آن را در دیسک ذخیره کنید. اگر کمتر از دو تصویر در پوشه وجود داشته باشد، عملکرد یک پیغام خطا چاپ می کند و بدون انجام هیچ گونه دوخت یا ذخیره برمی گردد.


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)

مسیر پوشه حاوی تصاویری را که می خواهید بخیه کنید عبور دهید.

مطلب مرتبط:   چگونه با استفاده از Python یک برنامه Recipe Finder بسازیم

stitch_folder(‘sample_images’)

تصاویری که استفاده می کنید باید دارای ویژگی های همپوشانی باشند. این ویژگی ها می تواند هر چیزی باشد، از نشانه های برجسته گرفته تا الگوهای بافت در تصویر. OpenCV از آنها به عنوان نقطه مرجع برای تراز کردن تصاویر استفاده می کند.

بدون این ویژگی ها، تراز کردن تصاویر و ایجاد یک پانورامای یکپارچه برای OpenCV دشوار خواهد بود.

آزمایش برنامه شما

تصاویری را که می خواهید به یک تصویر پانوراما تبدیل کنید جمع آوری کنید. اطمینان حاصل کنید که آنها دارای ویژگی های همپوشانی هستند.

در این تصویر اول به تپه نگاه کنید.

تصویری از یک صحنه با یک تپه نمایش داده شده است

در این تصویر دوم، تپه کمی نمایان است. این یک ویژگی همپوشانی ایجاد می کند.

تصویر صحنه ای با ساختمان و تپه کمی نمایان است

تصاویر را در یک پوشه ذخیره کنید. مسیر پوشه را برای دوخت به تابع stitch_folder منتقل کنید. و سپس برنامه را اجرا کنید.

یک تصویر پانوراما به عنوان خروجی یک برنامه

این برنامه تصاویر را به هم چسباند و یک تصویر پانوراما با نمای وسیع تری از صحنه ایجاد کرد. توجه داشته باشید که برای ایجاد تصویر پانوراما فوق، از 9 تصویر استفاده شده است که در مخزن GitHub فوق وجود دارد.

دستکاری تصاویر با استفاده از OpenCV

ایجاد پانوراما برخی از تکنیک های دستکاری تصویر بسیاری را که OpenCV ارائه می دهد نشان می دهد. تکنیک های بیشتری وجود دارد که می توانید برای دستکاری تصاویر مطابق با نیاز خود از آنها استفاده کنید. کار بر روی پروژه های بیشتر شامل دستکاری تصویر به شما کمک می کند تا مهارت های بینایی رایانه خود را به طور کلی بهبود بخشید.