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()
答案
事实证明,由该模块返回的坐标是由 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')
结果是:
以上是关于Skimage.draw.ellipse产生了两条不受欢迎的线。的主要内容,如果未能解决你的问题,请参考以下文章