2016-08-01 21 views
0

Aus irgendeinem Grund muss ich die Filterfunktion selbst schreiben. Das Folgende ist meine Faltungsfunktion.Unterschied von cv :: filter2D und in sich geschlossene Faltung auf Gabor-Filter

Dann vergleiche ich mit dieser Funktion und cv :: filter2D Funktion, und entdecken Sie, dass sie nach dem Filtern anders sind. Das gefilterte Bild ist fast das gleiche, wenn Theta und Psi Null sind, aber nicht andere.

int main() 
{ 
    cv::Mat in = cv::imread("something.jpg", 0); 
    cv::Mat dest, dest1; 
    cv::Mat src_f; 
    in.convertTo(src_f, CV_32F); 

    int kernel_size = 31; 
    double sig = 1.0, th = 0.2, lm = 1.0, gm = 0.02, ps = 0.0; 

    cv::Mat kernel = cv::getGaborKernel(cv::Size(kernel_size,kernel_size), sig, th, lm, gm, ps); 

    cv::filter2D(src_f, dest1, CV_32F, kernel); 
    Convolve(src_f, kernel, dest); 

    cv::Mat viz; 
    dest.convertTo(viz, CV_8U, 1.0/255.0); 
    cv::Mat viz1; 
    dest1.convertTo(viz1, CV_8U, 1.0/255.0); 
    imshow("my dest", viz); 
    imshow("k dest", viz1); 
    cv::waitKey(); 
} 

Irgendwelche Vorschläge für die in sich geschlossene Faltung? Der Nullauffüllungsteil wird ignoriert.

+0

"Aus irgendeinem Grund": D – GameOfThrows

+0

: D Zum Lernen. –

Antwort

0

Sie greifen auf den Kernel in Ihren Faltungsimplementierungen als eine Matrix von Gleitkommazahlen zu, aber er besteht aus Doppelpunkten (ksize ist standardmäßig auf CV_64F eingestellt, entsprechend der doc). Es sieht so aus, als ob OpenCV intelligent genug ist, um es zu erkennen und den Konvertierungs-/korrekten Speicherzugriff selbst während der Faltung von Matrizen mit verschiedenen Elementtypen durchzuführen, weshalb es korrekte Ergebnisse erzeugt.

Um Ihre Schnipsel zu beheben habe ich eine Linie

kernel.convertTo(kernel, CV_32F); 

Dadurch entsteht ein optisch äquivalentes Ergebnis (bis zu padding). Eine andere Option wäre, die ktype explizit auf CV_32F zu setzen.

Auch bei der Arbeit mit großen Kernen (~ 11x11 und größer) führt OpenCVs filter2D Implementierung die Faltung mit dem DFT-basierten Algorithmus (in der Frequenzdomäne) durch, so dass Sie leicht unterschiedliche Ergebnisse und Timings erhalten.