Önce özete göz atDersin sonundaki özet, okumaya başlamadan önce yol haritası olarak.
- sRGB değerleri doğrusal ışığı değil, bir aktarım eğrisinden geçmiş hâlini yazar; 128 yaklaşık yüzde 21,6 parlaklıktır, beyazın yarısı 188 civarıdır, ama 128'in algısal açıklığı L* yaklaşık 54 ile ortaya yakındır.
- Eğri, gözün karanlık tonlardaki farklara daha duyarlı olmasına uyar ve sekiz biti karanlığa daha cömert dağıtır; yüzde birden karanlık tonlara eğrisiz yazım üç, sRGB yirmi altı kod ayırır ve koyu tenlerin bulunduğu bölge üç buçuk kat daha fazla basamak kazanır.
- Karıştırma, bulanıklaştırma ve ölçekleme doğrusal ışıkta yapılmalıdır; kodlanmış değerlerle yapılan hesap geçişleri koyulaştırır ve koyu ten ile açık zemin arasındaki kenarlarda görünür koyu haleler bırakır.
Kısa cevap
Bir görüntü dosyasındaki 0 ile 255 arasındaki sayılar ışığın miktarını doğrudan değil, bir eğriden geçirilmiş hâlini yazar; sRGB'de 128 değeri beyazın yarı parlaklığı değil, yaklaşık yüzde 21,6'sıdır ve beyazın yarı parlaklığı ancak 188 civarındaki bir değerle elde edilir. Bu eğrinin nedeni gözdedir: gölgedeki küçük bir ışık farkı, aydınlıktaki aynı farktan çok daha kolay fark edilir; 128'in açıklığı, CIELAB ölçeğinde yaklaşık 54 ile göze gerçekten orta bir gri gibi görünür ve sınırlı sayıdaki kod, gözün en çok fark gördüğü karanlık bölgeye daha cömert dağıtılmış olur. Bedeli şudur: ışıkla ilgili hesaplar, karıştırma, bulanıklaştırma ve ölçekleme, bu kodlanmış sayılarla doğrudan yapılırsa geçişler koyulaşır ve kenarlarda koyu haleler çıkar.
128 neden yarı değil
Kartın sorusu, ekranla çalışan hemen herkesin bir gün karşılaştığı bir şaşkınlıkla başlar: 128 değeri neden beyazın yarı parlaklığı değildir?
EK-02'de gördüğümüz göreli parlaklık formülü bunun cevabını içinde taşır. Formül, R, G ve B değerlerini katsayılarla çarpmadan önce her birini bir eğriden geçirir. Bu eğri sRGB standardının aktarım fonksiyonudur: 255'e bölünmüş değer 0,04045'ten küçükse 12,92'ye bölünür, büyükse 0,055 eklenip 1,055'e bölündükten sonra 2,4'üncü kuvveti alınır. 128 bu eğriden geçince 0,216 olur. Yani rgb(128, 128, 128), beyazın ışığının yalnız yüzde 21,6'sını verir.
Tersinden hesap yapıldığında, beyazın tam yarısı olan 0,5 doğrusal ışık, sRGB'de 187,5 değerine, yani yaklaşık 188'e karşılık gelir. Bir görüntüde «orta gri» diye 128 yazan biri, fiziksel olarak orta griyi değil, çok daha koyu bir griyi yazmıştır.
Göz karanlığa daha duyarlıdır
Bu eğri keyfi bir tercih değildir; gözün ışığa verdiği tepkinin biçimine yakındır. Göz, parlaklıktaki farkları mutlak değil göreli olarak algılar: karanlık bir odada bir mumun eklenmesi büyük bir fark yaratır, güneşli bir sokakta aynı mum fark edilmez.
CIE'nin kolorimetri önerileri, L değerini göreli parlaklığın küp kökü üzerinden, siyaha yakın bölgede kısa bir doğrusal uzantıyla tanımlar. Bu tanımla hesap yapıldığında, göreli parlaklığı yaklaşık 0,18 olan bir gri, L ölçeğinde tam 50'ye, yani algısal ortaya düşer. Beyazın ışığının yarısını veren gri ise L* 76 civarındadır, göze orta griden çok daha açık görünür.
İki hesap yan yana konunca 128'in sırrı ortaya çıkar. 128 değerinin göreli parlaklığı 0,216'dır ve bu parlaklığın L* değeri yaklaşık 53,6'dır. Yani 128, fiziksel olarak beyazın beşte biri kadar ışık verir, ama göze neredeyse tam ortada görünür. sRGB eğrisi, sayıları ışığa göre değil, aşağı yukarı göze göre dizer.
Kodların ekonomisi
Bu dizilişin pratik bir nedeni vardır: sekiz bit yalnız 256 kod demektir ve bu kodların nereye harcandığı önemlidir.
Bir karşılaştırma bunu somutlaştırır. Işık doğrudan, eğrisiz sekiz bitle yazılsaydı, beyazın yüzde birinden daha karanlık bütün tonlar için yalnız üç kod kalırdı: 0, 1 ve 2. sRGB eğrisiyle aynı karanlık bölgeye yirmi altı kod düşer. Eğrisiz yazımda 0'dan 1'e geçiş L* ölçeğinde yaklaşık 3,5 birimlik bir sıçramadır ve göz bunu bir basamak olarak görür; sRGB'de ilk adım yalnız yaklaşık 0,3 birimdir. Parlak bölgede tersi olur: yüzde elli ile seksen arası parlaklığa eğrisiz yazım yetmiş yedi, sRGB ise kırk dört kod ayırır. Ama orada göz farkları zaten daha kaba algıladığı için bu kayıp görünmez.
Eğri olmasaydı, bir gün batımının koyu bölgelerinde, bir odanın gölgelerinde ya da bir yüzün karanlık kısımlarında belirgin bantlar görülürdü. Gamma kodlaması, sekiz biti gözün en çok ihtiyaç duyduğu yere harcayarak bu bantları büyük ölçüde görünmez kılar. Daha geniş bir parlaklık aralığını taşıyan HDR görüntüler için sekiz bit ve sRGB eğrisi artık yetmez; bu yüzden HDR, on ve daha fazla bitle ve parlak bölgeleri de hesaba katan farklı aktarım eğrileriyle çalışır. Bu eğrilerin ayrıntısı EK-06'nın konusudur.
Bu hesap, koyu tenler için özellikle önemlidir. Koyu bir yanak rengi, #4A2C1D, yaklaşık 0,034 göreli parlaklık taşır. Parlaklığı 0,02 ile 0,05 arasında kalan bu bölgeye sRGB yirmi beş kod ayırırken, eğrisiz yazım yalnız yedi kod ayırırdı. Yani gamma kodlaması, koyu tenli bir yüzün yanağından gölgesine inen geçişe üç buçuk kat daha fazla basamak verir. Koyu tenlerin sekiz bitlik görüntülerde ayrıntılı ve yumuşak görünebilmesi, büyük ölçüde bu eğri sayesindedir.
Eğrinin bedeli: yanlış hesap
Gamma kodlaması saklamak için idealdir, ama hesap için tuzaktır. Işıkla ilgili her işlem, iki rengi karıştırmak, bir görüntüyü bulanıklaştırmak ya da küçültmek, iki ışık miktarının ortalamasını almak demektir. Bu ortalama kodlanmış değerlerle alınırsa yanlış çıkar.
En basit örnek, siyah ile beyaz arasındaki bir kenarın bulanıklaştırılmasıdır. Kenarın ortasındaki piksel, iki tarafın ışığının ortalaması, yani beyazın yarısı olmalıdır; bu 188'dir. Kodlanmış değerlerin ortalaması alınırsa sonuç 128 olur ve yüzde 21,6 parlaklık verir: kenar olması gerekenden koyu bir geçiş kazanır. Kırmızı ile yeşilin karışımı daha çarpıcıdır: kodlanmış değerlerle ortalama alınırsa rgb(128, 128, 0) çıkar, göreli parlaklığı yaklaşık 0,20 olan koyu bir haki; doğrusal ışıkta ortalama alınırsa rgb(188, 188, 0) çıkar, parlaklığı yaklaşık 0,47 olan canlı bir sarı. İki kırmızı ve yeşil ışık üst üste düşürüldüğünde gözün gördüğü şey ikincisidir.
Web'in renk belirtimi de bu ayrımı yapar. CSS Color 4'e göre renkli ışıkların fiziksel karışımı isteniyorsa CIE XYZ, doğrusal P3 ya da doğrusal sRGB gibi ışık yoğunluğunda doğrusal uzaylar uygundur; algısal olarak eşit aralıklı bir geçiş isteniyorsa Oklab; eski web içeriğiyle uyumluluk en önemli kaygıysa sRGB seçilir, ama sRGB ne ışıkta doğrusal ne de algıda düzgün olduğu için fazla koyu ya da grileşmiş karışımlar verir.
Bu bölümde iki ayrı doğrunun yan yana durduğuna dikkat etmek gerekir. Işık karıştırılıyorsa, örneğin bulanıklaştırmada ya da iki fotoğrafın üst üste bindirilmesinde, doğru olan doğrusal uzaydır. Bir tasarım için göze eşit aralıklı bir geçiş isteniyorsa, doğru olan algısal uzaydır; UX-09'da oklch() ile kurulan skalalar bu ikinci amaca hizmet ediyordu. Hatalı olan, ikisinin de yerine kodlanmış sRGB değerleriyle hesap yapmaktır.
Kendi ekranınızda sınayın
Bu dersin iddiası, evde yapılabilecek bir deneyle sınanabilir. Bir görüntü düzenleyicide ya da basit bir web sayfasında üç kare hazırlayın. Birincisini tek piksellik siyah ve beyaz karelerden oluşan bir dama tahtasıyla doldurun. İkincisini düz rgb(128, 128, 128), üçüncüsünü düz rgb(188, 188, 188) ile boyayın. Ekranın ölçeklendirmesi kapalıyken, yani görüntü piksel piksel gösterilirken, bir iki metre geriye çekilip gözlerinizi kısın.
Dama tahtası, siyah piksellerin hiç, beyazların tam ışık verdiği bir yüzeydir; uzaktan göz bu ikisini karıştırır ve beyazın tam yarısı kadar ışık görür. Doğrusal ışık hesabına göre dama tahtası, 188 karesiyle aynı miktarda ışık yayar; bu yüzden uzaktan 188'e çok daha yakın görünmesi, 128 karesinin ise yanında belirgin biçimde koyu kalması beklenir. Ekranın ayarları, parlaklığı ve alt piksel dizilimi sonucu biraz kaydırabilir, ama yön değişmez.
Aynı deney bir tasarım aracının karıştırma davranışını sınamak için de kullanılabilir. Siyah ile beyazı yüzde elli saydamlıkla üst üste koyun ve sonucun değerine bakın. Araç 128 veriyorsa kodlanmış değerlerle, 188'e yakın bir değer veriyorsa doğrusal ışıkta karıştırıyordur. Bir araç hızlı ve eski dosyalarla uyumlu olduğu için ilk yolu varsayılan yapabilir ve doğrusal karıştırmayı ayrı bir ayar olarak sunabilir; hangi ayarın açık olduğunu bilmek, bir kompozisyonun gölgelerinin neden beklenenden koyu çıktığını anlamanın ilk adımıdır.
Örnek — portre küçültmedeki koyu hale
Bir web sitesi, kullanıcıların yüklediği portre fotoğraflarını küçük profil resimlerine dönüştürüyor. Fotoğrafların çoğu açık renkli bir duvarın önünde çekilmiş. Küçültme işlemi, komşu piksellerin kodlanmış değerlerinin ortalamasını alan basit bir yöntemle yapılıyor.
Kullanıcılardan biri, profil resminde yüzünün çevresinde koyu, kirli görünen bir çizgi oluştuğunu söylüyor; başka bir kullanıcı böyle bir şey fark etmemiş. Hesap farkı açıklıyor. Yanak rengi #4A2C1D olan bir yüz ile beyaz duvarın arasındaki kenarda, kodlanmış değerlerin ortalaması #A4968E'dir ve göreli parlaklığı yaklaşık 0,32'dir; doğrusal ışıkta alınan ortalama ise #C1BEBD'dir ve parlaklığı yaklaşık 0,52'dir. Kenar pikseli olması gerekenden belirgin biçimde koyu çıkar ve yüzün çevresinde koyu bir hale belirir. Yanağı #F1C7A9 tonunda olan bir yüzün aynı duvarla kenarında ise iki hesap neredeyse aynı sonucu verir: 0,80'e karşı 0,81. Yani aynı yazılım hatası, koyu tenli kullanıcının fotoğrafını görünür biçimde bozarken açık tenli kullanıcınınkini neredeyse hiç etkilemiyor.
Ekip küçültmeyi doğrusal uzayda yapacak biçimde değiştiriyor: pikseller önce doğrusal ışığa çevriliyor, ortalama orada alınıyor, sonuç yeniden sRGB'ye kodlanıyor. Değişikliğin ardından ekip, tenleri en açıktan en koyuya uzanan kişilerin, açık ve koyu duvarlar önünde çekilmiş fotoğraflarından bir deneme seti hazırlıyor ve küçültülmüş profil resimlerini büyütülmüş olarak, kenarlara odaklanarak karşılaştırıyor.
Sık yapılan yanlış
Yaygın yanlış"128, beyazın yarısıdır." sRGB'de 128 yaklaşık yüzde 21,6 parlaklık verir; beyazın yarı parlaklığı yaklaşık 188'dir.
128'in «orta» görünmesinin nedeni fiziksel değil algısaldır: L* değeri yaklaşık 54'tür.
Yaygın yanlış"Gamma eski katot ışınlı ekranlardan kalma bir kusurdur, bugün gereksizdir."
Gamma kodlaması sınırlı kodu gözün en duyarlı olduğu karanlık tonlara dağıtır; sekiz bitte eğrisiz yazım, yüzde birden karanlık bütün tonlara yalnız üç kod bırakırdı ve koyu bölgelerde, koyu tenlerde de, görünür bantlar oluşurdu.
Özet
- sRGB değerleri doğrusal ışığı değil, bir aktarım eğrisinden geçmiş hâlini yazar; 128 yaklaşık yüzde 21,6 parlaklıktır, beyazın yarısı 188 civarıdır, ama 128'in algısal açıklığı L* yaklaşık 54 ile ortaya yakındır.
- Eğri, gözün karanlık tonlardaki farklara daha duyarlı olmasına uyar ve sekiz biti karanlığa daha cömert dağıtır; yüzde birden karanlık tonlara eğrisiz yazım üç, sRGB yirmi altı kod ayırır ve koyu tenlerin bulunduğu bölge üç buçuk kat daha fazla basamak kazanır.
- Karıştırma, bulanıklaştırma ve ölçekleme doğrusal ışıkta yapılmalıdır; kodlanmış değerlerle yapılan hesap geçişleri koyulaştırır ve koyu ten ile açık zemin arasındaki kenarlarda görünür koyu haleler bırakır.
Kendini sına
- (Kolay) sRGB'de 128 değeri beyazın yaklaşık yüzde kaçı kadar parlaklık verir?
- (Kolay) Beyazın yarı parlaklığı sRGB'de yaklaşık hangi değere karşılık gelir?
- (Orta) 128 değeri neden beyazın yarı parlaklığı değildir?
- (Orta) Gamma kodlaması sekiz bitlik bir görüntüde kodları nasıl dağıtır ve neden?
- (Zor) Kırmızı ile yeşilin kodlanmış değerlerle ortalaması neden koyu bir haki, doğrusal ışıkta ortalaması neden canlı bir sarı verir?
- (Zor) Portre küçültmedeki koyu hale neden koyu tenli kullanıcıların fotoğraflarında belirgin, açık tenlilerinkinde neredeyse görünmezdir?
Cevaplar
- Yaklaşık yüzde 21,6 («128 neden yarı değil»).
- Yaklaşık 188 («128 neden yarı değil»).
- sRGB değerleri ışığı doğrudan değil, aktarım eğrisinden geçmiş hâliyle yazar; 128 eğriden geri çevrilince 0,216 doğrusal ışık verir. 128'in göze orta görünmesi algısaldır: gözün açıklık algısı parlaklığın küp köküne yakın bir eğri izler ve 128'in L* değeri yaklaşık 54'tür («128 neden yarı değil», «Göz karanlığa daha duyarlıdır»).
- Kodları karanlık tonlara daha sık, parlak tonlara daha seyrek dağıtır, çünkü göz karanlıktaki küçük farklara daha duyarlıdır. Yüzde birden karanlık tonlara eğrisiz yazım üç, sRGB yirmi altı kod ayırır; parlak bölgede eğrisiz yazımın fazladan ayırdığı kodların kaybı gözle görülmez («Kodların ekonomisi»).
- Kodlanmış değerlerin ortalaması rgb(128, 128, 0) verir ve bu yaklaşık 0,20 parlaklıktır; iki ışığın gerçek karışımı doğrusal ışıkta alınan ortalamadır, rgb(188, 188, 0), yaklaşık 0,47 parlaklık. Göz iki ışık üst üste düştüğünde ikincisini görür («Eğrinin bedeli: yanlış hesap»).
- Hatanın büyüklüğü kenarın iki tarafı arasındaki parlaklık farkına bağlıdır. #4A2C1D ile beyaz arasındaki kenarda kodlanmış ortalama yaklaşık 0,32, doğrusal ortalama 0,52 parlaklık verir ve kenar belirgin biçimde koyulaşır; #F1C7A9 ile beyaz arasında iki hesap 0,80 ve 0,81 ile neredeyse aynıdır. Çözüm, küçültmeyi doğrusal ışıkta yapmak ve sonucu farklı tenlerden bir fotoğraf setiyle sınamaktır («Örnek — portre küçültmedeki koyu hale»).
Kaynaklar
- IEC 61966-2-1:1999, «Multimedia systems and equipment — Colour measurement and management — Part 2-1: Colour management — Default RGB colour space — sRGB».
- W3C, «Web Content Accessibility Guidelines (WCAG) 2.2», relative luminance tanımı.
- W3C, «CSS Color Module Level 4», Color Space for Interpolation bölümü.
- CIE 015:2018, «Colorimetry», 4. baskı.
- Charles Poynton, «Digital Video and HD: Algorithms and Interfaces», 2. baskı, Morgan Kaufmann (Elsevier), 2012.
Sonraki adım
EK-08 ışıktan mürekkebe geçiyor: dört mürekkepli baskıda siyahın neden camgöbeği, macenta ve sarının karışımıyla değil ayrı bir mürekkeple basıldığını ve kâğıdın gamının ekranınkinden neden bu kadar dar kaldığını anlatıyor. EK-09 ise dört mürekkebin yetmediği yere bakıyor: metalik ve floresan mürekkepleri, bir kurum renginin tek kalıpta, önceden karıştırılmış mürekkeple basılmasının ne zaman gerektiğini ve bunun maliyetini tartışıyor.