OpenCV: идентификация частей изображения

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

picture_with_highligts

original_picture

Комментарии:

1. Смотрите ссылку picture_with_highligts, чтобы увидеть ожидаемые основные части

2. Хаф-линии , вероятно, хорошее место для начала.

Ответ №1:

Один из подходов заключается в использовании FastLineDetector .

Если вы примените FastLineDetector к своему входному изображению, результат будет:

введите описание изображения здесь

Давайте посмотрим, как мы получили результат:

    1. Реализовать FastLineDetector

 import cv2

image = cv2.imread("KZd2a.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
d = cv2.ximgproc.createFastLineDetector()
lines = d.detect(gray)
  
    1. Нарисуйте линии

 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)
  

Шаги:


  • введите описание изображения здесь