import cv2
import numpy as np
img = cv2.imread('F:\Pictures1\Image0171.jpg',1)
يمكنك , ادخال قيمة بكسل او عرضها بوساطة احداثيات السطر والعمود , من اجل قيم الصور الملونة , سينم اعادة , ثلاث قيم للالوان.
px = img[100,100]
print px
[255 255 237]
# accessing only blue pixel
red = img[100,100,2]
print red
237
:ويمكنك تغيير قيمة البكسلات بنفس الطريقة
img[100,100] = [255,255,255]
print img[100,100]
[255 255 255]
:ملاحظة¶
Numpy
هي مكتبة مؤمثلة لمعالجة المصفوفات بسرعة , لذلك فالدخول لقيم البكسلات كالسابق قد يكون بطيئاً جداً.
:ملاحظة¶
الطرق السابقة , تكون بحالة اكثر من عدة بكسلات ,
اما للبكسلات المفردة فيفضل , استخدام التوابع
array.item() ,, array.item()
ولكنها لا تعطي الا قيمة واحدة , ولذلك يمكن استخدامها ثلاث مرات للصور الملونة
: وهنا طرق افضل للادخال
# accessing RED value
img.item(10,10,2)
197
# modifying RED value
img.itemset((10,10,2),100)
img.item(10,10,2)
100
الدخول لخصائص الصورة¶
تتضمن خصائص الصورة :عدد القنوات , عدد الاسطر , عدد الاعمدة , عدد البكسلات.
شكل الصورة يعطى عن طريق
print img.shape
(1200, 1600, 3)
والعدد الكلي للبكسلات يظهر عبر
print img.size
5760000
ونوع بيانات الصورة يعطى ب
print img.dtype
uint8
:ملاحظة¶
النوع هام جداً للصورة لأن عدداً كبيرا من الخطأ قد يكون بسببه
:الصورة ROI¶
احياناً عليك اللعب مع منطقة محددة من الصور. من اجل اكتشاف العين عليك اولا عليك البحث عن الوجه
تكتسب باستخدام ادلة المصفوفة للصورة ROI وهنا سننسخ قسماً من الصورة ونلصقه بمكان آخر.
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()
تفريق ودمج قنوات الالوان¶
قنوات الالوان , للصورة , يمكن تفريقها لمستوياتها الفردية عند الحاجة, ويمكن ايضاً دمج تلك القنوات معاً لتشكيل صورة ملونة "
:كالتالي
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
# Or
b = img[:,:,0]
افترض انك تريد جعل كل القنوات الحمراء صفرية . يمكنك استخدام الدلائل للمصفوفات وهي اسرع
img[:,:,2] = 0
:تحذير¶
cv2.split()
هي عملية مكلفة, بدلالة الزمن , فقط استخدمها عند الضرورة. ولذلك فاستعمال ادلة المصفوفات افضل كثيراً
: انشاء الحدود للصور¶
اذا اردت انشاء حدود للصورة يمكنك استعمال التابع
cv2.copyMakeBorder()
ولكن لديه تطبيقات اكثر لعمليات الطي , اضافة الاصفار
:ولهذا التابع المتغيرات التالية
صورة يسار
القمة , القاعدة ,اليسار , اليمين:مسافات الحدود
نوع الحدود:وهو متغير يملك القيم التالية
cv2.BORDER_CONSTANT
cv2.BORDER_REFLECT
cv2.BORDER_REFLECT_101
cv2.BORDER_REPLICATE
cv2.BORDER_WRAP
اللون :بحالة النوع الاول للحدود
:للتجريب لكل من الانواع السابقة نرى الكود التالي
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()
ملاحظة¶
هناك فرق بين عمليات جمع عددية بوساطة
numpy
opencv وعمليات الجمع بوساطة
فالاولى هي عمليةطرحية , اما الثانية فهي جمع مشبع :والتالي كمثال
x = np.uint8([250])
y = np.uint8([10])
print cv2.add(x,y) # 250+10 = 260 => 255
[[255]]
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()
الذي يطبق المعادلة السابقة :كما التالي
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 فيما يلي سنضع شعار مكتبة
وذلك لا يتم بالجمع , لان اللون سيتغير ولا بالدمج لان اللون سيصبح شفافاً , ولن ينفع بالاسناد لان الشكل ليس مستطيلاً لذلك نقوم به كالتالي
# -*- 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 .
: الحل¶
:يظهر الكود للحل مع نتيجة التنفيذ عبر مقطع الفيديو التالي
from IPython.display import YouTubeVideo
YouTubeVideo('0_E1fCKYA1M')
ليست هناك تعليقات:
إرسال تعليق