Ein Beispielbild, in dem ich die gewünschten Zeilen manuell identifiziert habe, wird hier angezeigt:
[img]https://i.sstatic .net/HgSY8ROy.png[/img]
Die Kamera wurde zwischen den Bildern leicht bewegt, weshalb ich den Vorgang gerne automatisieren würde. Aber ich weiß, dass die Linien, die ich möchte, immer über das gesamte Bild verlaufen, vom linken zum rechten Rand, und in einem Winkel, der der Horizontalen ziemlich nahe kommt.
Ich habe es versucht Verwenden der Hough-Transformation von Skimage, sowohl direkt am Bild als auch am Ergebnis der Kantenerkennung, jedoch mit sehr begrenztem Erfolg. Hier ist ein Codebeispiel und die Ergebnisse der Verwendung der Hough-Transformation und der Darstellung der markantesten Linien, wie im Beispiel hier:
Code: Select all
from skimage.transform import hough_line, hough_line_peaks
from skimage.filters import scharr
from skimage.color import rgb2lab
import matplotlib.image as mpimg
im = mpimg.read('image.png')
edges = scharr(rgb2lab(im[:,:,:])[:,:,0]) # Performing edge detection on the L-channel
angles = np.linspace(0.95*np.pi/2, 1.05*np.pi/2, 100) # Using a fairly narrow range of possible angles
h, theta, d = hough_line(edges, angles)
peaks = hough_line_peaks(h, theta, d, threshold=0.99*np.amax(h)) # Using a high threshold, default is 0.5*max(h)
plt.imshow(im)
for _, angle, dist in zip(*peaks):
(x0, y0) = dist * np.array([np.cos(angle), np.sin(angle)])
plt.axline((x0, y0), slope=np.tan(angle + np.pi / 2), lw=0.5, alpha=0.75, c='r')

Viele, viele Linien wurden (falsch) identifiziert, aber nicht die, die ich wollte.
Ich habe auch die probabilistische Hough-Transformation ausprobiert:
Code: Select all
from skimage.transform import probabilistic_hough_line
lines = probabilistic_hough_line(edges, threshold=10, line_length=5000, theta=angles)
plt.imshow(im)
for l in lines:
plt.plot([l[0][0], l[1][0]], [l[0][1], l[1][1]], c='r', alpha=0.75, lw=0.5)

Diesmal sieht es so aus, als ob die von mir gesuchten Zeilen tatsächlich identifiziert wurden, aber mehr oder weniger, aber auch jede Menge anderer Zeilen. Ich habe versucht, den Schwellenwertparameter zu ändern, aber ohne offensichtliche Wirkung.
Mir ist klar, dass ich möglicherweise nicht automatisch genau die gewünschten Linien finden kann, da das Bild auch andere Linien enthält , aber was ich bisher gefunden habe, sieht einfach völlig verrückt aus. Für Vorschläge sind wir sehr dankbar.
Bearbeiten:
Ich habe festgestellt, dass, wenn ich eine leichte Gaußsche Unschärfe verwende, und der Canny-Kantendetektor anstelle von Scharr scheint viel besser zu funktionieren:
Code: Select all
from skimage.feature import canny
l = rgb2lab(im[:,:,:])[:,:,0]
edges = canny(gaussian(l, 3), 1, 10, 20)


Update: Hier ist das Originalbild: https://nordam.folk.ntnu.no/gopro1_GX010111_001.png