Skimage.draw.ellipse产生了两条不受欢迎的线。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Skimage.draw.ellipse产生了两条不受欢迎的线。相关的知识,希望对你有一定的参考价值。

我有一个布尔图像,其中零点是背景,我想绘制一个椭圆,它包围了一个对象的主要和次要轴,从 skimage.measure.regionprops. 该模块 skimage.draw.ellipse_perimeter 生成预期的椭圆,但也有两条不受欢迎的线。

代码(输入的图像是 此处):

import skimage
import skimage.draw
from skimage.measure import label
from skimage.measure import regionprops
import matplotlib.pyplot as plt

# load example image
TP_mask = plt.imread('https://i.stack.imgur.com/UYLE0.png')

# connect region with same integer value
region = label(TP_mask)

# obtain RegionProperties
props = regionprops(region)
props = props[0]

# define centroid
y0,x0 = props.centroid

# draw ellipse perimeter
rr,cc = skimage.draw.ellipse_perimeter(int(x0),int(y0),int(props.minor_axis_length*0.5),int(props.major_axis_length*0.5), orientation = props.orientation)

# plot
plt.plot(rr,cc, color = 'yellow')
plt.imshow(TP_mask, cmap = 'gray')
plt.show()

然而,如果我创建一个简化的例子,如下所示,我得到了预期的椭圆。谁能帮助我理解我到底做错了什么?

import numpy as np

img = np.zeros((1000,1000))
img[200:800,200:400] = 1

region = label(img)

props = regionprops(region)

props = props[0]

y0,x0 = props.centroid

rr,cc = skimage.draw.ellipse_perimeter(int(x0),int(y0),int(props.minor_axis_length*0.5),int(props.major_axis_length*0.5), orientation = props.orientation)

plt.plot(rr,cc, color = 'yellow')
plt.imshow(img, cmap = 'gray')
plt.show()

enter image description here

答案

事实证明,由该模块返回的坐标是由 draw 模块被设计成索引到一个数组中,如图所示。本例而不是情节。

rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=math.pi / 4.)
img[rr, cc, :] = (1, 0, 1)

要用 plt.plot 和做线图,坐标需要在绕圆椭圆时进行排序。它们是 默认情况下正确排序,因为椭圆实际上是在四个独立的象限中绘制的,你可以通过 审视源代码的相关部分. (线索:这些线正好打在椭圆垂直或水平的地方)。

由于你有一个凸面,计算每个点与椭圆中心之间的角度就足以对点进行分类。试试下面的方法。

fig, ax = plt.subplots()
_ = ax.imshow(TP_mask, cmap='gray')

angle = np.arctan2(rr - np.mean(rr), cc - np.mean(cc))
sorted_by_angle = np.argsort(angle)
rrs = rr[sorted_by_angle]
ccs = cc[sorted_by_angle]

_ = ax.plot(rrs, ccs, color='red')

结果是:

enter image description here

以上是关于Skimage.draw.ellipse产生了两条不受欢迎的线。的主要内容,如果未能解决你的问题,请参考以下文章

spring-redis 发布订阅模式:发布一条消息收到了两条,重复监听

幂等性

高并发下如何保证接口的幂等性?

高并发下如何保证接口的幂等性?

高并发下如何保证接口的幂等性?

测试 R 中两条生存曲线是不是不同