Dr. Baranyai László, fénykép

Dr. Baranyai László

 

Digitális képek gamma korrekciója

aug 9, 19:08, |

 

Az előző bejegyzésben a szürke transzformáció folyamatába becsempésztem egy nemlineáris korrekciós tényezőt. A szabványos gamma algoritmus azonban kissé másként működik. A megoldáshoz most is a GNU Octave környezetet használtam.

Gamma korrekció

A gamma korrekció V(out) = V(in)γ képlete kissé megtévesztő így önmagában. A transzformáció ugyanis intenzitás értékekre érvényes, amelyek 0-1 tartományban értelmezettek. Mivel a digitális képek intenzitása 0-255 tartományban skálázott (8 bit/csatorna esetben), könnyen belátható, hogy egészen más eredményre juthatunk ezt figyelmen kívül hagyva. Ráadásul a nemes egyszerűséggel gamma értéknek mondott korrekciós tényező legtöbbször a reciproka, tehát a kitevő 1/γ formában lenne teljesen pontos.

A helyzetet tovább bonyolítja, hogy a képeket beolvasás után tároló mátrix a 0-255 tartományt BYTE formátumban rögzíti. A BYTE adattípus egész számokat ismer, a 0 és 1 közötti valós értékek számolás során kerekítve lesznek. A transzformáció tehát a matematikai műveleteken kívül az egész - valós - egész számkonverziót is elvégzi. A GNU Octave rendszerében az egész számok BYTE típusa az unsigned integer azaz uint8, a valós számokhoz pedig a double-t választottam. Ha a számítási sebességet szeretnénk növelni, eleve érdemes a processzorhoz legjobban illeszkedő adattípust választani, pl. a double 32 biten ábrázolt.

A korrekciót elvégző függvény a következő:

%% Gamma transformation of color images
%% RV  = result image matrix
%% img = input image matrix
%% gm  = gamma, default = 1.0
function RV = imggamma(img,gm=1)
 [Height,Width,Layers] = size(img);
 RV = img;
 if (Layers > 0)
  tmp = rand(Height, Width);
  for i = 1:Layers
   tmp = double(img(:,:,i))/255.0;
   RV(:,:,i) = uint8( 255.0*tmp.^gm );
  endfor
 else
  error("No image matrix was found!");
 endif
endfunction

A függvény használata egyszerű:

octave:1> pic = imread("test01.jpg");
octave:2> imshow(pic)

Henryx city teszt kép
Henryx city teszt kép

A γ < 1,0 értékekre sötétebb, γ > 1,0 értékekre világosabb képet ad.

octave:3> imshow( imggamma(pic,1/0.4) )

Teszt kép, gamma = 0.4
Teszt kép, gamma = 0.4

octave:4> imshow( imggamma(pic,1/2.4) )

Teszt kép, gamma = 2.4
Teszt kép, gamma = 2.4

A transzformáció során fokozottan kell figyelni arra, hogy a megjelenítő eszközökhöz hasonló vagy éppen azok hatását visszaállító műveletet akarunk-e elvégezni. A monitorok szoftveres korrekciójának tipikus értéke 1/1.1 és 1/2.5 közötti. A függvény használatához sok sikert és jó szórakozást!