Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 Skimage.draw.ellipse生成两条不需要的线_Python_Image Processing_Scikit Image - Fatal编程技术网

Python Skimage.draw.ellipse生成两条不需要的线

Python Skimage.draw.ellipse生成两条不需要的线,python,image-processing,scikit-image,Python,Image Processing,Scikit Image,我有一个布尔图像,其中零是背景,我想画一个椭圆,它包围从skimage.measure.regionprops检索到的对象的长轴和短轴。模块skimage.draw.ellipse\u Permission生成预期的椭圆,但也生成两条不需要的线 代码(输入图像为): 但是,如果我创建一个如下的简化示例,我将获得预期的椭圆。有人能帮我理解我做错了什么吗 import numpy as np img = np.zeros((1000,1000)) img[200:800,200:400] = 1

我有一个布尔图像,其中零是背景,我想画一个椭圆,它包围从
skimage.measure.regionprops
检索到的对象的长轴和短轴。模块
skimage.draw.ellipse\u Permission
生成预期的椭圆,但也生成两条不需要的线

代码(输入图像为):

但是,如果我创建一个如下的简化示例,我将获得预期的椭圆。有人能帮我理解我做错了什么吗

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\u周长(120400,60,20,方向=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')
其中:


事实证明,
draw
模块返回的坐标被设计为索引到数组中,如图所示,而不是绘图:

rr,cc=ellipse\u周长(120400,60,20,方向=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')
其中:


您能与我们共享您的输入图像吗?这样我们就可以运行代码并帮助诊断问题了?嗨@Juan,我刚刚添加了一个与输入图像的链接。谢谢谢谢这帮我为你找到了答案!=)你能和我们分享你的输入图像吗,这样我们就可以运行代码并帮助诊断问题了?嗨@Juan,我刚刚添加了一个与输入图像的链接。谢谢谢谢这帮我为你找到了答案!=)非常感谢您对@Juan的详细而直接的解释。非常感谢您对@Juan的详细而直接的解释。