Ich habe einen Blob von unregelmäßigen Formen wie folgt:
< /p>
Jetzt möchte ich Linien von der Außenkante bis zur inneren Kante des Blobs wie folgt zeichnen: < /p>
Ich habe cv2.connectedComponents () zum Ergebnis verwendet Holen Sie sich die beiden Kanten.
originalimage = cv2.imread(R"blob.png")
edge = cv2.Canny(originalimage, 100, 200)
def get_islands(img):
n, labels = cv2.connectedComponents(img.astype(np.uint8))
islands = [(labels == i).astype(np.uint8) for i in range(1, n)]
return islands
edge_sets = get_islands(edge)
inner = edge_sets[1]
outer = edge_sets[0]
< /code>
Jetzt möchte ich eine Zeile von außen nach innerlich zeichnen. Ich habe versucht, die Steigung für jeden Punkt in der Außenschicht von den nächsten Nachbarn zu berechnen. Aber es scheitert für Eckpunkte. Zuerst habe ich versucht, ein Diagramm benachbarter Pixel zu erstellen.def create_graph(binary_image):
graph = defaultdict(list)
height, width = binary_image.shape
all_points = np.nonzero(binary_image)
all_points= sorted(list(map(list, [*zip(*all_points)]))) #Transpose the List
for x, y in all_points:
for dx in range(-1, 2, 1):
for dy in range(-1, 2, 1):
if dx == 0 and dy == 0:
continue
if (x+dx>=0 and y+dy>=0 and x+dx < height and y+dy < width) and binary_image[x+dx][y+dy]:
graph[(x, y)].append((x+dx, y+dy))
return graph
outer_graph = create_graph(edge_sets[0])
inner_graph = create_graph(edge_sets[1])
< /code>
Dann habe ich versucht, die Neigung der Außenkante an jedem Punkt aus seinen benachbarten Pixeln zu berechnen und senkrechte Linien zu zeichnen. < /p>
def get_slope(graph, point):
neighbours = graph[point]
slopes = []
eps = 1e-6
for neighbour in neighbours:
if neighbour[0] != point[0]: # Vertical Line
slopes.append((neighbour[1] - point[1]) / (neighbour[0] - point[0] + eps))
if slopes:
return np.mean(slopes)
else:
return 0
lines = []
for point in outer_graph:
slope = get_slope(outer_graph, point)
if slope == 0:
continue
perpedicular_slope = -1/slope
for inner_point in inner_graph:
if abs(get_slope(inner_graph, inner_point) - perpedicular_slope) < 0.01 \
and is_line_in_image(point, inner_point, originalimage):
lines.append([point, inner_point])
< /code>
, aber es schlägt an den Punkten, an denen die Kante nicht glatt ist, fehl. >lines = np.array(lines)
line_image = cv2.cvtColor(originalimage, cv2.COLOR_GRAY2RGB)
for i, line in enumerate(lines):
if i % 100 == 0:
line_image = cv2.line(line_image, tuple(line[0][::-1]), tuple(line[1][::-1]), (255, 0, 0), 3)
plt.imshow(line_image)
Ausgabe:
< /p>
Wie kann ich meinen Algorithmus verbessern, um die erwartete Ausgabe zu erhalten? Ist mein Ansatz korrekt?
Ich habe einen Blob von unregelmäßigen Formen wie folgt: < /p> Jetzt möchte ich Linien von der Außenkante bis zur inneren Kante des Blobs wie folgt zeichnen: < /p>
Ich habe cv2.connectedComponents () zum Ergebnis verwendet Holen Sie sich die beiden Kanten.[code]originalimage = cv2.imread(R"blob.png") edge = cv2.Canny(originalimage, 100, 200)
def get_islands(img): n, labels = cv2.connectedComponents(img.astype(np.uint8)) islands = [(labels == i).astype(np.uint8) for i in range(1, n)] return islands
edge_sets = get_islands(edge) inner = edge_sets[1] outer = edge_sets[0] < /code> Jetzt möchte ich eine Zeile von außen nach innerlich zeichnen. Ich habe versucht, die Steigung für jeden Punkt in der Außenschicht von den nächsten Nachbarn zu berechnen. Aber es scheitert für Eckpunkte. Zuerst habe ich versucht, ein Diagramm benachbarter Pixel zu erstellen.def create_graph(binary_image): graph = defaultdict(list)
height, width = binary_image.shape all_points = np.nonzero(binary_image) all_points= sorted(list(map(list, [*zip(*all_points)]))) #Transpose the List
for x, y in all_points: for dx in range(-1, 2, 1): for dy in range(-1, 2, 1): if dx == 0 and dy == 0: continue if (x+dx>=0 and y+dy>=0 and x+dx < height and y+dy < width) and binary_image[x+dx][y+dy]: graph[(x, y)].append((x+dx, y+dy)) return graph
outer_graph = create_graph(edge_sets[0]) inner_graph = create_graph(edge_sets[1]) < /code> Dann habe ich versucht, die Neigung der Außenkante an jedem Punkt aus seinen benachbarten Pixeln zu berechnen und senkrechte Linien zu zeichnen. < /p> def get_slope(graph, point): neighbours = graph[point] slopes = [] eps = 1e-6 for neighbour in neighbours: if neighbour[0] != point[0]: # Vertical Line slopes.append((neighbour[1] - point[1]) / (neighbour[0] - point[0] + eps)) if slopes: return np.mean(slopes) else: return 0
lines = []
for point in outer_graph: slope = get_slope(outer_graph, point) if slope == 0: continue perpedicular_slope = -1/slope for inner_point in inner_graph: if abs(get_slope(inner_graph, inner_point) - perpedicular_slope) < 0.01 \ and is_line_in_image(point, inner_point, originalimage): lines.append([point, inner_point]) < /code> , aber es schlägt an den Punkten, an denen die Kante nicht glatt ist, fehl. >lines = np.array(lines) line_image = cv2.cvtColor(originalimage, cv2.COLOR_GRAY2RGB) for i, line in enumerate(lines): if i % 100 == 0: line_image = cv2.line(line_image, tuple(line[0][::-1]), tuple(line[1][::-1]), (255, 0, 0), 3) plt.imshow(line_image) [/code] Ausgabe: < /p> Wie kann ich meinen Algorithmus verbessern, um die erwartete Ausgabe zu erhalten? Ist mein Ansatz korrekt?
Ich möchte die Positionen einiger Linien in einer Bildserie ermitteln. Ein Beispielbild, in dem ich die gewünschten Zeilen manuell identifiziert habe, wird hier angezeigt:
net/HgSY8ROy.png
Ich möchte die Positionen einiger Linien in einer Bildserie ermitteln. Ein Beispielbild, in dem ich die gewünschten Zeilen manuell identifiziert habe, wird hier angezeigt:
net/HgSY8ROy.png
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...
Ich habe eine Expo-Anwendung, bei der ich ein Uint8Array erhalte, das einem Bild entspricht, das im nativen Kotlin-Modul in Bytes serialisiert wurde, und ich möchte dieses Array in einen Blob...