کتابخانه 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
تصویر دوخته شده با استفاده از مستطیل مرزی برش داده می شود.
پیش نمایش و ذخیره تصویر دوخته شده با استفاده از 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)
مسیر پوشه حاوی تصاویری را که می خواهید بخیه کنید عبور دهید.
stitch_folder(‘sample_images’)
تصاویری که استفاده می کنید باید دارای ویژگی های همپوشانی باشند. این ویژگی ها می تواند هر چیزی باشد، از نشانه های برجسته گرفته تا الگوهای بافت در تصویر. OpenCV از آنها به عنوان نقطه مرجع برای تراز کردن تصاویر استفاده می کند.
بدون این ویژگی ها، تراز کردن تصاویر و ایجاد یک پانورامای یکپارچه برای OpenCV دشوار خواهد بود.
آزمایش برنامه شما
تصاویری را که می خواهید به یک تصویر پانوراما تبدیل کنید جمع آوری کنید. اطمینان حاصل کنید که آنها دارای ویژگی های همپوشانی هستند.
در این تصویر اول به تپه نگاه کنید.
در این تصویر دوم، تپه کمی نمایان است. این یک ویژگی همپوشانی ایجاد می کند.
تصاویر را در یک پوشه ذخیره کنید. مسیر پوشه را برای دوخت به تابع stitch_folder منتقل کنید. و سپس برنامه را اجرا کنید.
این برنامه تصاویر را به هم چسباند و یک تصویر پانوراما با نمای وسیع تری از صحنه ایجاد کرد. توجه داشته باشید که برای ایجاد تصویر پانوراما فوق، از 9 تصویر استفاده شده است که در مخزن GitHub فوق وجود دارد.
دستکاری تصاویر با استفاده از OpenCV
ایجاد پانوراما برخی از تکنیک های دستکاری تصویر بسیاری را که OpenCV ارائه می دهد نشان می دهد. تکنیک های بیشتری وجود دارد که می توانید برای دستکاری تصاویر مطابق با نیاز خود از آنها استفاده کنید. کار بر روی پروژه های بیشتر شامل دستکاری تصویر به شما کمک می کند تا مهارت های بینایی رایانه خود را به طور کلی بهبود بخشید.