Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.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
Python 使用opencv查找两个多边形之间的最大和最小距离 在外轮廓之前,我无法包含通过线,因此我无法找到最小距离和最大距离:_Python_Opencv_Image Processing - Fatal编程技术网

Python 使用opencv查找两个多边形之间的最大和最小距离 在外轮廓之前,我无法包含通过线,因此我无法找到最小距离和最大距离:

Python 使用opencv查找两个多边形之间的最大和最小距离 在外轮廓之前,我无法包含通过线,因此我无法找到最小距离和最大距离:,python,opencv,image-processing,Python,Opencv,Image Processing,将numpy导入为np 进口cv2 img=cv2.imread('Desktop/ImQ5/Image(i.png',0) ret,img=cv2.threshold(img,128255,cv2.THRESH\u二进制) img_bw=img在Python/OpenCV中实现这一点的一种方法是对内部进行泛洪填充,然后获得距离变换。两个多边形之间的最大间距是距离图像中最大值的两倍。多边形之间的距离是多边形中间的“薄”亮环的两倍值-两个多边形之间的局部最大值,所以环之间的最小值是沿着“薄”亮环的

将numpy导入为np
进口cv2
img=cv2.imread('Desktop/ImQ5/Image(i.png',0)
ret,img=cv2.threshold(img,128255,cv2.THRESH\u二进制)

img_bw=img在Python/OpenCV中实现这一点的一种方法是对内部进行泛洪填充,然后获得距离变换。两个多边形之间的最大间距是距离图像中最大值的两倍。多边形之间的距离是多边形中间的“薄”亮环的两倍值-两个多边形之间的局部最大值,所以环之间的最小值是沿着“薄”亮环的最小值。因此,最小间距是很难找到的。但是如果我们做一个从笛卡尔到极坐标的变换,我们可以得到每行的最大值,然后从中找到最大值和最小值


输入:


泛洪图像:

缩放距离图像:

缩放极轴图像:

实际(未缩放)最大和最小间距:

最大间距:158.99530029296875

最大间距:158.770294418945312 最小间距:64.1787109375



在Python/OpenCV中实现这一点的一种方法是对内部进行泛洪填充,然后获得距离变换。两个多边形之间的最大间距是距离图像中最大值的两倍。多边形之间的距离是多边形中间的“薄”亮环的两倍值-两个多边形之间的局部最大值,所以环之间的最小值是沿着“薄”亮环的最小值。因此,最小间距是很难找到的。但是如果我们做一个从笛卡尔到极坐标的变换,我们可以得到每行的最大值,然后从中找到最大值和最小值


输入:


泛洪图像:

缩放距离图像:

缩放极轴图像:

实际(未缩放)最大和最小间距:

最大间距:158.99530029296875

最大间距:158.770294418945312 最小间距:64.1787109375



请正确地编排你的问题。用鼠标选择代码,然后单击格式工具栏中粗体和斜体附近的
{}
按钮。感谢您的反馈您可以绘制(或泛光填充)吗一个最大轮廓的副本,白色背景,黑色背景,然后使用它作为阿尔法通道,这将使最大轮廓可见,它以外的一切不可见(黑色)。是的,但基本上我需要的是两个轮廓之间的最大和最小距离,而试图遵循你的方法,这失败了。实际上,在上面的代码中,我做了一个函数来阻止线条通过最外层的轮廓,但它不起作用。我需要帮助我在代码中没有定义任何函数?您也没有提供输入图像…请正确设置问题格式。用鼠标选择代码,然后单击格式工具栏中粗体和斜体附近的
{}
按钮。感谢您的反馈您可以绘制(或泛光填充)吗一个最大轮廓的副本,白色背景,黑色背景,然后使用它作为阿尔法通道,这将使最大轮廓可见,它以外的一切不可见(黑色)。是的,但基本上我需要的是两个轮廓之间的最大和最小距离,而试图遵循你的方法,这失败了。实际上,在上面的代码中,我做了一个函数来阻止线条通过最外层的轮廓,但它不起作用。我需要帮助我在代码中没有定义任何函数?您也没有提供输入图像…同样,您可以对较小的形状进行距离变换,直到图像边缘,然后沿较大的多边形读取距离变换值。
@Cris Luengo
好主意!同样,您可以对较小的形状进行距离变换,直到图像边缘,然后沿较大的多边形读取距离变换值。
@Cris Luengo
好主意!
    import numpy as np
    import cv2

    img = cv2.imread('Desktop/ImQ5/Image(i).png', 0)
    ret, img =cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
    img_bw = img<=120
    img_bw =img_bw.astype('uint8')
    
    contours0, hierarchy = cv2.findContours( img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    outer_ellipse = [cv2.approxPolyDP(contours0[0], 0.1, True)]
    inner_ellipse = [cv2.approxPolyDP(contours0[0], 0.1, True)]
    
    h, w = img.shape[:2]
    
    vis = np.zeros((h, w, 3), np.uint8)
    
    out=img.copy()
    
    ref = np.zeros_like(img_bw)
    
    cv2.drawContours( vis, outer_ellipse, -1, (255,0,0), 1)
    
    cv2.drawContours( vis, inner_ellipse, -1, (0,0,255), 1)

    cnt_outer = np.vstack(outer_ellipse).squeeze()
    
    cnt_inner = np.vstack(inner_ellipse).squeeze()
    
    ref = np.zeros_like(img_bw)

    # Determine centroid
    
    M = cv2.moments(cnt_inner)
    
    cx = int(M['m10']/M['m00'])
    
    cy = int(M['m01']/M['m00'])
    
    print(cx, cy)
    
    width = img.shape[1]

    height = img.shape[0]
    
    # Define the total number of angles we want
    
    N = 20

    for i in range(N):
    
     tmp = np.zeros_like(img_bw)
    
     theta = i*(360/N)
    
     theta *= np.pi/180.0

    cv2.line(out, (cx, cy),
       (int(cx+np.cos(theta)*w),
         int(cy-np.sin(theta)*h)), (255,0,0), 1)
    
    (row,col) = np.nonzero(np.logical_and(tmp, ref))
     
    cv2.line(out, (cx, cy), (col[0],row[0],(255,0,0), 1))
    
    # Show the image
    
    cv2.imshow('Output', out)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()
import cv2
import numpy as np
import skimage.exposure

# read image
img = cv2.imread('polygons.png')
h, w = img.shape[:2]

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold to binary
thresh = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)[1]

# create zeros mask 2 pixels larger in each dimension
mask = np.zeros([h + 2, w + 2], np.uint8)

# floodfill white between two polygons at 240,240
ffimg = thresh.copy()
ffimg = cv2.floodFill(ffimg, mask, (240,240), 255)[1]

# apply distance transform
distimg = ffimg.copy()
distimg = cv2.distanceTransform(distimg, cv2.DIST_L2, 5)

# Maximum spacing between polygons is 2 * largest value in distimg
max = 2*np.amax(distimg)
print('maximum spacing:', max)

print('')

# convert to polar image using (any) point in the center 'hole' of distimg
polar = cv2.warpPolar(distimg, (360,360), (320,330), 250, cv2.INTER_CUBIC+cv2.WARP_POLAR_LINEAR)

# get maximum value along each row
polar_max = np.amax(polar, axis=1)

# find max and min values from row maximum values
max = 2*np.amax(polar_max)
min = 2*np.amin(polar_max)
print('maximum spacing:', max)
print('minimum spacing:', min)

# scale distance image for viewing
distimg = skimage.exposure.rescale_intensity(distimg, in_range='image', out_range=(0,255))
distimg = distimg.astype(np.uint8)

# scale polar image for viewing
polar = skimage.exposure.rescale_intensity(polar, in_range='image', out_range=(0,255))
polar = polar.astype(np.uint8)

# save image
cv2.imwrite('polygons_floodfill.png',ffimg)
cv2.imwrite('polygons_distance.png',distimg)
cv2.imwrite('polygons_distance_polar.png',polar)

# show the images
cv2.imshow("thresh", thresh)
cv2.imshow("floodfill", ffimg)
cv2.imshow("distance", distimg)
cv2.imshow("polar", polar)
cv2.waitKey(0)
cv2.destroyAllWindows()