2017-03-03 1 views
0

Ich habe dieses Bild:Wie beschleunigen Frangi Filterung in opencv (C++)

enter image description here

Ich möchte mithilfe von Frangi Filter Anomalien auf diesem Bild erkennen. Code dafür habe ich hier: Frangi filter. Ich verwende diese Parameter für Frangi-Filter:

// Manualy edited parameters of frangi filter. 
#define DEFAULT_SIGMA_START 1 
#define DEFAULT_SIGMA_END 3 
#define DEFAULT_SIGMA_STEP 1 
#define DEFAULT_BETA_ONE 1.6 
#define DEFAULT_BETA_TWO 1.2 
#define DEFAULT_BLACKWHITE true 

Anomalieerkennung funktioniert sehr gut. Das Problem ist die Geschwindigkeit der Berechnung. Die Zeit für das Filtern beträgt: 7 Sekunden. Was können mögliche Lösungen sein, um schneller voranzukommen und gleichzeitig eine gute Erkennung mit Frangi Filter zu erhalten?

EDIT 1: Der Code, wo die meiste Zeit ist innerhalb eines frangi2d Algorithmus für die Schleife verbringen:

for (float sigma = opts.sigma_start; sigma <= opts.sigma_end; sigma += opts.sigma_step) { 
     //create 2D hessians 
     Mat Dxx, Dyy, Dxy; 
     frangi2d_hessian(src, Dxx, Dxy, Dyy, sigma); 

     //correct for scale 
     Dxx = Dxx*sigma*sigma; 
     Dyy = Dyy*sigma*sigma; 
     Dxy = Dxy*sigma*sigma; 

     //calculate (abs sorted) eigenvalues and vectors 
     Mat lambda1, lambda2, Ix, Iy; 
     frangi2_eig2image(Dxx, Dxy, Dyy, lambda1, lambda2, Ix, Iy); 

     //compute direction of the minor eigenvector 
     Mat angles; 
     phase(Ix, Iy, angles); 
     ALLangles.push_back(angles); 

     //compute some similarity measures 
     lambda2.setTo(nextafterf(0, 1), lambda2 == 0); 
     Mat Rb = lambda1.mul(1.0/lambda2); 
     Rb = Rb.mul(Rb); 
     Mat S2 = lambda1.mul(lambda1) + lambda2.mul(lambda2); 

     //compute output image 
     Mat tmp1, tmp2; 
     exp(-Rb/beta, tmp1); 
     exp(-S2/c, tmp2); 

     Mat Ifiltered = tmp1.mul(Mat::ones(src.rows, src.cols, src.type()) - tmp2); 
     if (opts.BlackWhite) { 
      Ifiltered.setTo(0, lambda2 < 0); 
     } 
     else { 
      Ifiltered.setTo(0, lambda2 > 0); 
     } 

     //store results 
     ALLfiltered.push_back(Ifiltered); 

     cout << "Interation done" << endl; 
    } 

Antwort

1

Ihr Bild hat einen großen schwarzen Bereich, können Sie sich einen ROI auswählen können, anzuwenden, um Der Filter.

Die ROI-Auswahl basiert möglicherweise auf der Vorausverarbeitung der Bilder, die nach dem Scheitelpunkt der ROI suchen. Vielleicht ist es für Ihre Anwendung festgelegt. Vielleicht können Sie andere Informationen verwenden, um den ROI auszuwählen.

+0

Das ist ein guter Punkt, aber ich habe es schon versucht und immer noch bringt mir nicht viel mehr Geschwindigkeit. Ich muss in einen Frangi-Filteralgorithmus gehen und ihn optimieren. – jok23

+0

Ich habe auch einen Code hinzugefügt, wo die meiste Zeit in frangi2d funtion verbracht wird (for loop) – jok23