Python中文
首页
教程
问答
标签
搜索
登录
注册
重新排序图像骨架坐标以使interp1d工作b
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>在一个学校项目中,我正在分析一些elegans图像的中心线。我已经成功地生成了一个合理的阈值,并使用<code>skimage.morphology.skeletonize</code>来生成中心线:</p> <p><a href="https://i.stack.imgur.com/kVqz2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kVqz2.png" alt="enter image description here"/></a></p> <p>然后我使用<code>np.nonzero</code>来获得中心线的坐标,最终目标是参数化这些点,以获得对中心线几何的一些了解。在</p> <p>但是,当我使用<code>scipy.interpolate.interp1d</code>时,我得到了这样的混乱: <a href="https://i.stack.imgur.com/rfxtj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/rfxtj.png" alt="enter image description here"/></a> 我相当肯定会发生这种情况,因为当<code>np.nonzero</code>查找非零值时,它会自下而上、从右向左排列,并按这样的顺序排列点,这就是为什么在插值过程中会出现锯齿效应。有什么方法可以重新排列这些点,使<code>interp1d</code>更好地处理它们?在</p> <p>这是我的代码:</p> <pre><code>import cv2 import numpy as np from matplotlib import pyplot as plt from scipy import ndimage from scipy import stats from scipy import misc from skimage.morphology import skeletonize from scipy.interpolate import interp1d """Curved Worm""" img = misc.imread("model_image_crop_curved.tif") plt.imshow(img) plt.show() imgThresh = img>200 plt.imshow(imgThresh) plt.show() misc.imsave('model_image_crop_curved_binary.tif',imgThresh) imgSkel = skeletonize(imgThresh) plt.imshow(imgSkel) plt.show() misc.imsave('model_image_crop_curved_skeleton.tif',imgSkel) cv2Skel = cv2.imread('model_image_crop_curved_skeleton.tif',cv2.IMREAD_GRAYSCALE) skelCoord = np.nonzero(imgSkel) x = skelCoord[1] y = skelCoord[0] plt.plot(x,y,'.') plt.show() i = np.arange(len(x)) interp_i = np.linspace(0,i.max(),5*i.max()) interpKind = 'linear' xi = interp1d(i,x,kind=interpKind)(interp_i) yi = interp1d(i,y,kind=interpKind)(interp_i) fig, ax = plt.subplots() ax.plot(xi,yi,'b-') ax.plot(x,y,'ko') plt.show() </code></pre> <p>以下是我从<code>np.nonzero</code>得到的观点:</p> ^{pr2}$ <p><strong>编辑</strong></p> <p>为了解决订购问题,我遵循了ev-br的建议,从终点开始。我使用了一系列可能的端点方向和<code>ndimage.binary_hit_or_miss</code>函数来隔离端点。然后我编写了一个函数,通过检查每个像素的邻域以查找骨架中的下一个像素,移动到该像素,并保存一个运行列表。这个运行列表成了我要寻找的有序点集。在</p> <p>然而,在经历了几个小时的挫折之后(包括花了整整半个小时为一个很容易解决的问题而苦恼,在我的一个<code>if</code>语句中用<code>or</code>来代替{<cd8>}),我意识到,当我插入这些数据点时,它们确实没有提供太多额外的信息。因为我沿着骨架行走收集的数据点本身是参数化的,所以我所做的任何参数化分析都可以使用这些点。所以,虽然我知道如何对点排序是件好事,但无论如何插值并不是最终目标。在</p> <p>如果有人想看到我为实现这一点而编写的代码,请给我留言,我很乐意与大家分享。在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>正如您所注意到的,您需要对非零像素进行排序。既然您已经对图像进行了骨架化,您可以从一个端点(它正好有一个邻居)开始,沿着路径一直走到另一个端点。这样,就得到了一个有序的像素坐标列表,然后对其进行插值。但是请注意,如何参数化曲线的问题并不简单,您可能需要做的事情不仅仅是在<code>interp1d</code></p> <p>搜索互联网的关键词之一是“分析骨架”。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何为此数据帧创建散点图?
6 回答
如何为此编写Django模板
2 回答
如何为此表达式编写正则表达式?
4 回答
如何为步进电机选择合适的值?
2 回答
如何为每15分钟间隔的日期时间行(在新列中)添加标签?
1 回答
如何为每一列创建汇总表?
2 回答
如何为每一组groupbyPandas做滚动“得到假人”
8 回答
如何为每一行分别运行函数(python)?
4 回答
如何为每一行生成一个随机数?
1 回答
如何为每一轮将pytorch模型输出存储到numpy
1 回答
如何为每个.py-fi文件创建单独的zip文件
5 回答
如何为每个<li class=”“><a>找到最近的上述同级<li>?
5 回答
如何为每个CSV列生成特定的文件?
1 回答
如何为每个csv文件使用read_csv,即使它是空的?PythonPandas
3 回答
如何为每个CSV文件创建单独的Pandas数据帧并给它们起有意义的名称?
9 回答
如何为每个datetime和每个id创建一行?
3 回答
如何为每个Django型号选择赋予不同的颜色
7 回答
如何为每个Django模型实例安排一个周期性的芹菜任务?
8 回答
如何为每个Django视图设置一个装饰器?
9 回答
如何为每个for循环迭代分配变量
8 回答