Menu
CoddyTech
flag Ar iconالعربيةdown icon

ألوان الصور

جزء من قسم التعلّم غير الخاضع للإشراف في رحلة Machine Learning على Coddy. الدرس 41 من 51.

لدى الطابع بالشاشة بضعة أحبار، وليس ملايين الألوان. تختار k-means أفضل بضعة ألوان لأي صورة:

صورتان لغروب الشمس جنبًا إلى جنب. على اليسار، الصورة الأصلية: سماء تتدرج من البنفسجي إلى البرتقالي، وشمس صفراء، وبحر داكن ينعكس عليه اللون البرتقالي. على اليمين، غروب الشمس نفسه بأربعة ألوان مسطحة

لصورة ملوّنة الشكل (الصفوف، الأعمدة، 3): الأحمر والأخضر والأزرق لكل بكسل، وتتراوح قيمة كل منها من 0 إلى 1. يحوّل تغيير الشكل البكسلات إلى بيانات:

صورة بحجم 2 في 3 من بكسلات برتقالية وصفراء وزرقاء داكنة، مع سهم يشير إلى جدول من 6 صفوف، صف لكل بكسل، يحتوي كل منها على قيم الأحمر والأخضر والأزرق

pixels = image.reshape(-1, 3)
km = KMeans(n_clusters=4, n_init=10, random_state=0).fit(pixels)
poster = km.cluster_centers_[km.labels_].reshape(image.shape)
ax.imshow(poster)

كل مركز هو لون. يتيح استخدام التسميات لفهرسة المراكز إعطاء كل بكسل لون مركزه؛ وتعيد عملية إعادة التشكيل طي الصفوف لتكوين صورة.

challenge icon

التحدي

متوسط

يطبع استوديو الملصقات صورة بحيرة جبلية باستخدام k أحبار. ترسم الشيفرة الابتدائية الصورة ذات الأبعاد 40 × 60 image، وتقرأ k، وتُعِدّ مخططًا بعنوان.

  1. حوّل الصورة إلى صف واحد لكل بكسل، واعثر على k ألوان باستخدام خوارزمية k-means.
  2. أعِد تلوين كل بكسل بلون مركزه، ثم أعد ترتيب الصفوف لتكوين صورة.
  3. ارسمها على ax واعرضها.

مثل مشهد الغروب هذا باستخدام 5 أحبار:

مشهد غروب أعيد تلوينه باستخدام 5 ألوان مسطحة، وعنوانه 5 inks: شريط من لون البرقوق والوردي في السماء، وشريط برتقالي، وشمس صفراء، وبحر كحلي تتخلله خطوط برتقالية

لا يطبع برنامجك أي شيء: يصف Coddy صورتك وأحبارها. ثم جرّب قيمًا أخرى لـ k: متى يحصل القارب الأحمر على حبْره الخاص؟

جرّب بنفسك

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


# يرسم بحيرة جبلية بأبعاد 40 في 60: سماءً، وقمةً ثلجية، وغابةً، وماءً، وقاربًا أحمر
def paint_lake():
    image = np.zeros((40, 60, 3))
    for r in range(40):
        for c in range(60):
            if 30 <= r <= 31 and 10 <= c <= 17 - (r - 30) * 2:
                image[r, c] = [0.8, 0.15, 0.1]
            elif r >= 27:
                t = (r - 27) / 12
                image[r, c] = [0.1, 0.45 - 0.2 * t, 0.65 - 0.2 * t]
            elif r >= 21:
                image[r, c] = [0.1, 0.35 + 0.05 * (c % 3), 0.15]
            elif r >= abs(c - 34) + 4 and r < 10:
                image[r, c] = [0.95, 0.95, 0.97]
            elif r >= abs(c - 34) + 4:
                image[r, c] = [0.45, 0.42, 0.45]
            else:
                image[r, c] = [0.55 + r / 50, 0.75 + r / 120, 0.95]
    return np.round(image, 3)


# لا تغيّر الأسطر أدناه
image = paint_lake()
k = int(input())
fig, ax = plt.subplots()
ax.set_title(f"{k} inks")
ax.axis("off")

# اكتب الكود الخاص بك أدناه
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس التعلّم غير الخاضع للإشراف

تدرّب بنفسك: مترجم Python عبر الإنترنت