
RGB dəyərlərini 255-ə, yoxsa 256-ya görə normallaşdırmaq lazımdır?
Qrafika proqramçısı Pekka Vyaanyanen 8 bitlik RGB dəyərlərini sürüşən nöqtəli ədədlərə çevirib geri qaytarmağın iki geniş yayılmış yolunu araşdırır və 255-ə bölmənin nə vaxt doğru olduğunu, 256-ya bölmənin nə vaxt əsaslandırıla biləcəyini izah edir.
8 bitlik rəng dəyərlərini sürüşən nöqtəli ədədlərə çevirib geri qaytarmaq istənilən şəkil emalı proqramının ilk qərarlarından biridir və burada iki yanaşma var. Qrafika proqramçısı Pekka Vyaanyanen 30fps.net bloqunda bu sualın təhlilini dərc edib və yazıda standart 255-ə bölmə ilə 0,5 əlavə edib 256-ya bölən alternativi müqayisə edir.
İki düstur
Standart yanaşma pikselləri img / 255.0 ilə çevirir və trunc(result * 255 + 0.5) ilə geri yazır: 0 tam ədədi 0.0-a, 255 isə 1.0-a uyğun gəlir — GPU-ların işarəsiz normallaşdırılmış formatlar üçün istifadə etdiyi qaydanın eynisi. Alternativ çevirmə üçün (img + 0.5) / 256.0, yazma üçün isə trunc(result * 256) istifadə edir; beləliklə hər sürüşən nöqtəli dəyər iki tam ədədin tam ortasına düşür.
Alternativin praktik qiyməti qaranın artıq 0.0 olmamasıdır: 0 tam ədədi 0.001953125 kimi açılır, ona görə qara pikseli aşkarlamaq istəyən kod bu sabiti bilməli və 8 bitlik aralığa bağlanmalıdır. Müəllif qeyd edir ki, standart düsturla şəkil itkisiz geri qayıdır və onun qeyri-dəqiqliyi — 128/255 təxminən 0.501961-dir — ən kiçik bitdə qalır, nisbi xəta isə təxminən 0.00001 faizdir.
Kənarlarda yarı genişlikdə səbətlər
Standart düsturun zəifliyi kənarlarda görünür. Sürüşən nöqtəli aralığı [0, 1]-dən bir qədər geniş olduğundan 0-a və 255-ə yuvarlaqlaşan səbətlər digərlərindən iki dəfə dar olur, buna görə bərabər paylanmış küy kənar dəyərləri iki dəfə az tezlikdə yaradır. Yazı bunu bir milyon təsadüfi dəyərlə histoqramda göstərir və sonra bunun nadir hallarda əhəmiyyətli olduğunu əsaslandırır: aralıqdan bir qədər kənarda olan dəyərlər yenə düzgün tam ədədə yuvarlaqlaşır və qaradan 0.005 çıxmaq hər iki sxemdə 0 ilə bitir.
Kvantlaşdırma nəzəriyyəsinin dilində bunlar 255 səviyyəli mid-riser və 256 səviyyəli mid-tread kvantlaşdırıcılardır. Bərpa xətası 256-ya bölmədə bir qədər aşağıdır — orta mütləq xəta 1/1024-ə qarşı 1/1020 — lakin yalnız eyni kodun həm kodlaşdırmanı, həm də açmanı idarə etdiyi halda. Başqalarının şəkillərini alternativ miqyasla yükləmək nəzəri olaraq yanlış açmadır və iki kvantlaşdırıcını qarışdırır.
Nə etməli
Nəticə qəsdən praktikdir: özünüz yaratmadığınız şəkilləri emal edirsinizsə, 255-ə görə normallaşdırın. 256-ya bölmə o halda əsaslandırıla bilər ki, həm yadda saxlamağa, həm də yükləməyə siz nəzarət edirsiniz, sıfırın sıfıra uyğunlaşmasına ehtiyacınız yoxdur və emal kodunu 8 bitlik aralığa bağlamağı qəbul edirsiniz. Yazıda həmçinin Chris Lomontun sonrakı 'ən yaxşı metodu' müzakirə olunur: k/255.0 ilə açan və clamp(floor(x * 256), 0, 255) ilə kodlaşdıran bu metod tam aralığı və bərabər səbətləri saxlayır, əvəzində kvantlaşdırma xətası kənarlarda zirvəyə çataraq təxminən iki dəfə artır.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.