مكتبة OpenCV (الجزء الثالث) : العمليات الحسابية والمنطقية علي الصور

301

في هذا الدرس سنقوم بتغطية بعض العمليات الحسابية والمنطقية البسيطة علي الصور بالإضافة إلي توضيح وظيفة كل منهم. لكي نبدأ، سنحتاج صورتان بنفس الحجم ولاحقاً صورتان مختلفات في الحجم. سنستخدم تلك الصور في البداية:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-1.png

وأيضاً تلك الصورة:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-2.png

لنري ماذا تفعل عملية الجمع بين الصورتين:

import cv2

import numpy as np

# 500 x 250

img1 = cv2.imread('3D-Matplotlib.png')

img2 = cv2.imread('mainsvmimage.png')

add = img1+img2

cv2.imshow('add',add)

cv2.waitKey(0)

cv2.destroyAllWindows()

الناتج:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-3.png

غالباً لن تحتاج إلي مثل تلك العملية لكن الهدف فقط هو توضيح كيف يعمل الأمر. تستخدم ال OpenCV دالة add لكي تقوم بالجمع بدلاً من إستخدام ال + في المثال السابق كالتالي:

add = cv2.add(img1,img2)

الناتج:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-4.png

يمكننا ملاحظة أن معظم الصورة باللون الأبيض. هذا لأن الألوان قيمتها تتراوح بين 0 إلي 255 حيث أن 255 يعبر عن اللون الأبيض النقي. فعلي سبيل المثال، مجموع الألوان التالية سيؤدي إلي الحصول علي لون أبيض:

(155,211,79) + (50, 170, 200) = (205, 381, 279) = (205, 255,255)

بعد ذلك نجمع الصور بحيث يكون لأحدهما وزن أكبر من الثاني:

import cv2

import numpy as np

img1 = cv2.imread('3D-Matplotlib.png')

img2 = cv2.imread('mainsvmimage.png')

weighted = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)

cv2.imshow('weighted',weighted)

cv2.waitKey(0)

cv2.destroyAllWindows()

بالنسبة لدالة addWeighted، ال parameters هي الصورة الأولي، وزنها، الصور الثانية، وزنها، وأخيراً ال gamma والذي يعبر عن درجة الإضاءة. سنجعله صفر الآن.

الناتج:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-5.png

يمكننا ايضاً إستخدام عملية الجمع في حالة حدوث تداخل بين الصورتان. سنبدأ بالصورة الكبيرة وبعد ذلك نجمعها علي الصورة الصغيرة. سنستخدم الصورة التالية:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-52.png

سنقوم بوضع تلك الصورة علي الصورة الأصلية. هذا سهل جداً لأننا في درس سابق قمنا بإستبدال جزء من صورة بجزء آخر. لكن ماذا إذا كنا نريد إستخدام الجزء الملون فقط ولا نريد إستخدام الجزء الأبيض في الخلفية؟ يمكننا حذف الخلفية في البداية وبعد ذلك نستخدم نفس الطريقة المستخدمة في الدرس السابق. الكود المستخدم كالتالي:

import cv2

import numpy as np

# Load two images

img1 = cv2.imread('3D-Matplotlib.png')

img2 = cv2.imread('mainlogo.png')

# 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

img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

# add a threshold

ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)

mask_inv = cv2.bitwise_not(mask)

# Now black-out the area of logo in ROI

img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

# Take only region of logo from logo image.

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

dst = cv2.add(img1_bg,img2_fg)

img1[0:rows, 0:cols ] = dst

cv2.imshow('res',img1)

cv2.waitKey(0)

cv2.destroyAllWindows()

ظهر في الكود بعض الأوامر الجديدة مثل أمر threshold والذي صيغته كالتالي:

ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)

سنقوم بتغطية هذا الأمر في الدرس التالي. بالنسبة لأمر bitwise_not، فإنه يعتبر عملية تتم علي كل bit ولذلك يُسمي bitwise operation. هذا الأوامر تعمل كما في أوامر البايثون. الهدف منها هو تحويل ال pixels البيضاء في الخفية بأخري سوداء لها قيمة صفر بحيث لا تؤثر علي ناتج الجمع.

النتاج:

D:\Work\Jisr Labs\3.OpenCV\5\jisrlabs-opencvtut5-fig-6.png

 

المقال الأصلي:

https://pythonprogramming.net/image-arithmetics-logic-python-opencv-tutorial/

 

تعليقات