هدف

  • یادگرفتن عملیات های محاسباتی مانند اضافه کردن و کم کردن
  • یادگیری توابع cv.add(), cv.addWeighted()

اضافه کردن

شما میتونید دو عکس رو با تابع cv.add() به هم اضافه کنید یا به صورت ساده تر توسط کتابخانه numpy , res = img1 + img2 توجه کنید دو عکس باید هم نوع و عمق یکسانی داشته باشند یا تصویر دوم فقط یک مقدار اسکالر باشد

به عنوان مثال

>>> x = np.uint8([250])
>>> y = np.uint8([10])
 
>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
 
>>> print( x+y )          # 250+10 = 260 % 256 = 4
[4]

توجه کنید که استفاده از توابع خود کتابخانه نتیجه بهتری به ما میدهند

Image Blending

این نیز ترکیب دوعکس است با این تفاوت که وزن به هر عکس داده میشود که باعت ترکیب شدن بهتر میشود و حس شفافیت بهتری دارد معادله آن : dst = α⋅img1 + β⋅img2 + γ

  • α - وزن تصویر اول
  • β - وزن تصویر دوم
  • γ - یک مقدار ثابت

توجه داشته باشید که جمع دو وزن باید 1 شود

مثال زیر از یک ترکیب دوعکس با وزن 0.7 و 0.3 است و سپس تابع cv.addWeighted() معادله را در آن اعمال میکند در این مثال γ صفر داده شده


img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
assert img1 is not None, "file could not be read, check with os.path.exists()"
assert img2 is not None, "file could not be read, check with os.path.exists()"
 
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
 
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

image

عملیات های بیتی

شامل عملیات بیتی AND، OR، NOT، و XOR می‌شود این عملیات برای استخراج های بخش های عکس بسیار مفید خواهد بود مانند نواحی مورد علاقه(ROI) غیر مستطیلی در مثال زیر خواهیم دید چگونه یک قسمت خاصی از عکس رو تغییر بدیم

میخواهیم یک لوگو رو روی عکس قرار بدیم , نمیتونیم دو عکس رو به هم اضافه کنیم چون رنگ تغییر میکنه ترکیب هم نمیتونیم بکنیم چون یک حالت شفاف به ما میده و من میخواهیم لوگو مات باشه , برای همین از عملیات های بیتی استفاده میکنم

# Load two images
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
assert img1 is not None, "file could not be read, check with os.path.exists()"
assert img2 is not None, "file could not be read, check with os.path.exists()"
 
# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
 
# Now create a mask of logo and create its inverse mask also
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
 
# Now black-out the area of logo in ROI
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
 
# Take only region of logo from logo image.
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
 
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
 
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

در قسمت چپ عکس زیر ماسکی است که ساختیم و عکس سمت راست نتیجه رو نشون میده img

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