2015-05-18 16 views
5

http://i.imgur.com/iIv4gJa.pngimmagine (colore?) La segmentazione con OpenCV C++

Come il grafico ha mostrato, mi piacerebbe dell'immagine in ingresso per ottenere diversi segmenti e come un risultato del genere.

È proprio come il cluster il segmento di colore più vicino, quindi penso che sia vicino al concetto di "meanshift"?

Ho cercato qui domande rilevanti, ma ancora non so come iniziare e costruire la struttura in opencv C++. Sto cercando alcuni consigli, e sarò molto grato se ricevo un pezzo di codice di implementazione per farmi riferimento! Grazie per qualsiasi aiuto!!

========================================= ====

Modifica 5/19/2015

Lasciatemi aggiungere che uno dei miei implementazioni che cercano è spartiacque qui :(http://blog.csdn.net/fdl19881/article/details/6749976).

enter image description here

Non è perfetto, ma il risultato che voglio. In questo strumento, l'utente deve operare manualmente (disegnare le linee spartiacque), quindi sto cercando la versione AUTOMATICA di esso. Sembra un po 'difficile, ma ... lo apprezzerò per qualche suggerimento o parte di codice per farlo.

+1

Si prega di inviare qualsiasi impegno di codice che hai fatto. – npinti

+0

Forse potresti usare un algoritmo di spartiacque per la segmentazione e selezionare il colore medio dall'elemento segmentato per la visualizzazione ?! È così che vorrei iniziare – retinotop

+0

In realtà, ho provato diverse implementazioni cercate in rete, ma non mi sembra nemmeno più vicino a quello che voglio tranne Efficient Graph-Based Image Segmentation (di P. Felzenszwalb, D. Huttenlocher), ecco il sito demo: http://cs.brown.edu/~pff/segment/ Ma sfortunatamente, ho avuto un problema in questa patch di codice (la funzione "loadPPM" in esso), quindi sono venuto qui ad elemosinare qualche altro/modo modificato per implementare. – Oasis

risposta

2

Opencv Documentazione: Link

Parametri: here

Codice di esempio per il filtraggio Meanshift:

#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 

using namespace cv; 
using namespace std; 

Mat img, res, element; 

int main(int argc, char** argv) 
{ 

    namedWindow("Meanshift", 0); 
    img = imread(argv[1]); 
// GaussianBlur(img, img, Size(5,5), 2, 2); 
    pyrMeanShiftFiltering(img, res, 20, 45, 3); 
    imwrite("meanshift.png", res); 
    imshow("Meanshift", res); 

    waitKey(); 

    return 0; 
} 

Questa è l'uscita con la vostra immagine, potrebbe essere necessario utilizzare alcuni di pre-elaborazione prima o forse trovare alcuni parametri migliori:

output

EDIT: Uscita con qualche sfocatura gaussiana in anticipo (commenti nel codice)

here

+0

Questo è così vicino a quello che voglio! Ma cercherò di regolare i parametri per renderlo più fluido! (Per rendere la dimensione dell'area del segmento ben posizionata) In realtà questa segmentazione del colore è l'operazione precedente di "segmentazione semantica", quindi considererò attentamente facendo sfocatura o no per prevenire distruggere le informazioni sulla funzione locale in esso. – Oasis

+0

@Oasis vuoi super-pixel per la segmentazione semantica potresti prendere in considerazione approcci più moderni come [slic] (http://ivrl.epfl.ch/research/superpixels) – Shai

+1

@Oasis Se stai cercando shift ** segmentation ** (piuttosto che ** filtering **) potresti prendere in considerazione [EDISON] (http://coewww.rutgers.edu/riul/research/code/EDISON/). – Shai

1

Il problema con guardando la segmentazione esistenti approcci è che essi sono o implementati in Matlab (che nessuno al di fuori di Uni può usare) o non sono automatici. Un approccio in cui l'utente deve preelaborare l'immagine scegliendo oggetti di interesse o livelli che indicano come suddividere i colori non è utile perché non è automatico. Se lo desideri, puoi provare la mia implementazione di segmentazione basata su OpenCV descritta in questo blog post. Non è perfetto, ma è automatico e fa la maggior parte del lavoro e puoi effettivamente scaricare la fonte e provarla.