آموزش الکترونیکآموزش پردازش تصویر

آموزش جامع ویرایش تصویر در OpenCV پایتون (#2)

در اموزش قبلی، ما در مورد openCV و انجام برخی از پردازش های اولیه تصویر با استفاده از مقیاس خاکستری، طیف رنگ، هیستوگرام، سیستم‌‌های رنگ، مؤلفه RGB و غیره آموختیم. همانطور که در آموزش قبلی گفته شد، openCV کتابخانه متن باز بینایی کامپیوتر است که دارای رابط های میانجی Python، Java و ++C است و از ويندوز، Linux، سیستم عامل Mac، سیستم عامل iphone و اندروید پشتیبانی می کند. بنابراین می توان آن را به راحتی در Raspberry Pi با محیط Linux و Python نصب کرد. و Raspberry Pi با openCV و دوربین الصاقی می تواند برای ایجاد بسیاری از برنامه های پردازش تصویر بلادرنگ مانند :تشخیص چهره، face lock، ردیابی اشیاء، تشخیص شماره پلاک خودرو، سيستم امنیتی منزل و غیره استفاده شود.

پیشنهاد میشود حتما قسمت قبلی آموزش را بخوانید : آموزش پردازش تصویر با OpenCV در پایتون و انجام مثال (#1)

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

  • نحولات تصویر – تحول وابسته و غیر وابسته
  • انتقال تصاویر – جابجایی تصویر به سمت بالا، پایین، چپ و راست
  • چرخش تصویر – چرخاندن تصویر
  • مقیاس، اندازه ‌گیری مجدد، الحاق
  • تصویر اهرام – روش دیگر اندازه گيري مجدد
  • چیدن – بخشی از تصویر را که می خواهید، برش دهید.
  • عملیات حسابی برای روشن تر و تاریک تر شدن تصاویر

تحول وابسته و غیر وابسته تصاویر در OpenCV

تحولات، تحریفات هندسی است که بر روی یک تصویر اعمال می شود، تحریفات مطمئنا در اینجا به معنای اشتباهات نیست بلکه یک نوع تصحیح برای اصلاح مسائل منظری ناشی از نقطه ای است که تصویر گرفته شده است. دو نوع تحول تصویر، وابسته و غیر وابسته وجود دارد.

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

تحول وابسته و غیر وابسته تصاویر در OpenCV

تغییر حالت تصاویر در OpenCV

تحولات غیر وابسته یا تحولات تصویری، موازی بودن، طول یا زاویه را حفظ نمی کند، اما هم راستایی و تلاقی را حفظ می‌کند. هم راستایی به معنای این است که دو نقطه در یک خط مستقیم قرار دارند.

تحولات غیر وابسته در بینایی کامپیوتر بسیار متداول است و از زوایای مختلف دوربین تولید می شود. غیر وابسته یا تحولات تصویری، هوموگرافی نیز نامیده می شود.

تحولات غیر وابسته در بینایی کامپیوتر

حرکت انتقالی تصویر: جابجایی تصویر به بالا ، پایین ، چپ و راست

اگر حرکت انتقالی x و y را همزمان انجام دهیم ، حرکت انتقالی تصویر به سمت بالا ، پایین ، چپ و راست و حتی مورب خواهد بود.

اکنون برای اجرای حرکت انتقالی تصویر از تابع warpAffine opencv  استفاده می کنیم و cv2.warpAffine برای اجرای این حرکات انتقالی استفاده می شود. اما برای این کار ما به یک ماتریس حرکت انتقالی نیاز داریم.

ماتریس حرکت انتقالی :

T = 1     0     Tx

       0     1     ty

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

TX ، TY جهت هایی هستند که در آن جا به جایی تصویر صورت می گیرد.

  • TX در امتداد محور X جا به جا می شود (افقی)
  • TY در امتداد محور Y جا به جا می شود (عمودی)
# this is an affine transformation that simply shifts the position of an image
# we use cv2.warpAffine to implement these transformations.
import cv2
import numpy as np
image = cv2.imread('input.jpg') 
# store the height and width of image
height,width = image.shape[:2]
print(image.shape[:2])
quater_height, quater_width = height/4, width/4
T = np.float32([[1,0,quater_width],[0,1,quater_height]])
img_translation=cv2.warpAffine(image,T,(width,height))
print(T)
cv2.imshow('original_image', image)
cv2.waitKey(0)
cv2.imshow('Translation',img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()

حرکت انتقالی تصویر: جابجایی تصویر به بالا ، پایین ، چپ و راست

خروجی کنسول – (183, 275) – طول و عرض

حتما ببینید :  کاربرد آردوینو در صنعت (ساخت PLC با برد صنعتی آردوینو)

[[ 1.    0.   68.75]     – T matrix

 [ 0.    1.   45.75]]

 

چرخاندن تصویر در OpenCV پایتون

چرخاندن تصویر،  دوران دادن یک تصویر حول یک نقطه یا نقطه ای در مرکز تصویر است ، دقیقاً همانطور که نقطه چرخش مانند یک محور عمل می کند.

همانطور که در حرکت انتقالی ماتریس T داریم ، احتمالاً در دوران ماتریس M را داریم.

ماتریکس دوران, M ماتریکس = Cosθ             -Sinθ

Sinθ               Cosθ

 

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

همچنین یک نکته قابل ذکر است که OpenCV  به شما امکان می دهد همزمان با استفاده از عملکرد ، cv2.getRotationMatrix2D (rotation_center_x ، rotation_center_y ، زاویه چرخش ، مقیاس) تصویر را بفروشید و بچرخانید.

ما هنوز از تابع warpAffine opencv  برای چرخاندن تصویر استفاده می کنیم. اما به جای ماتریس حرکت انتقالی مانند مورد قبلی ، در اینجا از ماتریس دوران استفاده می کنیم.

import cv2
import numpy as np
image=cv2.imread('input.jpg')
height, width=image.shape[:2]
#divide the height and width by 2 to rotate the image about it's center
rotation_matrix=cv2.getRotationMatrix2D((width/2, height/2),90,1)
rotated_image=cv2.warpAffine(image,rotation_matrix,(width,height))
cv2.imshow('original image',image)
cv2.waitKey(0)
cv2.imshow('rotated image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows() 

چرخاندن تصویر در OpenCV پایتون

مقیاس گذاری ، اندازه گیری مجدد و درون یابی

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

آن می تواند در افزایش سایز تصویر از کوچکتر به بزرگتر یا کاهش سایز تصویر از بزرگتر به کوچکتر رخ دهد.

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

انواع مختلفی از روش های درون یابی در OpenCV وجود دارد مثل :

  1. cv2.INTER_AREA – برای کوچک یا نمونه‌گیری پایین مناسب است
  2. cv2.INTER_NEAREST – سریع ترین
  3. cv2.CUBIC – بهتر
  4. cv2.INTER_LANCZOS4 – بهترین
# resizing is very easy using the cv2.resize function, its arguments are 
#cv2.resize(image,dsize(output image size), x_scale, y_scale, interpolation)
import cv2
import numpy as np
image=cv2.imread('input.jpg')
cv2.imshow('Original_image',image)
cv2.waitKey(0)
#let's make the image 3/4 the the original image size i.e. scales down to 75%
image_scaled=cv2.resize(image,None,fx=0.75,fy=0.75)
#since linear interpolation is default method for open cv we don’t need to implement it as a function.
cv2.imshow('scaling_linear interpolation', image_scaled)
cv2.waitKey(0)
#let's double the size of our image
img_double=cv2.resize(image,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
cv2.imshow('scaing_cubicInterpolation',img_double)
cv2.waitKey(0)
# let's do the resizing by exact dimensions
image_resize=cv2.resize(image,(200,300),interpolation=cv2.INTER_AREA)
cv2.imshow('scaling_exact',image_resize)
cv2.waitKey(0)
cv2.destroyAllWindows()

مقیاس گذاری ، اندازه گیری مجدد و درون یابی

هرم تصاویر ! راهی دیگر برای تغییر اندازه

تصویر هرمی به بالا بردن (بزرگنمایی تصاویر) یا پایین آمدن (کوچک شدن تصاویر) اشاره دارد.

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

این کار هنگام ساختن ردیاب های شیء مفید می باشد که تصاویر را هر بار که به دنبال یک شی می گردند مقیاس می دهند.

import cv2
image=cv2.imread('input.jpg')
smaller=cv2.pyrDown(image)
larger=cv2.pyrUp(smaller)
cv2.imshow('original',image)
cv2.waitKey(0)
cv2.imshow('smaller',smaller)
cv2.waitKey(0)
cv2.imshow('larger',larger)
cv2.waitKey(0)
cv2.destroyAllWindows()

هرم تصاویر ! راهی دیگر برای تغییر اندازه

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

حتما ببینید :  تست برد آردوینو (آموزش تعمیر خرابی سوختن آردوینو)

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

import cv2
image=cv2.imread('input.jpg')
smaller=cv2.pyrDown(image)
larger=cv2.pyrUp(smaller)
cv2.imshow('original',image)
cv2.waitKey(0)
cv2.imshow('smaller',smaller)
cv2.waitKey(0)
cv2.imshow('larger',larger)
cv2.waitKey(0)
# increasing the quality of converted larger image from smaller image using cubic interpolation
img_double=cv2.resize(smaller,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
cv2.imshow('scaing_cubicInterpolation',img_double)
cv2.waitKey(0)
cv2.destroyAllWindows()

ویرایش تصاویر در opencv python

توجه: اگر می خواهید چندین نسخه ی کوچک تصویر ایجاد کنید که در سایز کوچکتر و کوچکتر می شوند یا چندین نسخه ی بزرگ از تصاویر  که به طور مداوم در حال رشد در سایز هستند، می توانیم از  حلقه های for یا حلقه های while که در داخل عملکرد PirDown یا pirUp نگهداری می شوند استفاده کنیم.

برش تصاویر با OpenCV در پایتون

برش تصاویر به استخراج بخشی از تصویر اشاره دارد.

OpenCV به طور مستقیم عملکرد برش ندارد اما بوسیله ی numpy با استفاده از کد زیر می توان آن را به راحتی انجام داد

Cropped=image [start_row: end_row, start_col: end_col]

برش تصاویر با OpenCV در پایتون

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

import cv2
import numpy as np
image=cv2.imread('input.jpg')
height, width=image.shape[:2]
#let's get the starting pixel coordinates(top left of cropping rectangle)
start_row, start_col=int(height*.25),int(width*.25)
#let's get ending pixel coordinates(bottom right)
end_row, end_col=int(height*.75),int(width*.75)
#simply use indexing to crop out the rectangle we desire
cropped=image[start_row:end_row, start_col:end_col]
cv2.imshow("original image",image)
cv2.waitKey(0)
cv2.imshow("cropped image”, cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()

برش تصاویر با OpenCV در پایتون

توجه داشته باشید که می توانید به جای start_col یا start_row مستقیما از مقادیر پیکسل استفاده کنید ، آنها فقط برای شناسایی آسان کاربر داده می شوند.

عملیات Arithmetic برای روشن تر و تاریک شدن تصاویر

عملیات Arithmetic در OpenCV  اساساً ماتریس هایی را به تصویر اضافه یا کم می کنند ، اضافه کردن یا کم کردن ماتریس ها در افزایش یا کاهش روشنایی تأثیر دارد.

بنابراین برای اضافه کردن یا کم کردن ماتریس باید آنها را بسازیم و numpy تابعی به نام np.ones دارد که ماتریس هایی با اندازه 1 برابر تصویر خود به ما میدهد.

import cv2
import numpy as np
image=cv2.imread('input.jpg')
#create a matrix of one's, then multiply it by a scaler of 100'
#np.ones gives a matrix with same dimension as of our image with all the values being 100 in this case
M = np.ones(image.shape, dtype="uint8") * 100
#we use this to add this matrix M to our image
#notice the increase in brightness
added=cv2.add(image,M)
cv2.imshow("Added",added)
cv2.waitKey(0)
#likewise we can also substract
#notice the decrease in brightness
subtracted=cv2.subtract(image,M)
cv2.imshow("subtracted",subtracted)
cv2.waitKey(0)
cv2.destroyAllWindows()

عملیات Arithmetic برای روشن تر و تاریک شدن تصاویر

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

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا