Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencv python中两条等高线之间的中间线?_Python_Opencv_Contour - Fatal编程技术网

opencv python中两条等高线之间的中间线?

opencv python中两条等高线之间的中间线?,python,opencv,contour,Python,Opencv,Contour,我有一个形象 在我的代码运行之后 新形象是 我需要像这样找出他们之间的界限 我该怎么办 我的代码 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),

我有一个形象

在我的代码运行之后

新形象是

我需要像这样找出他们之间的界限

我该怎么办

我的代码

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)

如何实现这一点?

此答案解释了如何找到形状两侧之间的直线。可以通过迭代腐蚀图像找到中心

结果是:

这是我使用的代码:

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

这里是另一种在OpenCV中使用距离变换和top hat形态学进行骨骼化(无需显式迭代)的方法

输入:


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)