Lapā tiek izmantotas sīkdatnes 

Pikseļu māksla un attēlu filtri


No kā sastāv attēls?

Digitāls attēls ir veidots kā mozaīka no daudzām "flīzēm" jeb pikseļiem, kur katra no tām ir citā krāsā. Šo flīžu parasti attēlā ir ļoti daudz. Krāsu katrai flīzei apraksta kādā no krāsu sistēmām, bet visbiežāk izmanto RGB (Red Green Blue). Katra komponente tiek aprakstīta ar skaitli no 0 līdz 255, kas norāda tās intensitāti.

Attēliem iespējams pielietot filtrus, kas izmaina tā nokrāsu vai pavisam izmaina krāsu attēlojumu. Apskatīsim Grayscale jeb pelēktoņu filtru.


Pelēktoņa (Grayscale) filtrs

Viens no biežāk izmantotajiem attēlu filtriem ir pelēktoņa filtrs – tas pārveido krāsainu attēlu par melnbaltu (ar dažādiem pelēkās krāsas toņiem).

Atceries:

  • Ja sarkanā (R), zaļā (G) un zilā (B) vērtības ir 0, pikselis ir melns.
  • Ja visas trīs vērtības ir 255, pikselis ir balts.
  • Ja visas trīs vērtības ir vienādas, pikselis būs kāds no pelēkās krāsas toņiem – jo lielāka vērtība, jo gaišāks tonis (tuvāk baltajam); jo mazāka – jo tumšāks (tuvāk melnajam).

Lai pārvērstu pikseli par pelēktoņa versiju, mums tikai jāpārliecinās, ka visas trīs krāsas vērtības ir vienādas. Bet kādu tieši skaitli izvēlēties?

  • Ja sākotnējie R, G un B bija lielas vērtības, arī jaunajai vērtībai vajadzētu būt lielai.
  • Ja tās bija mazas, arī jaunajai jābūt mazai.

Lai jaunais pikselis saglabātu līdzīgu spilgtumu kā sākotnējais, vienkāršākais veids ir aprēķināt vidējo vērtību no R, G un B komponentēm:

jauna_vertiba = (R + G + B) / 3 #pelēktoņa aprēķins pikselim

Pēc tam šo vērtību iestata visām trim krāsām. Ja to izdarīsi katram pikselim attēlā, iegūsi tā pelēktoņa versiju.

Tavs uzdevums ir funkcijā apply_grayscale() sastādīt ciklisku algoritmu, kas caurskata visu pikseļu matricu un veic kalkulāciju visiem pikseļiem.


Atspulga algoritms

Lai realizētu atspulga efektu, nepieciešams "apvērst" pikseļu matricu, pirmo rindu padarot par pēdējo, bet pēdējo - par pirmo. To var darīt dažādi, bet ērti saformēt otru pagaidu matricu (PIXEL_ART_REFLECTION), kur rindas izkārtotas apgrieztā secībā.


Paraugs:

for rinda in PIXEL_ART:
    for pikselis in rinda:
        # te sastādi formulu

Lietotnes kods

import tkinter as tk
from tkinter import ttk

# === Pikseļu dati ===
PIXEL_ART = [
    [None, None, (200,200,200), (200,200,200), (200,200,200), (200,200,200), (200,200,200), (200,200,200), (200,200,200), (200,200,200), None, None],
    [None, (200,200,200), (255,200,150), (255,200,150), (255,200,150), (255,200,150), (255,200,150), (255,200,150), (255,200,150), (255,200,150), (200,200,200), None],
    [(200,200,200), (255,200,150), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,200,150), (200,200,200)],
    [(200,200,200), (255,200,150), (255,150,100), (100,100,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (100,100,100), (255,150,100), (255,200,150), (200,200,200)],
    [(200,200,200), (255,200,150), (255,150,100), (255,150,100), (255,150,100), (200,200,200), (200,200,200), (255,150,100), (255,150,100), (255,150,100), (255,200,150), (200,200,200)],
    [(200,200,200), (255,200,150), (255,150,100), (255,150,100), (255,150,100), (255,200,150), (255,200,150), (255,150,100), (255,150,100), (255,150,100), (255,200,150), (200,200,200)],
    [None, (200,200,200), (255,200,150), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,200,150), (200,200,200), None],
    [None, None, (200,200,200), (255,200,150), (255,150,100), (255,150,100), (255,150,100), (255,150,100), (255,200,150), (200,200,200), None, None],
    [None, None, None, (200,200,200), (200,200,200), (255,200,150), (255,200,150), (200,200,200), (200,200,200), None, None, None],
    [None, None, None, None, (200,200,200), (200,200,200), (200,200,200), (200,200,200), None, None, None, None],
    [None, None, None, None, None, (150,150,150), (150,150,150), None, None, None, None, None]
]

ROWS = len(PIXEL_ART)
COLS = len(PIXEL_ART[0])

# === Globālie mainīgie ===
PIXEL_SIZE = 30  # konstants pikseļa izmērs

# === Funkcijas ===

def rgb_to_hex(rgb):
    r, g, b = rgb
    return f'#{r:02x}{g:02x}{b:02x}'

def draw_pixels():
    canvas.delete("all")
    s = PIXEL_SIZE
    for r in range(ROWS):
        for c in range(COLS):
            val = PIXEL_ART[r][c]
            x0, y0 = c * s, r * s
            x1, y1 = x0 + s, y0 + s
            color = "white" if val is None else rgb_to_hex(val)
            canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="")

# === Filtru funkcijas — tukšas (TODO) ===

def apply_grayscale():
    """TODO: Pievieno grayscale algoritmu."""
    pass

def apply_reflection():
    """TODO: Pievieno atspulga algoritmu."""
    pass

# === Galvenā programma ===

root = tk.Tk()
root.title("Kaķis")

# Canvas
canvas = tk.Canvas(root, width=COLS * PIXEL_SIZE, height=ROWS * PIXEL_SIZE, bg="white")
canvas.pack(padx=8, pady=8)

# Pogas
controls = ttk.Frame(root)
controls.pack(padx=8, pady=(0, 8), fill="x")

ttk.Button(controls, text="Pelēkais filtrs", command=apply_grayscale).pack(side="left", padx=4)
ttk.Button(controls, text="Atspulgs", command=apply_reflection).pack(side="left", padx=4)

# Sākotnējā zīmēšana
draw_pixels()

root.mainloop()