اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

بداية إن لم يكن لديك فكرة عن العمليات على مستوى البت، فأنصحك بالمقالة التالية أكاديمية خسوب.
هذا التابع له الشكل التالي bitwise_and:

bitwise_and(image1, image2, destination_array, mask)

الوسيط الأول يمثل الصورة الأولى والوسيط الثاني يمثل الصورة الثانية أما الوسيط الثالث سيمثل المصفوفة التي سيتم وضع الخرج فيها، والوسيط الرابع يمثل القناع. ولهذا التابع فوائد واستخدامات كثيرة جداً على سبيل المثال سأقوم من خلال الكود التالي بتطبيق لوغو (شعار) على صورة. لكن قبل ذلك سنوضح الوسطاء بشكل أكبر:
أولاً: الصورتين image1 و image2 كل منهما يتم تمثيله كمصفوفة ثلاثية الأبعاد من الشكل (height,width,channels) والصورتان يجب أن يكون لهما نفس الأبعاد بالضبط. حيث سيتم تنفيذ عملية bitwise_and بين بكسلات الصورة الأولى والثانية (سيتم دمج الصورتين).
ثانياً: القناع mask يمكن أن تضعه ويمكن أن لاتضعه حسب المهمة التي تعمل عليها، وهذا القناع يكون من بعدين فقط أي (height,width) فقط (بدون قنوات) وأيضاً يجب أن يكون حجمه مطابق لحجم الصورتين. وتكون قيمه ضمن المجال 0 ل 255. هذا القناع يستخدم لتحديد الأماكن التي سيتم تطبيق عملية bitwise_and  عليها والأماكن (البكسلات) التي لن يتم تطبيق عملية bitwise_and عليها بحيث مثلاً من أجل البكسل (x,y) من الصورتين image1 و image2 يتم النظر إلى القيمة الموجودة في ال mask فإذا كانت 0 لايتم تطبيق عملية bitwise_and  وإلا فسيتم تطبيق عملية bitwise_and بين البكسلين. الآن سأقوم بكتابة الكود السابق لتفهم بدقة:

import cv2
import numpy as np
# قراءة الصورتين
img1 = cv2.imread(r'C:\Users\Windows.10\Desktop\Safedrive\me.jpg') # الصورة
img2 = cv2.imread(r'C:\Users\Windows.10\Desktop\Safedrive\car.webp') # اللوغو
# نريد وضع اللوغو في الزاوية العليا اليسارية من الصورة
img2=cv2.resize(img2,(180,140)) # سنقوم بتحديد حجم اللوغو بالشكل الذي يناسبنا
# نقوم الآن بتحديد أبعاد اللوغو
rows,cols,channels = img2.shape 
# نقوم باقتصاص الزاويا العليا اليسارية من اللوغو بحيث يكون الحجم مطابق لحجم اللوغو
roi = img1[0:rows, 0:cols ] #هي المنطقة التي نريد وضع اللوغو فيها roi إذاً 
# نقوم الآن باستخلاص نسخة من الصورة تكون رمادية
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) # img2gray ستمثل النسخة الرمادية من الصورة
# النسخة الرمادية:

img2gray.png.50dc7f9edcd3c873900453b32a7f1fa3.png

# نقوم الآن بتعتيب الصورة بحيث نحصل على صورة أبيض وأسود
# البكسلات التي تكون قيمتها أكبر من 60 ستصبح 255 أي بيضاء
# البكسلات الأقل ستصبح 0 أي سوداء
_, mask = cv2.threshold(img2gray, 60, 255, cv2.THRESH_BINARY) # mask ستمثل نسخة الأبيض والأسود من الصورة
# mask وهذا هو شكل صورة ال :

mask.png.4727c658d9990fae01d6ef57a8e8792f.png

# نقوم بعكس القيم 
# نعلم أن 255 تكافئ 1111 1111 في النظام الثنائي
# ونعلم أن 0 تكافئ 0000 0000 في النظام الثنائي كوننا نمثل البكسل ب8 بت
# ستؤدي إلى جعل ال 0  تساوي 255 والعكس bitwise_not وبالتالي تنفيذ عملية 
# أي الأبيض أسود والأسود أبيض
mask_inv = cv2.bitwise_not(mask) # mask_inv سيجعل الخلفية بيضاء أي 255 والشعار 0 أي أسود
# mask_inv:

mask_inv.png.f11b0c94f3ca67d4d43d63b1627e90e3.png

#على ال bitwise_and كقناع لتطبيق عملية  mask_inv سنقوم باستخدام 
#وبالتالي المناطق التي تحوي 0 لن تدخل في عملية الدمج roi 
roi = cv2.bitwise_and(roi,roi,mask = mask_inv) # اي هنا سيتم تعتيم المنطقة التي نريد وضع اللوغو فيها
# الآن نكون انتهينا من تحديد المكان الذي سيتم وضع اللوغو ضمنه
# roi:

roi.png.370a7853d6af17dc59dee4bc9d126ecd.png

# الآن نقوم ياستخلاص المنطقة التي يكون فيها اللوغو فقط من صورة اللوغو وباقي المناطق يتم تعتيمها أي 0
logo = cv2.bitwise_and(img2,img2,mask = mask)
# logo:

logo.png.c38c3a67b291b94102cf7efec4d33605.png

# roi الآن نضع اللوغو ضمن ال 
# ثم نقوم بتعديل الصورة الأصلية
# تذكر أن : black+anycolor=anycolor
merge = cv2.add(roi,logo) #roi  قمنا بإضافة اللوغو الآن إلى ال 

dst.png.7ae3464fc80574db312974837ba12ec4.png

img1[0:rows, 0:cols ] = merge
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

img1.thumb.png.f3207c4891bdf4d7bc1cfca5b522244e.png

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...