A bajom a következő: JPEG-ban kapott képeket kell valamilyen módon elemeznem. Megy is (jó dolog az OpenCV), de a közelről való megnézés kiderítette, hogy a kapott JPEG képek bizonyos speciális problémákkal küzdenek:
a) Ha a képet felosztom 8x8 pixeles blokkokra, a bal felső sarokban levő 1 pixel mindig kissé, de jl láthatóan halványabb a környezeténél, azaz egy szabályos pontháló vetül a képre.
b) Néhol, de nem mindig ugyanott, vízszintes csíkok jelennek meg a képen, ami első körben egy interlace-elt képhez hasonlít, de nem az. Ez is a 8x8-as blokkokhoz kötődik és a páros-páratlan sorok váltakozó fényességeként mutatkozik meg. Így pl. egy függőleges vonal képe 2-3 pixel amplitudójú rángatózást mutat.
Mivel mindegyik kötődik a 8x8-as blokkokhoz, és tudom, hogy a JPEG ekkora blokkok diszkrét koszinusz transzformáltjainak komponenseivel szórakozik, az a gyanúm, hogy a beérkező képeken itt van elszúrva valami. (Ezt az effektust világosan meg tudom különböztetni attól, amikor egyszerűen csak alacsony minőségi faktorral van lekódolva egy JPEG.)
Kérdésem: Van-e szoftver, ami egy JPEG kép "debuggolásában" segít, azaz kijelzi nekem a belsejében tárolt DCT komponenseket, hogy azokban észrevehessek valami szabályosságot?
Ha ez túl speciális kérdés, akkor bocs, de akkor küldjetek el valahová, ahol ilyen kérdésre lehet választ kapni. (A Google nem segített, vagy rosszul kérdeztem.)
Előre is kösz!
Hozzászólások
http://www.impulseadventure.com/photo/jpeg-snoop.html ez eleg jo tool ahhoz, amit szeretnel, de az oldalon van sok leiras is amivel jobban megertheted a jpeget, sot gyorsan ossze is tudsz dobni egy enkodert/dekodert.
es meglepo modon minimalis jpeg dekodolas a wiresharkban is van (ha eleg kicsi jpeget adsz be neki, de a scant nem dekodolja, szoval neked nem jo)
Kösz. megnéztem. Nem találtam benne olyat, ami most kell nekem, de azért hasznos lesz.
És piros pont neki, mert wine alól is jól megy.
Az options->scan segment->detailed decode->enable detailed decode pipat kapcsold be.
Próbálok visszaemlékezni egyetemi (bemelegítésszintű) tanulmányaimra... Volt képelemzésünk. Ha jól emlékszem, az összes input TIFF volt, veszteségmentesen tárolva. Pontosabban: már maga a képalkotás is veszteséges, ezen külön rontani X vagy Y veszteséges (esetleg szimplán hibás) jpeg-encoder-ével öngól. Garbage in, garbage out; kérj PNG-t vagy hasonlót.
(Bocsánat, hogy nem a kérdésre válaszoltam.)
A libjpeg-gel (ill. a libjpeg-turbo-val) valószínűleg hozzáférsz a DCT együtthatókhoz is: http://www.libjpeg-turbo.org/Documentation/Documentation . Saccra a
-ből kell a
szakasz. A
forrása hasznos lehet.
A GIGO-ban egyetertek, de mondjuk pl. egy tucat digitalis fenykepezogeptol hiaba kerunk PNG-t. Ellenben mintha a szalkezdo lenne az aaphoto szerzoje, igy nala kisse logikus hogy a tucat-JPG-bol indul ki. (Ja, sub egyebkent.)
Csak kérdezősködöm...
Bejön egy JPEG stream, fogom azt dekódolom ARGB-be (tudom, nincs A) és lesz egy halom 24 bites értékem, ami tömörítésmentes adatot tartalmaz. Ezzel az adathalommal dolgozom.
Hol jön itt képbe az általad felvetett probléma ?
A jpeg _veszteséges_ tömörítés. Lásd: http://hu.wikipedia.org/wiki/Vesztes%C3%A9ges_t%C3%B6m%C3%B6r%C3%ADt%C3…
"Hol jön itt képbe az általad felvetett probléma ?"
A hiba jellegéből azt sejtem, hogy a JPEG kódolásakor történt valami hiba a fényképezőgép belsejében. Azért sejtem ezt, mert elvben tudom, milyen egy JPEG belseje és a hiba olyan jellegű, mintha pár DCT komponens lenne elszúrva.
Ha rájönnék, mit is szúrt el a gép, persze akkor sem lehetne tökélesen visszaállítani az eredetit, de jobb szűrőt tudnék tervezni, ami csökkenti a hiba hatását.
Értem, értem, értem... köszi !
Sajnos segíteni nem tudok, de kiváncsi lennék mi a hibás képek forrása. Úgy tudom, hogy a jpeg enkóder fényképezőkben, webkamerákban célcsipben van megvalósítva, és ráadásul még valamiféle "képjavítás" - például élkiemelés - is van bennük. Ezért nem nagyon alkalmas a képük képfeldolgozásra.
A forrás felett nincs kontrollom. Egy digitális fényképezőgép, ami elvben 100%-os minőségű JPEG-et adott ki (ezt jelzik ki minden képelemző progi is), mégis ott vannak ezek a disznóságok a képén. Ezért gondolom, hogy valamit elszúrhatott.
Azt meg tudom, hogy a JPEG nem jó alapanyag a képfeldolgozáshoz, de ez van, ezt kell valahogy kezelnem. Más esetekben, ha van választásom, persze nem JPEG bemenetet szeretek a képfeldolgozáshoz.
Ha a gép egy Canon PowerShot, és hozzá tudsz férni, akkor a CHDK segítségével egy általad előállított képállományt át tudsz nyomni a gép utófeldolgozásán és JPEG tömörítésén, így az eredeti és a tömörített képet összevetheted, ami segítség lehet.
:)
A (b) problémára: mivel ez "lényegében" egy periodikus függvény szemmel látható szuperpozíciója a képre (vagy annak hiánya), azt gondolnám laikusként, hogy a fényképezőgép kódolója hibás; mindig túl magas (vagy túl alacsony) együtthatót rendel valamelyik függőlegesen szapora, vízszintesen ritka bázishoz.
Ebben a szakaszban meg vannak rajzolva a bázisfüggvények:
Valahol a bal szélen lefelé található az a bázis, amelynek az együtthatóját az encoder túl magasra teszi (vagy éppenséggel túl alacsonyra, abszolút értékben).
Érdekes lenne egy ilyen 8x8-as együttható-mátrixot megnézni, amelynek a dekódolt (2D tér) képe a (b) jelenséget mutatja. (Mivel a fényességet írod, azért az Y' csatornát kellene nézni.)
Ad (a): a 2D térben egyetlen pontról van szó (a 8x8-as blokkon). Ez ordenárén nem periodikus, vagyis (ha jól emlékszem) a frekvenciatérben az "összes" bázisnak az együtthatója érintett. Nem lennék meglepve, ha egyedül a bal felső pont fényerejét megemelve az egész DCT mátrix megváltozna.
Szintén valami encoder bug lehet; esetleg valamelyik lépésnél alulcímezi a 64 elemű "nyers" tömböt?...