Menu
CoddyTech

צבעי תמונה

חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 41 מתוך 51.

לדפוס משי יש כמה צבעי דיו, לא מיליוני צבעים. k-means בוחר את המעטים הטובים ביותר לכל תמונה:

שתי תמונות של שקיעה זו לצד זו. משמאל, המקור: שמיים שצבעם דוהה מסגול לכתום, שמש צהובה, ים כהה עם השתקפות כתומה. מימין, אותה שקיעה ב-4 צבעים אחידים

לתמונת צבע יש צורה (שורות, עמודות, 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 צבעי דיו. קוד ההתחלה מצייר את image בגודל 40 על 60, קורא את 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 אונליין