Materi
Citra digital adalah kisi titik kecil bernama piksel. Bagi numpy, Pillow, dan scikit-image, citra hanyalah larik angka: citra abu-abu berbentuk (tinggi, lebar), citra berwarna berbentuk (tinggi, lebar, kanal). Panduan scikit-image menegaskan urutannya: dimensi pertama adalah baris, dimensi kedua kolom, dan titik asal [0, 0] ada di pojok kiri atas. Jadi citra[2, 3] berarti baris ke-2 dari atas, kolom ke-3 dari kiri, dan citra[2, 3, 2] adalah kanal ketiga (biru) piksel itu.
Pillow memakai urutan sebaliknya untuk ukuran: atribut size berisi (lebar, tinggi), dan koordinat ditulis (x, y). Keduanya sama benarnya; yang penting sadar sedang memakai yang mana.
Handbook Pillow mendefinisikan mode "L" sebagai piksel 8 bit abu-abu dan "RGB" sebagai 3 × 8 bit. Di numpy keduanya ber-dtype uint8, bilangan bulat tanpa tanda dengan rentang 0 sampai 255: 0 gelap penuh, 255 terang penuh. Satu nilai uint8 memakan 1 byte, sehingga citra tanpa kompresi memakan tinggi × lebar × kanal byte, dan numpy melaporkannya lewat atribut nbytes. Angka ini menjelaskan kenapa foto kamera memakan puluhan megabyte begitu dibuka, walau berkas JPEG-nya kecil.
import numpy as np
from PIL import Image
bendera = np.zeros((2, 3, 3), dtype=np.uint8) # 2 baris, 3 kolom, RGB
bendera[0] = [255, 0, 0] # baris atas merah
bendera[1] = [255, 255, 255] # baris bawah putih
print(bendera.shape, bendera.dtype, bendera.nbytes) # (2, 3, 3) uint8 18
im = Image.fromarray(bendera)
print(im.mode, im.size) # RGB (3, 2) <- (lebar, tinggi)