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)))
有什么解决这个问题的建议吗?还有没有其他方法来测量弧的长度?在我看来,这是一张图,节点是端点,它们通过路径连接。因此,每个点可能(或不)连接到任何其他点,您需要找到最长的路径 所以,您需要找到所有端点,从每个端点开始迭代,直到到达另一个端点。完成所有点后,你可以走最长的路 希望有帮助尝试以下方法
因此,我刚刚发布了一篇文章,希望一些极客能给我们一些有价值的建议 我想过了!但这是一件非常困难的事情,因为你应该考虑你决定走一条路或另一条路的所有点,这就像一棵决策树。你知道如何创建代码来实现这一点吗?