Finden Sie gerade Linien im BildPython

Python-Programme
Guest
 Finden Sie gerade Linien im Bild

Post by Guest »

Ich möchte die Positionen einiger Linien in einer Bildserie finden. Die Bilder werden aus GoPro-Videos exportiert, wobei die Kamera auf einen abfallenden Boden (sozusagen einen Strand) in einem Wellenbecken blickt. Mein Ziel (aber nicht das Thema dieser Frage) ist es, die Bilder auf die Position von Partikeln vor und nach dem Durchgang der Welle zu analysieren. Der Sinn dieser Frage besteht darin, dass ich die Linien identifizieren möchte, die die Wände des Tanks vom Boden trennen, damit ich den Bildabschnitt, der den Boden zeigt, in ein Rechteck umwandeln und die Bilder aus mehreren zusammenfügen kann Kameras zeigen die gesamte Etage. Die Transformation und das Zusammenfügen funktionieren gut, wenn ich die Trennlinien zwischen Boden und Wänden manuell identifiziert habe, aber die Kameras zwischen den Experimenten bewegt wurden, sodass ich dachte, ein automatisiertes Verfahren könnte Zeit sparen.
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')

Image

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)
Image

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)
Image

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post