gpt4 book ai didi

matlab - 获取BW或RGB图片中不规则物体的长度,并将其绘制到图片中以进行控制

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:42 25 4
gpt4 key购买 nike

我面临着一个我无法解决的众所周知的问题。
我有根的照片(http://cl.ly/image/2W3C0a3X0a3Y)从这张图片中,我想知道最长的根的长度(第一个问题),大根和小根的部分(比如直径作为第二个问题的方向)重要的是,我可以区分细根和大根,因为这或多或少是研究的目的(它们的一部分在不同物种之间比较)最后一件事,我想沿着被测最长的根画一条线,检查所有的测量是否正确。
对于最长的根的长度,我尝试使用regionprops(),这不是最优的,因为如果我做得对的话,它假定一个椭圆形作为基本形状。
然而,我真正需要支持的是:
我怎样才能得到最长的根的长度(起点应该是最长的根离开最大直径的主根的地方)?
有没有可能区分细根和大根,我能得到它们的一部分(硬币,图像中的圆形物体为参考)
我能在图片中画出长度和直径之类的属性吗?
我发现了如何画椭圆和其他东西的中心线,但是我不知道如何用建议的值来画。
我希望这不是双柱,这个问题在其他地方是不存在的,如果是的话,我很抱歉。
我要感谢这个论坛上的人,你们做得很好,每个有问题的人都能有你们在这里。
谢谢你的帮助,
菲利普
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
编辑
我遵循了建议的解决方案,代码如下:

clc
clear all
close all

img=imread('root_test.jpg');

labTransformation = makecform('srgb2lab');
labI = applycform(img,labTransformation);

%seperate l,a,b
l = labI(:,:,1);
a = labI(:,:,2);
b = labI(:,:,3);

level = graythresh(l);
bw = im2bw(l);
bw = ~bw;
bw = bwareaopen(bw, 200);
se = strel('disk', 5);
bw2=imdilate(bw, se);
bw2 = imfill(bw2, 'holes');
bw3 =bwmorph(bw2, 'thin', 5);
bw3=double(bw3);
I4 = bwmorph(bw3, 'skel', 200);
%se = strel('disk', 10);%this step is for better visibility of the line
%bw4=imdilate(I4, se);
D = bwdist(I4);

这是我的骨架图-这是一个伟大的进步,谢谢你!!!
我在计算距离的时候有点紧张我如何解释MatLab必须计算从所有小根到主根的距离(如何定义这个?)?为此,我必须先处理直径,对吗?
你能不能再给我一个或另一个提示,如何解决距离/长度问题?
谢谢你一直以来的帮助!
菲利普
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
编辑2
好的,我设法分离了单个根部分这不是你的编辑所建议的,但至少有些东西我也有所有根的总长度-还不错但即使是(我想)非常简单的一步一步的解释,我也从未见过这样的树我停下来的时候,我必须选择一个看不见的点-其余的对我来说太先进了。
我不想浪费更多的时间,我非常感谢你已经给我的帮助但我想我太笨了,没法做到这一点:)
谢谢!继续这样下去,真的很有帮助。
菲利普

最佳答案

作为一个预先的出发点,我不认为需要对该图像的分辨率为3439x2439,它似乎没有添加任何重要的问题,所以我只是使用了800x567的大小调整版本(尽管应该(几乎)没有问题将这个答案应用到更大的版本)另外,您提到了regionprops,但我没有看到任何关于如何获得二进制图像的描述,所以让我们从头开始。
我在实验室的色彩空间中考虑了你的图像,然后用Otsu对L通道进行了二值化,在前景为黑色的情况下对结果进行了放大(同样的方法也可以通过腐蚀来实现),最后去掉了一些小的成分与更直接的luma公式相比,L通道能更好地表示图像,从而更容易分割膨胀(或侵蚀)是为了连接小的特征,因为有相当多的分支看起来是不相关的这产生了以下图像:
在这一点上,我们可以尝试使用距离变换与灰调锚定骨架相结合(见Soille的形态学书籍,和/或Ranwez和Soille的“二元和灰调锚定骨架的顺序无关同伦细化”)但是,由于后者不易获得,我将在这里考虑一些更简单的东西如果我们在上面的图像中进行空洞填充,然后进行细化和修剪,我们将得到许多根之间连接的粗略草图下图显示了此步骤与原始图像合成的结果(并进行了放大以获得更好的可视化效果):
不出所料,由于孔洞填充,细化后的图像会走“捷径”但是,如果不执行这样的步骤,那么我们将在这个图像中结束循环——这是我想在这里避免的然而,它似乎为实际根的大小提供了一个像样的近似值。
现在我们需要计算分支(或根)的大小第一件事是决定主根在哪里这可以通过在扩张之前使用上面的二值图像并考虑距离变换来实现,但这里不会这样做——我的兴趣只是展示计算这些长度的可行性假设你知道你的主根在哪里,我们需要找到一条从给定根到它的路径,然后这个路径的大小就是这个根的大小注意,如果我们从细化图像中消除分支点,我们将得到一组很好的连接组件:
假设每个端点都是根的端点,那么根的大小是到主根的最短路径,路径由刚刚显示的图像中的一组连接组件组成现在你可以找到最大的,第二大的,和所有其他可以通过这个过程计算的。
编辑:
为了明确最后一步,首先让我们标记找到的所有分支(在新选项卡中打开图像以获得更好的可视化效果):
现在,每个分支的“数字”长度只是组件中像素的数量稍后,通过考虑添加到图像中的对象,可以将该值转换为“真实”长度请注意,此时根本不需要依赖于图像处理算法,我们可以根据此表示构造树并在那里工作树的构建方式如下:1)在骨架中找到属于主根的分支点(这是上图中标签15、16和17之间的“不可见点”);2)从该点到连接到它的每个分支创建一条边3)根据移动到另一个分支开始所需的像素数量为边缘分配权重;4)对新的开始分支重复例如,在初始点,到达分支15、16和17的开头需要0个像素然后,为了从分支15的开始到其结束,它取分支15的大小(像素数)在这一点上,我们在这个路径中没有其他访问对象,因此我们创建一个叶节点对所有其他分支重复相同的过程例如,这里是这个标签的完整树(以下树的双重表示更节省空间):
现在找到最大的加权路径——对应于最大根的大小——依此类推。

关于matlab - 获取BW或RGB图片中不规则物体的长度,并将其绘制到图片中以进行控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com