الدرس الرابع

Lesson_4 slides

: العمليات الاساسية على الصور

: الهدف

تعلم ادخال قيم البكسلات ادخال قيم خصائص الصور وضع مناطق الصورة قسم و دمج الصور

تقريباً معظم هذه العمليات تنجز في

Numpy

بشكل افضل , من

OpenCV

ولذلك يجب امتلاك معرفة جيدة بها

: ادخال وتحوير قيم البكسلات

دعنا نحمل صورة ملونة بالبداية

In [7]:
import cv2
import numpy as np

img = cv2.imread('F:\Pictures1\Image0171.jpg',1)

يمكنك , ادخال قيمة بكسل او عرضها بوساطة احداثيات السطر والعمود , من اجل قيم الصور الملونة , سينم اعادة , ثلاث قيم للالوان.

In [8]:
px = img[100,100]
print px
[255 255 237]
In [10]:
# accessing only blue pixel
red = img[100,100,2]
print red
237

:ويمكنك تغيير قيمة البكسلات بنفس الطريقة

In [11]:
img[100,100] = [255,255,255]
print img[100,100]
[255 255 255]

:ملاحظة

Numpy

هي مكتبة مؤمثلة لمعالجة المصفوفات بسرعة , لذلك فالدخول لقيم البكسلات كالسابق قد يكون بطيئاً جداً.

:ملاحظة

الطرق السابقة , تكون بحالة اكثر من عدة بكسلات ,

اما للبكسلات المفردة فيفضل , استخدام التوابع

array.item() ,, array.item()

ولكنها لا تعطي الا قيمة واحدة , ولذلك يمكن استخدامها ثلاث مرات للصور الملونة

: وهنا طرق افضل للادخال

In [12]:
# accessing RED value
img.item(10,10,2)
Out[12]:
197
In [13]:
# modifying RED value
img.itemset((10,10,2),100)
img.item(10,10,2)
Out[13]:
100

الدخول لخصائص الصورة

تتضمن خصائص الصورة :عدد القنوات , عدد الاسطر , عدد الاعمدة , عدد البكسلات.

شكل الصورة يعطى عن طريق

In [14]:
print img.shape
(1200, 1600, 3)

والعدد الكلي للبكسلات يظهر عبر

In [15]:
print img.size
5760000

ونوع بيانات الصورة يعطى ب

In [16]:
print img.dtype
uint8

:ملاحظة

النوع هام جداً للصورة لأن عدداً كبيرا من الخطأ قد يكون بسببه

:الصورة ROI

احياناً عليك اللعب مع منطقة محددة من الصور. من اجل اكتشاف العين عليك اولا عليك البحث عن الوجه

تكتسب باستخدام ادلة المصفوفة للصورة ROI وهنا سننسخ قسماً من الصورة ونلصقه بمكان آخر.

In [23]:
part = img[280:340, 330:390]
img[273:333, 100:160] = part
from matplotlib import pyplot as plt

plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.show()

تفريق ودمج قنوات الالوان

قنوات الالوان , للصورة , يمكن تفريقها لمستوياتها الفردية عند الحاجة, ويمكن ايضاً دمج تلك القنوات معاً لتشكيل صورة ملونة "

:كالتالي

In [24]:
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
In [25]:
# Or
b = img[:,:,0]

افترض انك تريد جعل كل القنوات الحمراء صفرية . يمكنك استخدام الدلائل للمصفوفات وهي اسرع

In [26]:
img[:,:,2] = 0

:تحذير

cv2.split()

هي عملية مكلفة, بدلالة الزمن , فقط استخدمها عند الضرورة. ولذلك فاستعمال ادلة المصفوفات افضل كثيراً

: انشاء الحدود للصور

اذا اردت انشاء حدود للصورة يمكنك استعمال التابع

cv2.copyMakeBorder()

ولكن لديه تطبيقات اكثر لعمليات الطي , اضافة الاصفار

:ولهذا التابع المتغيرات التالية

صورة يسار

القمة , القاعدة ,اليسار , اليمين:مسافات الحدود

نوع الحدود:وهو متغير يملك القيم التالية

cv2.BORDER_CONSTANT

cv2.BORDER_REFLECT

cv2.BORDER_REFLECT_101

cv2.BORDER_REPLICATE

cv2.BORDER_WRAP

اللون :بحالة النوع الاول للحدود

:للتجريب لكل من الانواع السابقة نرى الكود التالي

In [27]:
import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread('C:\Users\External\Documents\myPythonFiles\pic4python\introduction.jpg')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')

plt.show()

:العمليات الجبرية على الصور

:الهدف

تعلم التوابع التالية

cv2.add() , cv2.addWeighted()

:جمع الصور

يمكنك جمع صورتين من خلال تابع

cv2.add()

او ببساطة من خلال جمع المصفوفات , لكن كل من المصفوفتين يجب ان تملك نفس النوع والعمق , او يمكن للصورة الثانية ان تكون قيمة صحيحة.

ملاحظة

هناك فرق بين عمليات جمع عددية بوساطة

numpy

opencv وعمليات الجمع بوساطة

فالاولى هي عمليةطرحية , اما الثانية فهي جمع مشبع :والتالي كمثال

In [28]:
x = np.uint8([250])
y = np.uint8([10])
In [29]:
print cv2.add(x,y) # 250+10 = 260 => 255
[[255]]
In [31]:
print x+y  # 250+10 = 260 % 256 = 4
[4]

وستكون تلك النتائج واضحة بحالة جمع صورتين , ولما كانت نتائج

opencv

افضل , فيجب دائماً استخدامها.

Image Blending دمج الصورة

هنا ايضاً جمع للصور ولكن كل منها له وزن مختلف, بحيث تعطي انطباع الدمج الشاف

$$ g(x) = (1- alpha)*f0(x) + alpha*f1(x) $$

وبتبديل القيمة لالفا من 0 ل 1 ,يمكن انتاج تحويل رائع للصور من واحدة لاخرى

وهنا اخذت صورتين لدمجهم معاً , اول صورة تعطى الوزن ,0.7 والثانية الوزن 0.3 عبر التابع

cv2.addWeighted()

الذي يطبق المعادلة السابقة :كما التالي

In [37]:
import cv2
import numpy as np
from matplotlib import pyplot as plt

img1 = cv2.imread('C:\Users\External\Documents\myPythonFiles\pic4python\Me.jpg',1)
img2 = cv2.imread('C:\Users\External\Documents\myPythonFiles\pic4python\opencv_ios.png',1)

# 600X600 sound cool
# img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]))
img2 = cv2.resize(img2,(750,600))
img1 = cv2.resize(img1,(750,600))

dst = cv2.addWeighted(img1,0.7,img2,0.3,0)

# cv2.namedWindow('dst',cv2.WINDOW_NORMAL)
res = np.hstack([img1,img2,dst])

plt.imshow(res)
plt.xticks([])
plt.yticks([])
plt.show()

opencvطبعا الشخص بالصورة هو انا , والشعار هو ل

:العمليات على مستوى البت

وهذا بتضمن عمليات

AND,OR,XOR,NOT.

وهذه ستكون بفائدة عظمى عند الاشتقاق من اي جزء من الصورة لتحديد الاجزاء غير المستطيلة من الصورة , وفيما يلي مثال على تغيير جزء محدد من الصورة.

في زاوية صورتي opencv فيما يلي سنضع شعار مكتبة

وذلك لا يتم بالجمع , لان اللون سيتغير ولا بالدمج لان اللون سيصبح شفافاً , ولن ينفع بالاسناد لان الشكل ليس مستطيلاً لذلك نقوم به كالتالي

In [46]:
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 19 11:49:35 2015

@author: External
"""

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('C:\Users\External\Documents\myPythonFiles\pic4python\Me.jpg',1)

# invert color to show with mayplotlib
b,g,r = cv2.split(img)
img = cv2.merge((r,g,b))
# grayscale logo
logo = cv2.imread('C:\Users\External\Documents\myPythonFiles\pic4python\introduction.jpg',1)

# invert color to show with mayplotlib
b,g,r = cv2.split(logo)
logo = cv2.merge((r,g,b))

imgsize = img.shape
originalsize = logo.shape
nhight = imgsize[0]*0.30
nwidth = int((nhight/originalsize[0])*originalsize[1])
nhight = int(nhight)
logo = cv2.resize(logo,(nwidth,nhight))

# take the roi of the image
roi = img[0:nhight,0:nwidth]

# Create mask and inverse mask
logo2gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
ret,mask_inv = cv2.threshold(logo2gray,225,255,cv2.THRESH_BINARY)
mask = cv2.bitwise_not(mask_inv)

#Now Black out the area of logo.
img1_bg = cv2.bitwise_and(roi,roi,mask=mask_inv)

# Take only region of logo from logo image
img2_fg = cv2.bitwise_and(logo,logo,mask = mask)

#put logo in the roi
dst = cv2.add(img1_bg,img2_fg)
img[0:nhight,0:nwidth] = dst

bar = np.zeros([imgsize[0]-nhight,nwidth],np.uint8)
explin = np.vstack((mask,bar))
explin = cv2.merge((explin,explin,explin))
res = np.hstack((explin,img))

# show result:
plt.imshow(res)
plt.xticks([])
plt.yticks([])
plt.show()

النتائج اعلاه . يظهر بها , القناع الذي تم انشاؤه. الصورة اليمنى تظهر النتيجة النهائية ,

ويمكنك لفهم اكثر , اظهار كل الصور التي تم اشتقاقها اعلاه

:تمرين

ا.انشئ عرض شرائح اعلاه للصور بمجلد مع انتقال طفيف بين الصور , بالستخدام التابع

cv2.addWeighted .

: الحل

:يظهر الكود للحل مع نتيجة التنفيذ عبر مقطع الفيديو التالي

In [5]:
from IPython.display import YouTubeVideo
YouTubeVideo('0_E1fCKYA1M')
Out[5]:
In [ ]:
 

ليست هناك تعليقات:

إرسال تعليق