2010-12-31 16 views
5

Qual è l'algoritmo più sensibile, o una combinazione di algoritmi, di utilizzare da OpenCV per il seguente problema:rilevamento subimage 2D in Open CV

  • Ho una serie di piccole immagini 2D. Voglio rilevare le posizioni di queste immagini secondarie in un'immagine più grande.
  • Le immagini secondarie di solito sono intorno a 32x32 pixel e l'immagine più grande è intorno a 400x400.
  • Le immagini secondarie non sono sempre quadrate e tali contengono il canale alfa.
  • Opzionalmente - l'immagine più grande può essere granulosa, compressa, ruotato in 3D, o in altro modo un po 'distorto

ho cercato cvMatchTemplate, con risultati molto scarsi (difficili da abbinare in modo corretto, e un gran numero di falsi positivi, con tutti i metodi di corrispondenza). Alcuni dei problemi derivano dal fatto che OpenCV non sembra avere a che fare con la corrispondenza dei modelli di canale alfa.

Ho provato una ricerca manuale, che sembra funzionare meglio e può includere il canale alfa, ma è molto lenta.

Grazie per qualsiasi aiuto.

risposta

7
  1. cvMatchTemplate utilizza un tipo di metrica MSE (SQDIFF/SQDIFF_NORMED) per la corrispondenza. Questo tipo di metrica penalizzerà severamente i diversi valori alfa (a causa del quadrato nell'equazione). Hai provato la cross-correlazione normalizzata? È noto modellare meglio le variazioni lineari delle intensità dei pixel.
  2. Se NCC non esegue il lavoro, sarà necessario trasformare le immagini in uno spazio in cui le differenze di intensità non hanno molto effetto. per esempio. Calcola un'immagine di forza del bordo (astuta, sobel ecc.) Ed esegui cvMatchTemplate su queste immagini.
  3. Considerando la grande differenza nelle scale delle immagini (~ 10x). Dovrà essere impiegata una piramide di immagini per calcolare la scala corretta per l'abbinamento. Consiglia di iniziare con una scala (2^1/x: x è la scala corretta) e propagare la stima sulla piramide.
+0

Buona risposta. Ho provato altre metriche senza alcun aumento sensibile dell'affidabilità. Una preelaborazione di forza edge sembra un buon piano, ci proverò. – Sam

+0

Humm, la pre-messa in pila dell'immagine non sembra essere d'aiuto, poiché le leggere differenze di compressione producono differenze nette con risultati NCC sbagliati ... Altri suggerimenti? – Sam

+1

Ciò è dovuto alla differenza di scala nelle immagini. La tua immagine di destinazione è ~ 10 volte più piccola della sorgente. Di conseguenza dovrai stimare lo spazio della scala per fare anche la corrispondenza. – nav

2

Quello che ti serve è qualcosa come SIFT o SURF.

+0

Grandi cose, ho provato SURF e sembra esattamente quello di cui ho bisogno. Il mio unico problema è che funziona su immagini in scala di grigi, che sembra un'inutile riduzione delle informazioni. Cosa dovrei fare con intelligenza per "includere" quelle informazioni nella ricerca SURF? SURF su ogni canale? SURF su Hue? – Sam

+1

Penso che l'utilizzo del canale V funzionerebbe al meglio. –