mintaillesztés imagemagickkel

 ( pepo | 2010. június 28., hétfő - 6:26 )

Sziasztok!

4 különféle keret áll rendlkezésre, melyek előfordulását kell megvizsgálnom számos képállományon. A beazonosított területeket el kell mentenem különböző fájlokban.
A dolog pikantériája, hogy egyes képállományokban a vizsgálandó letétel illeszkedése szemmel láthatóan kb. 80%-osan stimmelnek.
Gondoltam, feladat elvégzéséhez az imagemagick program a legalkalmasabb.
Ti hogyan oldanátok meg, merre indulnátok el?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

OpenCV + egy erős kávé.

Kicsit konkrétabban, ha lehetne....

-- A "keret" a kép kerete, tehát a szélén fut körbe vagy egy kis téglalap, ami akárhol lehet a képen és meg kell találni?

-- Ha nem a kép széléről van szó, hanem itt-ott felbukkanó téplalapokról, akkor ezek el is lehetnek forgatva? Vagy legalább azt tudjuk, hogy pixelhatárral illesztve vannak?

-- "kb 80%-osan stimmlenek": a képponotk 80%-a egzatul stimmel, vagy az RGB-értékek max 20%-nyit térnek el?

Amíg ezeket nem tudja az ember, enm lehet válaszolni.

igazad van, pontosítok:
-Vannak kerettel rendelkező minták, melyek egyike illeszkedik a keret vonatkozásában legalább 80%-osan egy nagyobb kép tartalmára. A nagyobb képen ilyen keretben lévő tartalmat kell elmenteni.
- Nincs csak egy előfordulás egy nagyobb képben. Nincs elforgatás, ám a nagy képben lévő keretes ábra helye eltérő.
- A szemrevételezés alapján a kb. 80%-os a keret-hasonlóság mind pixelben, mind színben értendő.

A "keretek" hogy vannak megadva?

Adott egy kisebb kép, mely tartalmazza őket? Ha igen, akkor mi van a belsejükkel? Az hogy an van meghatározva, hogy belül mi nem számít keretnek?

Vagy leírható így, hogy "300x200-as fekete keret 5-ös vonalvastagsággal"?

A kis, keretes képminták belsejei üresek. Több méretű kis kép létezik, de mindegyik deffiniálható ekzakt méretekkel és a falvastagság is megadható.

"üres"=???

???=

a) fehér (R,G,B=255) és a kereten sehol máshol nem lép ez fel
b) alkalmas képformátumban, pl. PNG-ben átlátszó?
c) a kép mellé mellékelve van egy "K" kis szám, hogy a kép szélső "K" sora tekintendő keretnek?

b, üres. (az egyszerűség és a pontosabb ileszthetőség kedvéért)
c, ezt nem igazán értem.

Lehet, hogy példány keresztül pontosítok: nagyából azt kellene elképzelni, hogy egy deszktopon van valahol egy darab ismert méretü ablak, de kb. 50%-os transparenttel és a háttérkép a keretnek ''bezavar'', ám magának az ablaktartalomnak nem. És rendelkezésre áll a képernyőkép. Itt már el is lehet hagyni az eredeti keret illesztését,mert fentebb felnyitottad a szemem azzal, hogy egyszerűen a minták méretével is lehet kombinálni.

Ezt a feladatot tipikusan az emberi szemhez tervezték! ;)

De ha ez nem játszik akkor, amit én esetleg próbálnék:

1. a keretek elhelyezésének körülbelüli megtippelése a nagy képen (élkereséssel) -> de ha a kereteken kívül is sok kontrasztos és tökéletesen vízszintes v. függőleges vonal van a képen akkor ez nem válik be...

2. a nagy képen a tippelt keretek környékén (X pixel sugarú körben) futtatott brute-force a keretek egyezésének mérésére (Egyszerű négyzetes hibával pl. Természetesen nem kell minden pontra kiszámítani a hibát elég egy megfelelő méretű random minta)

(3. A legjobb tippeket kirajzolni egy embernek, hogy szemmel ellenőrizze ;)

subscribe

+1

<troll hozzáállás="rosszindulatú">
Ez valami captcha-fejtéshez kell?
</troll>

Ugyan nem értek az Imagemagickhez, de az a gyanúm, hogy egy ilyen problémát nehéz lesz egy általános célú, parancssorból paraméterezhető programmal megoldani, legalábbis úgy, hogy az az elvárt hatékonysággal működjön.

Szerintem nem úszod meg, hogy leprogramozz egy cél-algoritmust akár C-ben/kedvenc programnyelvedben, akár valamelyik képfeldolgozó keretrendszerben.

Utóbbiakhoz nem értek, előbbiben be lehetne tölteni a forrásképeket és a kereteket 2D tömbökbe és valamiféle 2D korrelációs függvényeket számolgatni rájuk.

Valószínű tényleg saját kód kell, hogy épeszű időben lefusson.

A korrelációval csak az a baj, hogy az nem számít, hogy mi van a kereten belül és kívül. A keretet meghatározó függvény és a képfüggvény tartója tehát nem azonos. Persze, kiterjeszthető a korreláció fogalma erre is, de én nem tudom, hogy ebben az esetben hogyan lehet a gyor korreláció számoló FFT-s dolgokat alkalmazni.

Perverz ötlet: a keretet, mint kernelt felhasználva dekonvolúciót végrehajtani, aztán az eredményen kiugró csúcsokat keresni.

Persze bármilyen konkrét implementációnál fellépnének olyan dolgok, hogy - ha nem teljesen azonosak az előre megadott keretek és a célképeken lévő előfordulásaik, akár eltérő fényesség, színek vagy jpg artifactok miatt - bármilyen feldolgozás előtt még valahogy normalizálni is kell a célképeket.

Igazából örülök, hogy nem nekem kell ezt a problémát megoldani :)

Hazaértem, és pontosítani tudok még jobban:
- a nagy képen véletlenszerű helyen helyezkedik el egy - pl. - 201x253-as RGB #000500 (majdnem fekete) keret, melynek a vastagsága 2 pixel. Egy és csakis egy ilyen keret létezik a képen. A keretben foglalt képet kell elmentenem. (Rosszul emlékeztem, nem a keret átlátszó, hanem a tartalma. De az már mellékes.)

Ha fix a keret mérete és alakja, akkor menj végig vele minden képponton és keress RGB-ben hasonlóságot. Érdemes kivonni és akkor a legkisebb nyer. Mint egy csúszóablak.
Ha nem fix a keret, akkor már gáz van. Olyan algoritmus kell, ami megtalálja a képen a keret-szerű területeket. Definiálnod kell, hogy mi az a keret. Pl 2-10 pixel széles, négyszög formájú, stb. Ha ez megvan, akkor indulhat a sorvizsgálat. Nem akarom megoldani helyetted, gondolkodj te is egy kicsit.

és ha az átlátszó részeket keresed meg?

Ha mar kepfeldolgozas, esetleg ha feltennel 4-5 minta kepet valahova, akkor nem kerdezne ra mindenki apro reszletekre.
Csak egy otlet.
Imagick jo lehet elofeldolgozashoz (meg a vegen a kivagasra), de kizart, hogy legyen beepitett rutinja erre.

--
What's the difference between the Israeli navy and Somali pirates?
If you negotiate with Somali pirates,you can prevent them from murdering their victims. - sickipedia

nem használtam még ezt a progit, de gugli "imagemagick correlation" első találatai közt az első honlap beli:
http://www.imagemagick.org/Usage/compare/
(nem néztem most jobban de talán a tényleges első találat még jobb, szinte kész van)

(leggagyibb esetben egy (bash) scripttel, mipmappel kiegészítve is meg lehet írni)

A compare-t próbálgattam korábban, de túl lassú, és sajnos nem azt az eredményt hozza, amit szeretnék.

hát ha lassú ÉS nem azt hozza amit szeretnél, akkor ... finoman fogalmazva hmm nem tudok segíteni :)

lassú mert brute force*, de akkor azt kell hozni, vagy egy spéci esetre gyorsan működő de épp nem a te eseted, dea mit te mondasz, hogy "és", az azt jelenti messze vagy a .. kivitelezéstől

de hogy írjak is valamit: ha tényleg olyan 2px-es ahogy feljebb írtad akkor élkeresés aztán az összes sorban összeadod ami maradt, ugyanígy az oszlopokban, majd a két-két maximum adja a helyét, ezen lehet finomítani hogy olyan maximumot keresel ami adott távolságra van, esetleg további finomításokkal** (pl azért mégiscsak egyenest keresel) ez biztos gyorsan működik.. mármint a lefutás, a kivitelezés, hát ... ;)

(*:ezen micel 2px, lehet gyorsítani hogy felezel, de egyébként is először tizrnhatodolni, nyolcadolni..)

**: pl élkeresés nélkül _is_ hisz fekete (ekkor persze (lokális) minimumra keresel)

Hat betufelismerest multkor egy BME-s srac histogram-alapon implementalt, es marha pontos lett, ugyhogy lehet ezt kell jatszani.

és tényleg
itt ráadásul csak egyetlen karaktert (a téglalapot) kell felismernie, szóval ez tuti megoldás

miután felismerte, már csak azt kell megmondania hol is ismerte el.. :)