Средняя линия между 2 контурными линиями в OpenCV Python? - PullRequest
0 голосов
/ 05 октября 2019

У меня есть изображение

Base Image

После запуска кода

Новое изображение

Second Image

Мне нужно найти границу между ними вот так

Как мне это сделать?

Мой код

import numpy as np
import cv2
import cv2 as cv

ima = cv2.imread('track1.pNg')
imgray = cv2.cvtColor(ima,cv2.COLOR_BGR2GRAY)
im = cv2.cvtColor(ima,cv2.COLOR_BGR2GRAY)






imm = cv2.inRange(im,(0),(49)) 

kernel = np.ones((5,5),np.uint8)
gradient = cv2.morphologyEx(imm, cv2.MORPH_GRADIENT, kernel)
il = cv2.dilate(gradient, kernel, iterations=7)
ol = cv2.erode(il, kernel, iterations=7)


contours,hei = cv2.findContours(ol,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContours(ima, contours, -1, (200,255,0), 3)


cv2.imshow('window',ima)

КакМогу ли я достичь этого?

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Вот еще один способ скелетонизации в OpenCV (без явной итерации) с использованием преобразования расстояний и морфологии цилиндров.

Ввод:

enter image description here

import cv2
import numpy as np

# read image and invert so blob is white on black background
img = 255-cv2.imread('tall_blob.png',0)

# do some eroding of img, but not too much
kernel = np.ones((20,20), np.uint8)
img = cv2.erode(img, kernel, iterations=2)

# threshold img
ret, thresh = cv2.threshold(img,127,255,0)

# do distance transform
dist = cv2.distanceTransform(thresh, distanceType=cv2.DIST_L2, maskSize=5)

# set up cross for tophat skeletonization
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
skeleton = cv2.morphologyEx(dist, cv2.MORPH_TOPHAT, kernel)

# threshold skeleton
ret, skeleton = cv2.threshold(skeleton,0,255,0)

# display skeleton
cv2.imshow("skeleton",skeleton)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('tall_blob_skeleton.png', skeleton)


enter image description here

0 голосов
/ 07 октября 2019

Этот ответ объясняет, как найти линию, проходящую между двумя сторонами фигуры. Центр может быть найден путем многократного размывания изображения.

erodion

Это результат:

skeliton

Это код, который я использовал:

import cv2
import numpy as np

img = 255-cv2.imread('/home/stephen/Desktop/PITqe.png',0)

kernel = np.ones((20,20), np.uint8)
img = cv2.erode(img, kernel, iterations=2)
size = np.size(img)
skel = np.zeros(img.shape,np.uint8)

ret,img = cv2.threshold(img,127,255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
done = False

while( not done):
    eroded = cv2.erode(img,element)
    temp = cv2.dilate(eroded,element)
    temp = cv2.subtract(img,temp)
    skel = cv2.bitwise_or(skel,temp)
    img = eroded.copy() 
    zeros = size - cv2.countNonZero(img)
    cv2.imshow('img', img)
    cv2.waitKey(100)
    if zeros==size:
        done = True
cv2.imshow("img",skel)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...