Figyelnünk kell arra, hogy él ott lehet, ahol (elvileg) a Laplace érték nulla, és a szomszédsághoz képest előjelváltás történik! Erre sajnos nincs kész függvény az OpenCV-ben. A képek digitális volta miatt eleve nem biztos, hogy pontosan nulla értéket fogunk kapni az élek helyén, így vizsgáljuk inkább csak az előjelváltásokat a vizsgált pont lokális környezetében!
Az angol nyelvű OpenCV dokumentáció példaprogramja látszólag megoldja a feladatot, de vigyázzunk, mert nem végez előjelváltás keresést, csak a Laplace eredmény abszolútértékét képzi, ami elrontja az élkeresési lehetőségét! Az élek a sötét területen vannak, a világosan megjelenő területek mellett! Ez hibás!
A nulla-átmenet előjelváltással problémakör részletes ismertetése angol nyelven itt olvasható: https://homepages.inf.ed.ac.uk/rbf/HIPR2/zeros.htm.
Egy egyszerűsített közelítő megoldás megvalósítható min-max szűrők (morfológiai erózió és dilatáció) segítségével. Hajtsunk végre a Laplace eredményen egy minimum és egy maximum szűrést.
img = cv2.imread('OpenCV-logo.png', cv2.IMREAD_GRAYSCALE)
blurred = cv2.GaussianBlur(img, (5, 5), 2.0)
LoG = cv2.Laplacian(blurred, cv2.CV_16S, ksize=3)
minLoG = cv2.morphologyEx(LoG, cv2.MORPH_ERODE, np.ones((3, 3)))
maxLoG = cv2.morphologyEx(LoG, cv2.MORPH_DILATE, np.ones((3, 3)))
Azokon a helyeken legyen élpont, ahol a lokális környezet minimuma negatív, a maximuma pedig pozitív érték. Vegyük figyelembe, hogy a nulla értéktől csak kis mértékben való eltérés zaj hatására is kialakulhat, ezért élt ott detektáljunk, ahol a nullától eltérés egy megadott érték feletti (a példánkban -10 és 10 értékeket használunk).
zero_cross = np.logical_and(minLoG < -10, maxLoG > 10)
zero_cross_im = np.zeros(zero_cross.shape, np.uint8)
zero_cross_im[zero_cross] = 255
cv2.imshow('zero_cross_im', zero_cross_im)
A megoldást megvalósító példaprogramunk a 07_03_Laplace_zero_crossing.py.