简体   繁体   中英

Middle line between 2 contour lines in opencv python?

I have an image

基本图像

After my code runs,

The new image is

第二张图片

I need to find the line between them like this

How do I do?

My code

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)

How can i achieve this?

This answer explains how to find a line that runs between two sides of a shape. The center can be found by iteratively eroding the image.

侵蚀

This is the result:

骷髅

This is the code I used:

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

Here is another way to skeletonize in OpenCV (without explicitly iterating) by using distance transform and top hat morphology.

Input:

在此处输入图像描述

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)


在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM