أساسيات الصور الرقمية

كيف تدرك أجهزة الكمبيوتر الصور

1. أساسيات الصور الرقمية

كيف تقوم أجهزة الكمبيوتر بتخزين الصور

الضوء والعين البشرية

  • الإضاءة: يصطدم الضوء الصادر من مصدر بجسم ما.
  • الانعكاس: يمتص الجسم ألواناً ويعكس أخرى.
  • الالتقاط: يدخل الضوء للعين من خلال البؤبؤ.
  • المعالجة: تركز العدسة الضوء على الشبكية.

ملاحظة: تنقسم المستقبلات إلى العصي للرؤية الليلية وتحديد الأشكال، و المخاريط لتمييز الألوان.

الكاميرا الرقمية

  • الالتقاط: تلتقط الكاميرا الضوء المنعكس.
  • العدسة: يدخل الضوء ويتم تركيزه بالعدسات.
  • المستشعر: يصطدم الضوء بـ مستشعر رقمي (CMOS/CCD).
  • الرقمنة: تحول البكسلات الفوتونات لشحنات تترجم لمصفوفة رقمية.

ملاحظة: زيادة عدد البكسلات (الميجابكسل) تزيد من دقة التفاصيل، لكنها تتطلب مساحة تخزين أكبر.

التدرج الرمادي (Grayscale)

  • الصور هي مصفوفات ثنائية الأبعاد. نقطة الأصل (0,0) أعلى اليسار.
  • في الصور القياسية (8-bit)، تتراوح قيم البكسل من 0 (أسود تام) إلى 255 (أبيض ناصع).
# مصفوفة مبسطة 8×8
img = np.array([
    [0,0,0,0,0,0,0,0],
    [0,1,1,0,0,1,1,0],
    [0,1,1,0,0,1,1,0],
    [0,0,0,0,0,0,0,0],
    [0,1,0,0,0,0,1,0],
    [0,0,1,1,1,1,0,0],
    [0,1,0,0,0,0,1,0],
    [0,0,0,0,0,0,0,0]
])

الصور الملونة: قنوات RGB

  • مصفوفات ثلاثية الأبعاد (الارتفاع × العرض × 3 قنوات).
  • RGB: (أحمر Red، أخضر Green، أزرق Blue).
  • تتراوح القيم في كل قناة من 0 (مطفأ) إلى 255 (مضاء).

مسابقة سريعة

اختبر معلوماتك

ما هي أقصى قيمة لونية يمكن أن يأخذها بكسل واحد في قناة الألوان الحمراء (R) في صورة قياسية (8-bit)؟

مكتبة OpenCV (العامل السريع!)

تخيل أنك في مصنع يحتاج لفرز ملايين الصور بسرعة هائلة. مكتبة OpenCV هي “العامل الآلي” السريع جداً في هذا المصنع.

  • متى نستخدمها؟
    • عندما نتعامل مع كاميرات المراقبة (فيديو مباشر).
    • عندما نريد تعديل ملايين الصور بلمح البصر.
  • تنبيه ⚠️: هذا “العامل الآلي” له طريقة غريبة في رؤية الألوان! فهو يقرأ الألوان معكوسة (أزرق، أخضر، أحمر - BGR) بدلاً من (أحمر، أخضر، أزرق).

مثال بسيط جداً:

import cv2

# اطلب من العامل قراءة الصورة
img = cv2.imread('image.jpg')

# اطلب منه تغيير مقاسها لتصغيرها
resized = cv2.resize(img, (224, 224))

# احفظ النتيجة
cv2.imwrite('output.jpg', resized)

مكتبة Pillow أو PIL (استوديو التصوير)

إذا كانت OpenCV هي المصنع، فإن Pillow هي “استوديو تصوير منزلي” أو برنامج (الرسام) المبسط.

  • متى نستخدمها؟
    • في المشاريع البسيطة واللطيفة.
    • لعمليات التعديل البسيطة (مثل: تدوير الصورة، إضافة نص، قص جزء منها).
    • لتجهيز الصورة قبل إعطائها للذكاء الاصطناعي.
  • ميزتها: ترى الألوان بشكل طبيعي كما نراها نحن (RGB)، فلا تسبب أي ارتباك !

مثال بسيط جداً:

from PIL import Image

# افتح الصورة داخل الاستوديو
img = Image.open('image.jpg')

# قم بتدوير الصورة 90 درجة
rotated = img.rotate(90)

# احفظها
rotated.save('output.jpg')

مكتبة NumPy (المُترجم الرقمي)

الكمبيوتر لا يمتلك أعيناً ليرى الصورة كـ “أشجار وسماء”، بل يراها كـ “جدول ضخم من الأرقام”. NumPy هي “المُترجم” الذي يقوم بهذا العمل.

  • كيف تعمل؟
    • تأخذ الصورة من (Pillow) وتترجمها إلى جدول أرقام (يسمى مصفوفة أو Tensor).
    • كل خانة في الجدول تمثل لون بكسل معين (مثلاً الرقم 255 يعني ساطع، و 0 يعني مظلم).
  • النتيجة: الآن فقط يستطيع الذكاء الاصطناعي فهم الصورة والتعلم منها!

كيف نترجم الصورة؟

import numpy as np
from PIL import Image

img = Image.open('image.jpg')

# المُترجم يحول الصورة إلى جدول أرقام!
img_array = np.array(img)

# طباعة أبعاد هذا الجدول (كم صف وكم عمود)
print(img_array.shape) 

الصورة الكاملة: كيف تعمل هذه المكتبات معاً؟

تخيل أنك تبني مصنعاً ذكياً للصور، كل أداة لها وظيفة محددة تسلّمها للأخرى:

  1. الخطوة الأولى (استلام الصورة): نستخدم Pillow أو OpenCV كأداة إدخال لفتح الصورة الموجودة في الكمبيوتر.
  2. الخطوة الثانية (التجهيز): نستخدم نفس المكتبة في التعديلات الأولية كقص الأطراف، تغيير المقاس، أو التدوير.
  3. الخطوة الثالثة (الترجمة): نُسلم الصورة لمكتبة NumPy لتحولها إلى جدول ضخم من الأرقام.
  4. الخطوة الرابعة (الذكاء الاصطناعي): نأخذ هذا الجدول الرقمي وندخله في النماذج الذكية (مثل YOLO) لتحليله واستخراج الكائنات منه.

صورة ➡️ Pillow (للقراءة) ➡️ NumPy (للترجمة لأرقام) ➡️ الذكاء الاصطناعي (للتحليل)

تحدي الإحداثيات: كيف نقص جزءاً من الصورة؟

  • الطريقة الهندسية المعتادة: عندما ترسم مربعاً حول وجه لتقصه، فأنت تفكر هندسياً: كم يبعد المربع عن اليسار (x) وكم يبعد عن الأعلى (y).
  • طريقة الكمبيوتر: الكمبيوتر يرى الصورة كـ “عمارة سكنية” (جدول NumPy):
    • الارتفاع (y): هو رقم “الدور” (الصف).
    • العرض (x): هو رقم “الشقة” (العمود).
  • الخلاصة: عندما تطلب من NumPy قص الصورة، يجب أن تعطيه (رقم الدور أولاً، ثم الشقة)، أي صورة[y, x] وليس صورة[x, y].
# الإحداثيات التي رسمتها بيدك: (x1, y1, x2, y2)

# ❌ خطأ: الكمبيوتر لن يفهم وسيقتص منطقة خاطئة
crop = img[x1:x2, y1:y2] 

# ✅ صحيح: أعطه (الارتفاع/الدور y) ثم (العرض/الشقة x)
crop = img[y1:y2, x1:x2] 

لغز الألوان: لماذا تبدو الوجوه زرقاء؟ (تأثير السنافر)

  • شاشاتنا تعتمد على دمج الألوان RGB (أحمر، أخضر، أزرق) لتكوين الصور.
  • المشكلة: مكتبة OpenCV تقرأ الألوان بالعكس! فهي تقرأها BGR (أزرق، أخضر، أحمر).
  • إذا قرأنا صورة وجه بـ OpenCV وحاولنا عرضها مباشرة على الشاشة، ستظن الشاشة أن القناة الأولى هي “أحمر” بينما هي في الحقيقة “أزرق”!
  • النتيجة: يتم تبديل اللون الأحمر بالأزرق.. وتصبح الوجوه زرقاء كالسنافر!

الحل السحري لتعديل الألوان:

import cv2
import matplotlib.pyplot as plt

# 1. OpenCV تقرأ الصورة بألوان معكوسة (BGR)
img_bgr = cv2.imread('face.jpg')

# 2. الحل: سطر واحد نعكس فيه الألوان لطبيعتها (RGB)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

# 3. الآن ستظهر الوجوه بلونها الطبيعي
plt.imshow(img_rgb)
plt.show()

الخاتمة

ختام أساسيات الصور

ملخص سريع

  • الضوء والكاميرات: المحاكاة التقنية للعين البشرية.
  • البكسلات والقنوات: المصفوفات الثنائية والثلاثية الأبعاد.
  • المكتبات: OpenCV للسرعة، Pillow للمعالجة السهلة، و NumPy للعمليات.
  • أخطاء شائعة: “تأثير السنافر” بسبب BGR واختلاف إحداثيات (x,y) مع (y,x).

الخطوات القادمة

في القسم التالي: الاستدلال باستخدام YOLO

  • إدخال الصور كأرقام لنماذج رؤية الكمبيوتر.
  • استخراج الكائنات الجاهزة.

شكراً لاهتمامكم ووقتكم

يُسعدني الإجابة على استفساراتكم ومناقشاتكم