უკან დაბრუნება

უნდა ნორმალიზდეს RGB მნიშვნელობები 255-ზე თუ 256-ზე?
SiTech AI Team2 წთ. საკითხავი

უნდა ნორმალიზდეს RGB მნიშვნელობები 255-ზე თუ 256-ზე?

გრაფიკის პროგრამისტმა პეკა ვიანიანენმა 30fps.net-ზე გააანალიზა, როგორ უნდა გადავიყვანოთ 8-ბიტიანი RGB მნიშვნელობები მცურავ წერტილში: სტანდარტული 255-ზე გაყოფა თუ 0,5-ის მიმატებით 256-ზე გაყოფა — და როდის აქვს ალტერნატივას აზრი.

8-ბიტიანი ფერების მცურავ წერტილში გადაყვანა და უკან დაბრუნება სურათების დამუშავების ნებისმიერი პროგრამის ერთ-ერთი პირველი გადაწყვეტილებაა და აქ ორი მიდგომა არსებობს. გრაფიკის პროგრამისტმა პეკა ვიანიანენმა ბლოგზე 30fps.net ამ კითხვის ანალიზი გამოაქვეყნა, სადაც სტანდარტულ 255-ზე გაყოფას ალტერნატივა — 0,5-ის მიმატება და 256-ზე გაყოფა — ადარებს.

ორი ფორმულა

სტანდარტული მიდგომა პიქსელებს img / 255.0-ით გარდაქმნის და უკან trunc(result * 255 + 0.5)-ით წერს: მთელი რიცხვი 0 გადადის 0.0-ში, 255 კი 1.0-ში — ზუსტად იმ პრინციპით, რომელსაც GPU-ები უნიშნავი ნორმალიზებული ფორმატებისთვის იყენებენ. ალტერნატივა (img + 0.5) / 256.0-ით გარდაქმნის და trunc(result * 256)-ით წერს, რითაც ყოველი მცურავი მნიშვნელობა ზუსტად ორ მთელ რიცხვს შორის შუაში ხვდება.

ალტერნატივის პრაქტიკული ფასი ისაა, რომ შავი აღარ არის 0.0: მთელი რიცხვი 0 დეკოდირდება როგორც 0.001953125, ამიტომ შავი პიქსელის ამოსაცნობად კოდმა ეს მუდმივა უნდა იცოდეს — ლოგიკა 8-ბიტიან დიაპაზონს მიეკრას. ავტორი აღნიშნავს, რომ სურათი სტანდარტული ფორმულით დანაკარგების გარეშე ბრუნდება უკან, ხოლო მისი უზუსტობა — 128/255 არის დაახლოებით 0.501961 — უმცირეს თანრიგში რჩება, ფარდობითი შეცდომით დაახლოებით 0.00001 პროცენტი.

ნახევრად ვიწრო კალათები კიდეებზე

სტანდარტული ფორმულის სისუსტე კიდეებზე ჩანს. ვინაიდან მისი მცურავი დიაპაზონი [0, 1]-ზე ოდნავ განიერია, 0-ზე და 255-ზე დამრგვალებული კალათები დანარჩენებზე ორჯერ ვიწროა, ამიტომ თანაბრად განაწილებული ხმაური კიდურ მნიშვნელობებს ორჯერ ნაკლებად ხშირად წარმოქმნის. პოსტი ამას მილიონი შემთხვევითი მნიშვნელობის ჰისტოგრამით აჩვენებს და შემდეგ ამტკიცებს, რომ ამას იშვიათად აქვს მნიშვნელობა: დიაპაზონს ოდნავ გარეთ მყოფი მნიშვნელობები მაინც სწორ მთელ რიცხვზე მრგვალდება, ხოლო 0.005-ის გამოკლება შავს ორივე სქემაში 0-ზე აჩერებს.

კვანტიზაციის თეორიის თვალსაზრისით ეს ორი ვარიანტია mid-riser კვანტიზატორი 255 დონით და mid-tread კვანტიზატორი 256 დონით. რეკონსტრუქციის შეცდომა 256-ზე გაყოფისას ოდნავ ნაკლებია — საშუალო აბსოლუტური შეცდომა 1/1024 1/1020-ის წინააღმდეგ — მაგრამ მხოლოდ მაშინ, როცა კოდირებასაც და დეკოდირებასაც ერთი და იგივე კოდი აკონტროლებს. სხვისი სურათების ალტერნატიული მასშტაბით ჩატვირთვა თეორიულად არასწორი დეკოდირებაა და ორ კვანტიზატორს ურევს.

რა უნდა გააკეთო

დასკვნა განზრახ პრაქტიკულია: თუ სხვის მიერ შექმნილ სურათებს ამუშავებ, ნორმალიზაცია 255-ზე გააკეთე. 256-ზე გაყოფა გამართლებულია მაშინ, როცა შენვე აკონტროლებ შენახვასაც და ჩატვირთვასაც, ნულის ნულზე გადასვლა არ გჭირდება და თანახმა ხარ, რომ დამუშავების კოდი 8-ბიტიან დიაპაზონს მიებას. პოსტში ასევე განხილულია კრის ლომონტის მოგვიანო „საუკეთესო მეთოდი“, რომელიც k/255.0-ით დეკოდირებს და clamp(floor(x * 256), 0, 255)-ით კოდირებს, ინარჩუნებს სრულ დიაპაზონს და თანაბარ კალათებს, თუმცა კვანტიზაციის შეცდომა დაახლოებით ორჯერ იზრდება და კიდეებზე პიკს აღწევს.

გააზიარე ციფრული გამოცდილება

SiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.