Matlab 获取BW或RGB图片中不规则对象的长度,并将其绘制到图片中进行控制

Matlab 获取BW或RGB图片中不规则对象的长度,并将其绘制到图片中进行控制,matlab,object,image-processing,properties,analytics,Matlab,Object,Image Processing,Properties,Analytics,我面临一个我无法解决的众所周知的问题。 我有根的图片()。从这张图片中,我想知道最长根的长度(第一个问题),大根和小根的部分(例如直径作为方向,这是第二个问题)。我能区分细根和大根是很重要的,因为这或多或少是本研究的目的(不同物种之间的比较部分)。最后一件事,我想沿着测量的最长根画一条线,以检查所有测量是否正确 对于最长根的长度,我尝试使用regionprops(),这不是最优的,因为如果我做对了,它假设一个椭圆形作为基本形状。 然而,事实上,我真正需要支持的是: 如何获得最长根的长度(起点应为

我面临一个我无法解决的众所周知的问题。 我有根的图片()。从这张图片中,我想知道最长根的长度(第一个问题),大根和小根的部分(例如直径作为方向,这是第二个问题)。我能区分细根和大根是很重要的,因为这或多或少是本研究的目的(不同物种之间的比较部分)。最后一件事,我想沿着测量的最长根画一条线,以检查所有测量是否正确

对于最长根的长度,我尝试使用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

好的,我设法分离了单个根部分。这不是你的编辑所建议的,但至少是一些东西。我也有所有根的总长度——还不错。但即使有(我想)非常简单的一步一步的解释,我也从未见过这样的树。我停在我必须选择一个不可见点的点上——其余的对我来说太高级了。 我不想再浪费时间了,我非常感谢你已经给我的帮助。但我想我太蠢了,没法做到这一点:) 谢谢继续这样下去,真的很有帮助


Phillip

作为一个预先的起点,我不认为该图像需要3439x2439的分辨率,它似乎没有给问题添加任何重要内容,因此我只使用了800x567的大小调整版本(尽管将此答案应用于更大的版本应该(几乎)没有问题)。另外,您提到了
regionprops
,但我没有看到任何关于您如何获得二进制图像的描述,所以让我们从头开始

我在实验室的颜色空间中考虑了你的图像,然后用大津对L通道进行二值化,将前景视为黑色,对结果进行了放大(同样可以通过应用腐蚀来实现),最后移除了小组件。与更直接的luma公式相比,L通道可以更好地表示图像,从而更容易进行分割。膨胀(或侵蚀)是为了连接次要特征,因为有相当多的分支似乎是不相关的。这产生了以下图像:

在这一点上,我们可以尝试将距离变换与灰调锚定骨架相结合(参见Soille关于形态学的书和/或Ranwez和Soille的“二元和灰调锚定骨架的顺序独立同伦细化”)。但是,由于后者不容易得到,我会考虑一些更简单的。如果我们在上面的图像中进行孔洞填充,然后进行细化和修剪,我们可以得到许多根之间连接的粗略草图。下图显示了此步骤的结果,该结果由原始图像组成(并放大以获得更好的可视化效果):

正如预期的那样,由于孔洞填充,减薄图像采用“快捷方式”。但是,如果不执行这样的步骤,那么我们将在这张图中结束循环——这是我想在这里避免的。然而,它似乎为实际根的大小提供了一个合适的近似值

现在我们需要计算分支(或根)的大小。第一件事是确定主根在哪里。这可以通过在膨胀之前使用上面的二值图像并考虑距离变换来实现,但这里不会这样做——我的兴趣只是展示计算这些长度的可行性。假设你知道你的主根在哪里,我们需要找到一条从给定根到它的路径,然后这个路径的大小就是这个根的大小。请注意,如果我们从细化图像中消除分支点,我们会得到一组很好的连接组件:

假设每个端点都是根的端点,则根的大小是到主根的最短路径,该路径由刚刚显示的图像中的一组连接组件组成。现在您可以找到最大的一个,第二个,以及所有其他可以通过这个过程计算的

编辑:

为了弄清楚最后一步,首先让我们做个实验