STAF Projekt

PIXELHIBÁK FELMÉRÉSE ÉS KORREKCIÓJA

 

A csillagászati felvételek ’alapzaját’ a digitális képérzékelő pixel hibái, ill. az elektronikus zaj okozza. Amennyiben a kép tömörített formában (JPG) kerül tárolásra, abban az esetben az előbbiekhez hozzájárul, ill. rá rakódik egy ’hömpölygő’ alapzaj, ami a tömörítő algoritmus által keltett alapzaj.

Jelen írásomban a kamerák érzékelőin fellelhető pixelhibák feltérképezésével ill. korrigálásuk módszereivel foglalkozom.

Ezen túlmenően az égbolt alapfénylésének kiküszöbölésére tett ujszerű kisérlet eddigi tapasztalatait is felvázolom. (Lásd: NylonFlat)

 

 

A PIXELHIBÁK ELMÉLETE

 

A pixel hibákról itt olvashatsz: http://pixinfo.com/cikkek/erzekelok9/

 

A cikk az alábbi teszt program alapján készült és itt letölthető : Illeszt.Exe

A program részletes használata futtatás során a ? gombbal jeleníthető meg.

 

A digitális fényképezőgépek CCD/CMOS érzékelőin számos pixel hiba fordulhat elő.

Alapvetően 3 tipusát különböztetjük meg:

 

  1. Dead pixel      : halott pixel
  2. Stuck pixel     : beégett pixel
  3. Hot pixel        : forró pixel

Az első két pixelhiba minden felvételen ugyanazon a helyen jelentkezik.

Dead pixel, vagy halott pixel, azt jelenti, hogy az adott pixel érzéketlen a fényre, azaz fekete pontként jelentkezik. Flat field (egyenletesen megvilágított) felvételeken érzékelhető.

Ilyen világos képeket készíthetünk az egyenletesen megvilágított felületekről életlenre állított objektívvel vagy objektív nélkül.

 

Stuck pixel, vagy beégett pixel általában fehér, azaz maximális intenzitáson beragadt pixel.

Dark Frame-en (sötétkép) jelentkeznek. Sötét képet úgy kaphatunk, ha letakart objektívvel – ügyelve, hogy az optikai kereső lencséjét is letakarjuk – ugyanolyan feltételek mellett (azonos ISO érzékenység, expozíciós idő és hőmérséklet) készítünk felvételeket.

 

Hot pixel, avagy forró pixel. Az előbbi két állandósult pixelhibával ellentétben ez utóbbi hőmérséklet függő. Általában a környezetétől melegebb pixeleknél jelentkezik, mert ezek gyorsabban telítésbe vihetők. Kék, vörös vagy zöld színűek. JPG képeken egy ovális színes folt formájában mutatkoznak. Mint általában a gépzaj, a forró pixelek előfordulási gyakorisága is csökkenthető az érzékelő hűtésével.


GYAKORLATI TAPASZTALATOK

 

Vegyünk egy dark frame-et (sötétkép) és megfelelő programmal (ImgTest) kinagyítva vizsgáljuk meg részletesen.

 

 

 

Stuck pixel

Hot pixel

Dead pixel

 

Ezek a hibák rendszerint egy diszkrét pixelt érintenek, amit a JPG tömörítés a szomszédos pixelekre is szétkeni. Ilyen értelemben is érdemesebb natív formátumú, tömörítetlen raw (CR2)  képeket készíteni és azokon elvégezni a korrekciót.

Az amatőr csillagászok többsége azonban megelégszik a kisebb helyigényű jpeg felvételekkel. Ezért összpontosítsunk most az ilyen képekkel nyert tapasztalatokra.

 

Ha tüzetesen megvizsgáljuk a sötétkép normálisan működő pixeleit, akkor azt tapasztaljuk, hogy alig akad közöttük olyan, melynek értéke 0, azaz mindhárom színcsatornában fekete.

Általában kis értékeket mutatnak: R=1, G=4; B=2, de általában 5-ös érték alatt maradnak és a tapasztalat szerint a G zöld csatornában mutatnak maximumot. Ez az elektronikus alapzaj a képkiolvasás utáni maradvány töltésektől és a hőmérséklettől függő termikus atommozgásokból származik. Számunkra mégsem jelentősek, mert egy nagyságrenddel nagyobb zaj is terheli a kész asztrofotókat, mégpedig az égbolt háttér fénylése.

A  később tárgyalandó háttérzaj levonása során ezt az alacsony intenzítású tartományt egyébként is el fogjuk távolítani, így nem érdemes foglalkoznunk vele a továbbiakban.

 


KÜLÖNBÖZŐ ÉRZÉKELŐK ÖSSZEHASONLÍTÁSA

 

Vizsgálataink során két kamerát hasonlítottam össze: egy régebbi Canon EOS 30D-t (kb 8 MPixel) és egy újabb Canon EOS 400D-t (10.2 MPixel).

Már az elején sejthető, hogy a régebbi model zajosabb lesz mint ifjabb testvére. Ennek számos oka lehet: a gyártástechnológia fejlődése és az a tapasztalati tény is, hogy az érzékelők öregedésével arányosan egyre több pixelhiba keletkezhet rajtuk.

 

A vizsgálathoz és az összehasonlításhoz minden esetben egy HighPass szűrőt alkalmaztam a képekre. Ez a grafikus szűrő úgy működik, hogy az előre megadott intenzitás érték alatti képpontokat feketének (0), a fölötte lévőket pedig fehérnek (255) tekinti. Magyarán, egy 1 bites színmélységű képhez hasonlót kreálunk, amin minden pixel, vagy fehér, vagy fekete.

Egy ilyen képen végigfuttatva az automatikus csillag érzékelő (StarDetect) rutint a fényes területeket csillagokként érzékelve, meghatározhatjuk a kényes területek számát.

Ezen ’műcsillagok’ száma egy összemérhető konkrét értéket eredményez.

 

 

 

Canon EOS 300D – ISO 400, EXP: 60 sec.

 

 

HighPass = 100; Star = 14

 

 

HighPass = 50; Star = 114

 

 

HighPass = 25; Star = 607

 

 

HighPass = 10; Star = 1702

 

 


Canon EOS 400D – ISO 1600, EXP: 30 sec.

 

 

HighPass = 51..200; Star = 0

 

 

HighPass = 50; Star = 4

 

 

HighPass = 25; Star = 453

 

 

HighPass = 10; Star = 21660

 

 


A HIBÁS PIXELEK ELTÁVOLÍTÁSA

 

 

Első lépésben a Stuck pixelhibák eliminálására dolgoztam ki egy egyszerű algoritmust.

 

 

A tapasztalat azt mutatja, hogy a beégett pixel egy x alak középpontjában helyezkedik el.

A középső kiemelkedően magas intenzítású pixelt átlók irányában 4 közepes intenzitású társpixel, ill. 4 db, a környezeténél alacsonyabb intenzitású sötét pixel veszi körül.

Ez az elrendezés kisebb nagyításban a jellegzetes x alakot eredményezi.

 

 

 

 

 

Az algoritmus lényege a következő.

 

Olyan pixeleket kell keresnünk, melyeknek intenzitása a megelőző ill. következő pixelekhez képest nagyobb mint egy előre megadott differencia (difference): 15-30.

 

Egyszerre mindig 3 sort szkennelünk a képből, de csak a középső sort elemezzük.

 

Ha találtunk ilyen magányos, kimagasló értékű pixelt, akkor a környezetében lévő pixelekkel összeátlagoljuk és mind a 9 peixel ezt az uj átlagos intenzitást veszi fel. Bestoppoljuk a zavar helyét.

 

A fügvény  Threshold  paramétere, egy intenzitási küszöbérték 0..255 intervallumban. Megmutatja, hogy mely küszöbérétk fölötti intenzítású pixelekre kell a javítást végezni.

Értékét célszerű a felvétel alapzaj szintjének közelében megállapítani: 10-50;

 

A hibás pixelek eltüntetése után az alapzaj szinttel egyébként is korrigálni kell a képet, ami a gyakorlatban annyit tesz, hogy a küszöbérték alatti intenzítású pixelek 0 (fekete) értéket kapnak. Ily módon a felvételeken végig hömpölygő alapzaj mintázat eltűnik.

           
function FixStuckPixels(Bitmap: TBitmap; Threshold: byte; difference: byte): integer;

// Result = Count of stuck pixels

VAR

  I, j  :  INTEGER;

  x,y    :  integer;

  Row       :  array[0..2] of pPixelArray;

  prevPixel : TRGBTriple;        // Previous pixel RGB

  nextPixel : TRGBTriple;        // Previous pixel RGB

  avgR, avgG, avgB  : integer;   // Average  pixel RGB

begin

TRY

  Result := 0;

  Bitmap.PixelFormat := pf24bit;

  Row[0] := Bitmap.Scanline[0];

  Row[1] := Bitmap.Scanline[1];

  FOR j := 2 TO Bitmap.Height-3 DO

  BEGIN

    Row[2] := Bitmap.Scanline[j];

    prevPixel := ChangeRGBColor(prevPixel,0,0,0);

    FOR i := 1 TO Bitmap.Width-2 DO

    BEGIN

      nextPixel := Row[1][i+1];

      WITH Row[1][i] DO

      BEGIN

      // Only the very high pixels

      if ((Row[1][i].rgbtGreen-prevPixel.rgbtGreen)>difference) and

         ((Row[1][i].rgbtGreen-nextPixel.rgbtGreen)>difference)

      then

      begin

        if ((rgbtRed+rgbtGreen+rgbtBlue) div 3)>Threshold then

        begin

           // Stuck pixel R,G,B are about equal between 20 difference

             // 3x3 matrix RGB average around the stuck pixel

             avgR := 0; avgG := 0; avgB := 0;

             for y:=0 to 2 do

                 for x:=-1 to 1 do

                 begin

                   avgR := avgR + Row[y][x+i].rgbtRed;

                   avgG := avgG + Row[y][x+i].rgbtGreen;

                   avgB := avgB + Row[y][x+i].rgbtBlue;

                 end;

 

             avgR := avgR div 9;

             avgG := avgG div 9;

             avgB := avgB div 9;

 

             for y:=0 to 2 do

                 for x:=-1 to 1 do

                 begin

                   Row[y][x+i].rgbtRed := avgR;

                   Row[y][x+i].rgbtGreen := avgG;

                   Row[y][x+i].rgbtBlue := avgB;

                 end;

 

 

             Inc(Result);

        end;

      end;

      END;

      prevPixel := Row[1][i];

    END;

    Row[0] := Row[1];

    Row[1] := Row[2];

  END;

FINALLY

END

end;


EREDMÉNY

 

Nyers JPG kép sok beégett pixellel

A pixelhibák korrigálása után

Nyers JPG kép sok beégett pixellel

A pixelhibák korrigálása után




SÖTÉTKÉP LEVONÁS

 

Az asztrofotóval azonos paraméterekkel (ISO, exp.idő, hőmérséklet) készíteni kell egy vagy több sötétképet. (Dark Frame). A sötétkép úgy készül, hogy a fényképezőgép optikájára felteszük a védősapkát és exponálunk.

Ezen a sötét képen a CCD/CMOS összes hibája, (elektronikus és kiolvasási zaj, szemét) rajta lesz, ami a normál asztrofotókat is terheli. Ettől, a számunkra fölösleges zajtól könnyedén meg lehet szabadulni, ha az asztrofotónkból kivonjuk a sötétképet.

 

Lásd: a fenti képeket.

 

// Dark Frame Substaction from Src : Result = Src

function SubtractDark(SrcBitmap, DarkBitmap: TBitmap): boolean;

Var

  i  :  INTEGER;

  j  :  INTEGER;

  w,h:  integer;

  sRow :  pPixelArray;

  dRow :  pPixelArray;

begin

Try

  Result := True;

  SrcBitmap.PixelFormat  := pf24bit;

  DarkBitmap.PixelFormat := pf24bit;

  if DarkBitmap.Width<SrcBitmap.Width then w:=DarkBitmap.Width

     else w:=SrcBitmap.Width;

  if DarkBitmap.Height<SrcBitmap.Height then h:=DarkBitmap.Height

     else h:=SrcBitmap.Height;

  FOR j := 0 TO h-1 DO

  BEGIN

    sRow := SrcBitmap.Scanline[j];

    dRow := DarkBitmap.Scanline[j];

    FOR i := 0 TO w-1 DO

    BEGIN

      sRow[i].rgbtRed   := IntToByte(sRow[i].rgbtRed - dRow[i].rgbtRed);

      sRow[i].rgbtGreen := IntToByte(sRow[i].rgbtGreen - dRow[i].rgbtGreen);

      sRow[i].rgbtBlue  := IntToByte(sRow[i].rgbtBlue - dRow[i].rgbtBlue);

    END;

  END;

except

  Result := False;

end;

end;

 

SÖTÉTKÉP LEVONÁS ELTÜNTETI A HOT PIXELEKET

Ereseti kép részlet

Forró pixelek (Stuck) levonás után

Sötétkép levonás (2-szer) után


NYLONFLAT MÓDSZER

 

Ezzel a saját ötletből származó módszerrel két legyet szeretnék ütni egy csapásra: sötétkép és flat kép levonást, valamint, reményeim szerint, az égbolt aktuális területének háttér fényességének az egyidejű levonását.

 

A NylonFlat kép úgy készül, hogy az égbolt alatt, a távcső elejére egy áttetsző nylon zacskót húzunk és az eredetivel azonos paraméterekkel, ugyanazon területről készítünk egy uj expozíciót. Lényeges, hogy ugyanazon területről, mert az égbolt háttér fényessége változó:

függ a környéken lévő fényforrások elhelyezkedésétől valamint a zenit távolságtól is.

A későbbiekben majd a matt nylonből egy – az objektívvel közel azonos kört kell kivágnom és egy gyűrű vagy kosárszerű kiképzéssel a cső elejébe kell tolnom, hogy a zavaró oldalfények hatását kiküszöbölhessem.

 

Nyilvánvaló, hogy ezen a nylonflat felvételen a sötétkép minden hibája rajta lesz, valamint a világos háttér miatt a flat képeken mutatkozó vignettálás ill. az optikai rendszerben lévő szennyződések nyomai. Sőt pluszban az adott égterület zavaró háttér fényességének nyoma, ami egyfajta színes maszkként működik.

 

Nálam az égbolt vöröses, narancssárgás szinű, a közelben lévő Na lámpák fényének a levegőben lévő párákon való szóródása miatt.  Korábban a háttér fénylés eltávolítására alkalmazott módszerem (AutomaticThresholdElimination az RGB színcsatornákban átlagos háttér értékeket kalkulált és azt levonta a felvétel minden pixeléből) nem igazán a várt eredményt produkálta, mert a felvételen lévő reális objektumok is befolyásolták az átlag képzést. Ráadásul nem vette figyelembe a pixel hibákat, vignettációt, koszokat az optikai rendszerben.

A nylonflat módszer úgy tűnik mind ezeket egyszerre megoldhatja.

 

De, nézzük az első tesztek eredményét, ami számomra lélegzet elállítóan szép eredményeket hozott.


 

  1. NYLONFLAT felvétel



  2. NYERS FELVÉTEL




  3. NYLONFLAT KIVONÁS UTÁN

 

 

A tapasztalat azt mutatja, hogy a felvétel értékes információi láthatóan nem módosulnak jelentős mértékben – még a nagyon halvány csillagokból is alig veszítünk – viszont a háttértől drasztikus mértékben megszabadultunk. Sőt, feltételezem, hogy a JPG tömörítés okozta hömpölygő háttér egyenetlenséget is korrigálja jó hatásfokkal.



 

A módszerek tökéletesítésén tovább dolgozom. Fő cél, hogy asztrofotóinkat megszabadítsuk a fölösleges redundanciáktól, zavaró jelektől, mindazon képrészletekről, melyek esztétikai és tudományos értelemben is befolyásolják képeink minőségét.

Mindeközben olyan eljárásokat kell kidolgozni, melyek a képek objektivitását nem torzítják kiszámíthatatlan módon.

 

AGÓCS LÁSZLÓ – Stella_209

Ózd

2010-01-25