Weiß jemand, warum der MatLab Canny (MLC) so anders ist als der OpenCV Canny (OCC)? ML-C liefert präzise und besser verbundene Kanten als das OCC, aber wie ist das möglich? Der Grund, warum ich frage, ist, dass ich meinen Prototyp von ML-Code in C ++ implementieren muss und OpenCV verwenden wollte. Das Exportieren von ML-Code ist meines Erachtens nicht wirklich möglich.
Mit freundlichen Grüßen,
image-processing
matlab
opencv
edge-detection
mchlfchr
quelle
quelle
edit edge
Matlab eingeben und den entsprechenden Fall anzeigen. Es ist alles Open Source - soweit ich weiß keine eingebauten.Antworten:
Wie oben vorgeschlagen, berechnet der Matlab Canny-Kantendetektor den Gradienten unter Verwendung einer "Ableitung eines Gaußschen Filters" (wie in der Dokumentation angegeben). Mit anderen Worten, Matlab macht eine Gaußsche Unschärfe des Bildes und findet dann den Gradienten dieses geglätteten Bildes ... alles unter Verwendung eines einzigen ausgefallenen Filters. [Wenn Sie die Details wissen möchten, geben Sie einfach
edit edge
wie von Andrey vorgeschlagen ein und scrollen Sie dann nach unten zursmoothGradient()
Funktion.]Durch die Unschärfe wird das im Bild vorhandene Rauschen erheblich reduziert, wodurch viele störende Kanten vermieden werden und das gute Material zurückbleibt.
Leider können Sie mit der OpenCV Canny-Funktion den verwendeten Filterkern nicht über die Funktionsparameter ändern. Jedoch. Sie können dieselben Ergebnisse erzielen, indem Sie zuerst das Eingabebild verwischen und dieses unscharfe Bild dann an die Canny-Funktion übergeben.
Dadurch wird die resultierende Kantenabbildung erheblich bereinigt. Um das Eingabebild zu verwischen, verwende ich persönlich die OpenCV-
GaussianBlur()
Funktion mitsigmaX=2
. Dies ahmt das Standard-Sigma in Matlab nach. Die beste verwischende Kernelgröße kann von Fall zu Fall variieren, wird jedoch in Matlab mit berechnetfilterLength = 8*ceil(sigma);
, sodass für ein Sigma von 2 eine Kernelgröße von bedeuten würde(16,16)
Da sowohl der Gaußsche Unschärfe- als auch der Sobel-Filter linear sind, entspricht die Übergabe eines unscharfen Eingabebilds an die OpenCV-
Canny()
Funktion mathematisch dem, was Matlab aufgrund des Überlagerungsprinzips tut, wie in diesem Pseudocode gezeigt (Anmerkung:*
ist der Faltungsoperator):Hier finden Sie ein OpenCV Canny-Tutorial, das zeigt, wie dies mit C ++ gemacht wird. Ich bin ein Python-Typ, also mache ich Folgendes:
quelle