NumPy: مشروع — معالجة الصور

آخر تحديث: 2026-08-26

1. مشروع: معالجة الصور باستخدام NumPy

(1) السيناريو

أنت تعمل على خط أنابيب رؤية حاسوبية. تحتاج إلى معالجة الصور على مستوى البكسل — التحويل إلى تدرج رمادي، تطبيق المرشحات، وحساب الإحصائيات — كل ذلك باستخدام عمليات مصفوفات NumPy.

(2) المهام

1. إنشاء صورة اصطناعية

PYTHON
import numpy as np

# إنشاء صورة RGB بحجم 100x100
rng = np.random.default_rng(42)
image = rng.integers(0, 256, size=(100, 100, 3), dtype=np.uint8)
print(f"Image shape: {image.shape}")  # (100, 100, 3)
print(f"Image dtype: {image.dtype}")  # uint8

2. التحويل إلى تدرج رمادي

PYTHON
---
## 2. التدرج الرمادي: متوسط موزون لقنوات RGB
---
## 3. الأوزان القياسية: 0.299 R + 0.587 G + 0.114 B
gray = np.dot(image[..., :3], [0.299, 0.587, 0.114]).astype(np.uint8)
print(f"Gray shape: {gray.shape}")  # (100, 100)

3. تطبيق مرشح بسيط (اكتشاف الحواف الأفقية)

PYTHON
---
## 4. اكتشاف الحواف: طرح الصفوف المتجاورة
edges = np.abs(gray[:-1] - gray[1:])
print(f"Edge map shape: {edges.shape}")  # (99, 100)
print(f"Edge intensity: mean={edges.mean():.1f}, max={edges.max()}")

4. استخراج قنوات الألوان

PYTHON
---
## 5. استخراج القنوات الفردية
red = image[:, :, 0]
green = image[:, :, 1]
blue = image[:, :, 2]

print(f"Red channel: mean={red.mean():.1f}, min={red.min()}, max={red.max()}")
print(f"Green channel: mean={green.mean():.1f}, min={green.min()}, max={green.max()}")
print(f"Blue channel: mean={blue.mean():.1f}, min={blue.min()}, max={blue.max()}")

5. إحصائيات الصورة

PYTHON
---
## 6. المدرج التكراري (مبسط: عد البكسلات في كل نطاق كثافة)
bins = np.array([0, 50, 100, 150, 200, 256])
indices = np.digitize(gray.ravel(), bins)
hist = np.bincount(indices, minlength=len(bins)+1)[1:-1]

for i in range(len(bins)-1):
    print(f"Intensity {bins[i]:3d}-{bins[i+1]:3d}: {hist[i]:4d} pixels")

▶ مثال: إنشاء صورة اصطناعية (الصعوبة ⭐)

PYTHON
import numpy as np

---
## 7. إنشاء صورة RGB بحجم 50x50 بتدرج
x = np.arange(50)
y = np.arange(50)
xx, yy = np.meshgrid(x, y)

red = np.zeros((50, 50), dtype=np.uint8)
green = (xx * 5).astype(np.uint8)
blue = (yy * 5).astype(np.uint8)

image = np.stack([red, green, blue], axis=-1)
print("Shape:", image.shape)
print("Red channel:", image[:, :, 0].min(), "-", image[:, :, 0].max())
print("Green channel:", image[:, :, 1].min(), "-", image[:, :, 1].max())
print("Blue channel:", image[:, :, 2].min(), "-", image[:, :, 2].max())

المخرجات:

TEXT 📖 للعرض فقط
Shape:
Red channel:
Green channel:
Blue channel:

المخرجات:

TEXT 📖 للعرض فقط
Shape: (50, 50, 3)
Red channel: 0 - 0
Green channel: 0 - 245
Blue channel: 0 - 245

▶ مثال: التحويل إلى التدرج الرمادي (الصعوبة ⭐)

PYTHON
import numpy as np

---
## 8. محاكاة صورة RGB
rng = np.random.default_rng(42)
image = rng.integers(0, 256, size=(10, 10, 3), dtype=np.uint8)

---
## 9. أوزان التدرج الرمادي القياسية
gray = (0.299 * image[:, :, 0] + 0.587 * image[:, :, 1] + 0.114 * image[:, :, 2]).astype(np.uint8)
print("Original shape:", image.shape)
print("Gray shape:", gray.shape)
print("Gray pixel [0, 0]:", gray[0, 0])
print("Gray mean:", gray.mean())

المخرجات:

TEXT 📖 للعرض فقط
Original shape:
Gray shape:
Gray pixel [0, 0]:
Gray mean:

المخرجات:

TEXT 📖 للعرض فقط
Original shape: (10, 10, 3)
Gray shape: (10, 10)
Gray pixel [0, 0]: 72
Gray mean: 129.0

▶ مثال: اكتشاف الحواف البسيط (الصعوبة ⭐⭐)

PYTHON
import numpy as np

---
## 10. إنشاء صورة بسيطة بحافة رأسية
image = np.zeros((10, 10), dtype=np.uint8)
image[:, 5:] = 255

---
## 11. اكتشاف الحواف الأفقية
h_edges = np.abs(image[:-1, :] - image[1:, :])
print("Horizontal edges:\n", h_edges)

---
## 12. اكتشاف الحواف الرأسية
v_edges = np.abs(image[:, :-1] - image[:, 1:])
print("Vertical edges:\n", v_edges)

المخرجات:

TEXT 📖 للعرض فقط
Horizontal edges:\n
Vertical edges:\n

المخرجات:

TEXT 📖 للعرض فقط
Horizontal edges:
 [[0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
Vertical edges:
 [[  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]
 [  0   0   0   0 255   0   0   0   0]]



❓ أسئلة شائعة

س لماذا استخدام 0.299 R + 0.587 G + 0.114 B للتدرج الرمادي؟
ج هذه الأوزان تتوافق مع الإدراك البشري — نحن الأكثر حساسية للأخضر، والأقل للأزرق. المتوسط البسيط (R+G+B)/3 يتجاهل هذا وينتج نتائج باهتة.
س هل يمكنني معالجة صور حقيقية باستخدام NumPy؟
ج نعم — قم بتحميل الصور باستخدام matplotlib.pyplot.imread() أو imageio.imread()، والتي تعيد مصفوفات NumPy. ثم طبق نفس العمليات الموضحة هنا.
س ما الفرق بين uint8 و float32 للصور؟
ج uint8 (0-255) هو التنسيق القياسي للتخزين والعرض. float32 يُستخدم للحسابات (المرشحات، التحويلات) لتجنب الفائض وأخطاء التقريب.

📖 ملخص

في هذا المشروع طبقت:


📝 تمارين

  1. مبتدئ (الصعوبة ⭐): بدّل القنوات الحمراء والزرقاء للصورة. أي تدرج لوني ينتج عن ذلك؟

  2. متوسط (الصعوبة ⭐⭐): نفذ كاشف حواف رأسي بطرح الأعمدة المتجاورة بدلاً من الصفوف. قارن النتائج.

  3. متقدم (الصعوبة ⭐⭐⭐): نفذ مرشح تمويه بسيط: استبدل كل بكسل بمتوسط جواره 3x3. استخدم البث والتقطيع — بدون حلقات.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%