gpt4 book ai didi

python - 正确关闭使用 skimage.measure.find_contours() 生成的多边形

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:24 27 4
gpt4 key购买 nike

我目前正在使用 skimage.measure.find_contours() 来查找表面上的轮廓。现在我已经找到了轮廓,我需要能够找到它们所包含的区域。

当所有顶点都在数据集中时,这很好,因为具有完全封闭的多边形。但是,如果轮廓在边缘或角处突破表面的边缘,我如何确保多边形完全封闭?发生这种情况时,我想使用曲面的边缘作为附加顶点来关闭多边形。例如在下图中,显示了等高线,您可以看到等高线在图像的边缘结束,我该如何关闭它们?同样在棕色轮廓的例子中,它只是一条线,我不认为我想要返回一个区域,我如何挑出这种情况?

Contour example

我知道我可以通过检查多边形的最后一个顶点是否与第一个顶点相同来检查封闭的轮廓/多边形。

我有计算多边形内面积的代码,取自 here

def find_area(array):
a = 0
ox,oy = array[0]
for x,y in array[1:]:
a += (x*oy-y*ox)
ox,oy = x,y
return -a/2

我只需要帮助关闭多边形。并检查可能发生的不同情况。

谢谢

更新:

应用@soupault 建议的解决方案后,我得到了这段代码:

import numpy as np
import matplotlib.pyplot as plt

from skimage import measure


# Construct some test data
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]
r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))

# Coordinates of point of interest
pt = [(49,75)]

# Apply thresholding to the surface
threshold = 0.8
blobs = r > threshold

# Make a labelled image based on the thresholding regions
blobs_labels = measure.label(blobs, background = 0)

# Show the thresholded regions
plt.figure()
plt.imshow(blobs_labels, cmap='spectral')

# Apply regionprops to charactersie each of the regions
props = measure.regionprops(blobs_labels, intensity_image = r)

# Loop through each region in regionprops, identify if the point of interest is
# in that region. If so, plot the region and print it's area.
plt.figure()
plt.imshow(r, cmap='Greys')
plt.plot(pt[0][0], pt[0][1],'rx')
for prop in props:
coords = prop.coords
if np.sum(np.all(coords[:,[1,0]] == pt[0], axis=1)):
plt.plot(coords[:,1],coords[:,0],'r.')
print(prop.area)

此解决方案假定每个像素的大小为 1x1。在我的真实数据解决方案中,情况并非如此,因此我还应用了以下函数对数据应用线性插值。我相信你也可以应用类似的功能来缩小每个像素的面积并提高数据的分辨率。

import numpy as np
from scipy import interpolate

def interpolate_patch(x,y,patch):
x_interp = np.arange(np.ceil(x[0]), x[-1], 1)
y_interp = np.arange(np.ceil(y[0]), y[-1], 1)

f = interpolate.interp2d(x, y, patch, kind='linear')

patch_interp = f(x_interp, y_interp)

return x_interp, y_interp, patch_interp

最佳答案

如果您需要测量不同区域的属性,很自然地会从找到区域(而不是轮廓)开始。

在这种情况下,算法如下:

  1. 准备一张带标签的图片:

    1.a 用不同的颜色填充不同轮廓线之间的区域;

    1.b 或者应用一些图像阈值函数,然后运行 ​​skimage.measure.label ( http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.label );

  2. 使用非常标记的图像作为输入(http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops)执行 regionprops

  3. 遍历 regionprops 中的区域并计算所需的参数(面积、周长等)。

通过 regionprops 识别图像中的区域后,您可以为每个区域调用 .coords 以获得封闭的轮廓。

关于python - 正确关闭使用 skimage.measure.find_contours() 生成的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47213246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com