#python #opencv #opencv-contour #opencv-python
#python #opencv #контур
Вопрос:
Я пытаюсь определить основные части изображения ниже. Я ищу 6 выделенных частей. Я пытался использовать комбинации размытия / расширения / эрозии и применил findCountures(), но не смог получить эти основные части как единое целое.
Кто-нибудь может предложить наилучший подход для этого. Я включаю код, который также может создавать изображение.
import cv2
import numpy as np
def createImage():
points = [
[(0, 8), (5, 8)], [(5, 8), (10, 12)], [(10, 12), (15, 26)],
[(15, 26), (20, 56)], [(20, 56), (25, 82)], [(25, 82), (30, 102)],
[(30, 102), (35, 129)], [(35, 129), (40, 100)], [(40, 100), (45, 81)],
[(45, 81), (50, 80)], [(50, 80), (55, 81)], [(55, 81), (60, 84)],
[(60, 84), (65, 104)], [(65, 104), (70, 151)], [(70, 151), (75, 151)],
[(75, 151), (80, 159)], [(80, 159), (85, 191)], [(85, 191), (90, 193)],
[(90, 193), (95, 230)], [(95, 230), (100, 230)], [(100, 230), (105, 248)],
[(105, 248), (110, 224)], [(110, 224), (115, 199)], [(115, 199), (120, 170)],
[(120, 170), (125, 130)], [(125, 130), (130, 101)], [(130, 101), (135, 69)],
[(135, 69), (140, 61)], [(140, 61), (145, 59)], [(145, 59), (150, 62)],
[(150, 62), (155, 85)], [(155, 85), (160, 104)], [(160, 104), (165, 117)],
[(165, 117), (170, 89)],[(170, 89), (175, 71)],[(175, 71), (180, 43)],[(180, 43), (185, 21)]
]
img = np.zeros([256,256],dtype=np.uint8)
for p in points:
cv2.line(img,p[0],p[1],255,1)
cv2.imwrite("sample.png",img)
return img
img =createImage()
cv2.imshow("sample",img)
cv2.waitKey(0)
Комментарии:
1. Смотрите ссылку picture_with_highligts, чтобы увидеть ожидаемые основные части
2. Хаф-линии , вероятно, хорошее место для начала.
Ответ №1:
Один из подходов заключается в использовании FastLineDetector
.
Если вы примените FastLineDetector
к своему входному изображению, результат будет:
Давайте посмотрим, как мы получили результат:
-
- Реализовать
FastLineDetector
- Реализовать
import cv2
image = cv2.imread("KZd2a.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
d = cv2.ximgproc.createFastLineDetector()
lines = d.detect(gray)
-
- Нарисуйте линии
r = d.drawSegments(i, lines)
Но если мы проанализируем, на изображении будет нарисовано 20 строк.
for line in lines:
(x1, y1, x2, y2) = [i for i in line[0]]
cv2.line(i, pt1=(x1, y1), pt2=(x2, y2), color=(255, 255, 0), thickness=4)
Шаги: