by Guest » 14 Jan 2025, 13:11
Ich muss möglichst viele der gemörtelten Steine in einem Straßenbereich korrekt umreißen. Der folgende Code erkennt einige davon korrekt im Steinbild „in.jpg“, aber es ist nicht ersichtlich, warum viele unentdeckt bleiben oder nur teilweise umrissen sind. Ich möchte auch Fälle wie Kontur 56, 57 oder 92 beheben, indem ich die Tatsache ausnutze, dass die Steine ausgerichtet sind und ein meist ovales Bild mit erkannten Konturen „out.jpg“ aufweist. Ich weiß, wie man die offensichtlichen Ausreißer entfernt, aber vorher muss ich die Erkennungsmethode verbessern.
Code: Select all
import cv2
img = cv2.imread('in.jpg')
gray = cv2.bitwise_not(img)
gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (113, 113), 0)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 61, 2)
thresh = cv2.dilate(thresh, None, iterations=5)
thresh = cv2.erode(thresh, None, iterations=1)
cnts, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f'Found {len(cnts)} contours')
cv2.drawContours(img, cnts, -1, (0, 255, 0), 2)
centroids = [cv2.moments(c) for c in cnts]
for i, c in enumerate(centroids):
cv2.putText(img, str(i), (int(c['m10'] / c['m00']), int(c['m01'] / c['m00']) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
cv2.imwrite('out.jpg', img)
Die verschiedenen Parameter (Unschärfe 113 usw.) wurden durch Versuch und Irrtum ermittelt.
Es reicht nicht aus, nur die Steine zu zählen, Ich muss ihre Form so genau wie möglich nachahmen.
Vielen Dank für Ihre Vorschläge!
Ich muss möglichst viele der gemörtelten Steine in einem Straßenbereich korrekt umreißen. Der folgende Code erkennt einige davon korrekt im Steinbild „in.jpg“, aber es ist nicht ersichtlich, warum viele unentdeckt bleiben oder nur teilweise umrissen sind. Ich möchte auch Fälle wie Kontur 56, 57 oder 92 beheben, indem ich die Tatsache ausnutze, dass die Steine ausgerichtet sind und ein meist ovales Bild mit erkannten Konturen „out.jpg“ aufweist. Ich weiß, wie man die offensichtlichen Ausreißer entfernt, aber vorher muss ich die Erkennungsmethode verbessern.
[code]import cv2
img = cv2.imread('in.jpg')
gray = cv2.bitwise_not(img)
gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (113, 113), 0)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 61, 2)
thresh = cv2.dilate(thresh, None, iterations=5)
thresh = cv2.erode(thresh, None, iterations=1)
cnts, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f'Found {len(cnts)} contours')
cv2.drawContours(img, cnts, -1, (0, 255, 0), 2)
centroids = [cv2.moments(c) for c in cnts]
for i, c in enumerate(centroids):
cv2.putText(img, str(i), (int(c['m10'] / c['m00']), int(c['m01'] / c['m00']) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
cv2.imwrite('out.jpg', img)
[/code]
Die verschiedenen Parameter (Unschärfe 113 usw.) wurden durch Versuch und Irrtum ermittelt.
Es reicht nicht aus, nur die Steine zu zählen, Ich muss ihre Form so genau wie möglich nachahmen.
Vielen Dank für Ihre Vorschläge!