在opencv python中的2条轮廓线之间的中线?

时间:2019-10-05 10:46:35

标签: python opencv contour

我有一张图片

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 :(得分:0)

此答案说明了如何找到在形状的两侧之间延伸的线。可以通过反复腐蚀图像来找到中心。

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

答案 1 :(得分:0)

这是通过使用距离变换和礼帽形态在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