شروع به کار با عکس ها

اهداف

  • خواندن عکس از فایل
  • نمایش دادن عکس در یک صفحه
  • نوشتن یک عکس داخل فایل

کد

import cv2 as cv
import sys
 
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
 
if img is None:
 sys.exit("Could not read the image.")
 
cv.imshow("Display window", img)
k = cv.waitKey(0)
 
if k == ord("s"):
 cv.imwrite("starry_night.png", img)

توضیحات

در مرحله اول کتابخانه مورد نظر را تعریف می کنیم.

import cv2 as cv
import sys

حالا نوبت تحلیل کد اصلی است.در مرحله اول عکس "starry_Night.png" را از نمونه های کتابخانه می‌خوانیم. صدا زدن cv::imread دو ورودی می‌گیرد که اولین ورودی آدرس عکس است. ورودی دوم اختیاری است که کار مشخص کردن فرمت عکس را انجام می‌دهد. ورودی های دوم:

  • cv.IMREAD_COLOR : عکس را در فرمت BGR 8-bit بارگذاری میکند
  • cv.IMREAD_UNCHANGED
  • cv.IMREAD_GRAYSCALE : بارگذاری عکس به صورت شدتی(سفید و سیاه)

بعد از خوانده شدن عکس , اطلاعات در یک آبجکت cv::Mat ذخیره می‌شود.

img = cv.imread(cv.samples.findFile("starry_night.jpg"))

در ادامه یک تست اجرا می‌شود تا بارگذاری صحیح عکس آزموده شود.

if img is None:
 sys.exit("Could not read the image.")

سپس عکس توسط تابع cv::imshow نمایش داده می‌شود. این تابع 2 ورودی دارد که اولین ورودی آن عنوان پنجره ای است که عکس در آن نمایش داده می‌شود و دومین ورودی آن آبجکت cv::Mat است. برای اینکه صفحه را تا زمانی که کاربر کلیدی را وارد کند نمایش دهیم از تابع cv::waitkey استفاده می‌کنیم.

این تابع یک ورودی دارد که نشان دهنده مدت زمانیست که برنامه باید برای ورودی کاربر صبر کند. ورودی تابع int است و به میلی ثانیه هستند. صفر نشان دهنده این است که برنامه باید برای همیشه صبر کند. به عنوان مثال اگر عدد 5000 رابه تابع بدهیم cv.waitkey(5000) به مدت 5 ثانیه صبر میکند واحد میلی ثانیه است. اگر عدد صفر به تابع داده شود برای همیشه صبر میکند برای همین بهتر است از cv.destroyAllWindows بعد از cv.waitkey(0) استفاده شود.

cv.imshow("Display window", img)
k = cv.waitKey(0)

در نهایت برنامه درصورتی که کلید s فشرده شود عکس را در یک فایل ذخیره می‌کند. این عمل توسط تابع cv::imwrite انجام میشود که 2 ورودی دارد. یک ورودی مسیر ذخیره فایل و ورودی دیگر یک آبجکت cv::Mat

if k == ord("s"):
 cv.imwrite("starry_night.png", img)

اگر با عکس هایی با کیفیت بالا استفاده میکنید میتوانید با استفاده از cv.resize() کیفیت عکس را تغییر دهید

import cv2 as cv
import sys

# خواندن تصویر
img = cv.imread(cv.samples.findFile("starry_night.jpg"))

# بررسی اینکه آیا تصویر با موفقیت بارگذاری شده است
if img is None:
    sys.exit("Could not read the image.")

# تغییر اندازه تصویر به ابعاد جدید (مثلاً نصف اندازه اصلی)
width = int(img.shape[1] * 0.5)  # عرض تصویر جدید (50٪ از عرض اصلی)
height = int(img.shape[0] * 0.5)  # ارتفاع تصویر جدید (50٪ از ارتفاع اصلی)
new_size = (width, height)

# تغییر اندازه تصویر
resized_img = cv.resize(img, new_size, interpolation=cv.INTER_LINEAR)

# نمایش تصویر اصلی و تصویر تغییر اندازه یافته
cv.imshow("Original Image", img)
cv.imshow("Resized Image", resized_img)

# منتظر بماند تا کاربر کلیدی را بفشارد
cv.waitKey(0)

# بستن همه پنجره‌ها
cv.destroyAllWindows()

تابع cv.resize() سه ورودی میگیرد اولین ورودی عکس اصلی و دومین ورودی یک تاپل که به صورت (عرض , ارتفاع) است داده میشود سومین ورودی روش درون‌یابی است که در اینجا از cv.INTER_LINEAR استفاده کردیم. روش درون یابی در اصل همان روشی است که کمک میکند هنگام تغییر سایزی پیکسل های جدید کم و زیاد شوند مطالعه بقیه روش ها به عهده خودتون.