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
Image processing 如何在图片中找到路径(曲线)的长度? 我想在图片中找到一条路径的长度,这可以是一条蠕虫的长度,一头卷曲的人发,Amazon河等。考虑一下这幅Amazon河图片: _Image Processing_Measure_Scikit Image - Fatal编程技术网

Image processing 如何在图片中找到路径(曲线)的长度? 我想在图片中找到一条路径的长度,这可以是一条蠕虫的长度,一头卷曲的人发,Amazon河等。考虑一下这幅Amazon河图片:

Image processing 如何在图片中找到路径(曲线)的长度? 我想在图片中找到一条路径的长度,这可以是一条蠕虫的长度,一头卷曲的人发,Amazon河等。考虑一下这幅Amazon河图片: ,image-processing,measure,scikit-image,Image Processing,Measure,Scikit Image,我尝试在二值化后为图片制作骨架,但问题是骨架(通过两种方法获得)有许多小分支,导致它们的面积远远超过路径的近似长度。我过去常这样做。以下是代码和结果: from skimage.filter import threshold_otsu from skimage import io from skimage.filter.rank import median from skimage.morphology import disk,skeletonize,medial_axis,remove_sma

我尝试在二值化后为图片制作骨架,但问题是骨架(通过两种方法获得)有许多小分支,导致它们的面积远远超过路径的近似长度。我过去常这样做。以下是代码和结果:

from skimage.filter import threshold_otsu
from skimage import io
from skimage.filter.rank import median
from skimage.morphology import disk,skeletonize,medial_axis,remove_small_objects
import matplotlib.pyplot as plt


input_image = io.imread('Amazon-river2.jpg',
                    as_grey=True, plugin=None, flatten=None)
image = median(input_image, disk(15)) 

thresh = threshold_otsu(image)
image = image < thresh

skel1=skeletonize(image)
skel2=medial_axis(image)

min_size=sum(sum(skel1))/2

remove_small_objects(skel1,min_size=min_size,connectivity=5,in_place=True)

remove_small_objects(skel2,min_size=min_size,connectivity=5,in_place=True)


fig2, ax = plt.subplots(2, 2, figsize=(24, 12))

ax[0,0].imshow(input_image,cmap=plt.cm.gray)
ax[0,0].set_title('Input image')
ax[0,0].axis('image')
ax[0,1].imshow(image, cmap=plt.cm.gray)
ax[0,1].set_title('Binary image')
ax[0,1].axis('image')
ax[1,0].imshow(skel1, cmap=plt.cm.gray)
ax[1,0].set_title('Skeleton')
ax[1,0].axis('image')
ax[1,1].imshow(skel2,cmap=plt.cm.gray)
ax[1,1].set_title('Sleleton - Medial axis')
ax[1,1].axis('image')

plt.show()


print ("Length 1: {0}".format(sum(sum(skel1))))
print ("Length 2: {0}".format(sum(sum(skel2))))
来自skimage.filter导入阈值\u otsu
从撇渣进口io
从skimage.filter.rank导入中值
从skimage.形态学导入磁盘,骨骼化,中轴,移除小对象
将matplotlib.pyplot作为plt导入
input_image=io.imread('Amazon-river2.jpg',
as_grey=True,plugin=None,flatte=None)
图像=中值(输入图像,磁盘(15))
thresh=阈值_otsu(图像)
图像=图像<阈值
skel1=骨架化(图像)
skel2=中间轴(图像)
最小尺寸=总和(总和(skel1))/2
删除小对象(skel1,最小大小=最小大小,连接性=5,在位置=真)
删除小对象(skel2,最小大小=最小大小,连接性=5,in_place=True)
图2,ax=plt.子批次(2,2,figsize=(24,12))
ax[0,0].imshow(输入图像,cmap=plt.cm.gray)
ax[0,0]。设置标题(“输入图像”)
ax[0,0]。轴('图像')
ax[0,1].imshow(图像,cmap=plt.cm.gray)
ax[0,1]。设置标题(“二进制图像”)
ax[0,1]。轴('图像')
ax[1,0].imshow(skel1,cmap=plt.cm.gray)
ax[1,0]。设置标题(“骨架”)
ax[1,0]。轴('图像')
ax[1,1].imshow(skel2,cmap=plt.cm.gray)
ax[1,1]。设置标题(“斯莱尔顿-中轴”)
ax[1,1]。轴('图像')
plt.show()
打印(“长度1:{0}”。格式(sum(sum(skel1)))
打印(“长度2:{0}”。格式(sum(sum(skel2)))


有什么解决这个问题的建议吗?还有没有其他方法来测量弧的长度?

在我看来,这是一张图,节点是端点,它们通过路径连接。因此,每个点可能(或不)连接到任何其他点,您需要找到最长的路径

所以,您需要找到所有端点,从每个端点开始迭代,直到到达另一个端点。完成所有点后,你可以走最长的路

希望有帮助

尝试以下方法

  • 在R或B通道上执行颜色分割,而不是RGB->灰色
  • 代替greythresh Otsu,选择手动设置阈值或使用multithresh Otsu(python中也应该有)
  • 在对二值图像进行骨架化之前,执行以下形态学操作:侵蚀->变薄->区域打开。这将消除岛屿
  • 虽然skeletonize总是会有这样的问题,但您可以在二进制文件上进行精明的边缘检测。在每条边上执行以下操作

    完全同意的建议,我认为NetworkX应该能够完成计算最长轨迹/路线的工作,但是如何自动提取端点或交叉点作为节点并计算加权边的距离仍然是一项艰巨而富有挑战性的任务


    因此,我刚刚发布了一篇文章,希望一些极客能给我们一些有价值的建议

    我想过了!但这是一件非常困难的事情,因为你应该考虑你决定走一条路或另一条路的所有点,这就像一棵决策树。你知道如何创建代码来实现这一点吗?