Phi*_*p G 3 matlab analytics properties image-processing object
我面临一个众所周知的问题,我无法解决.我有一张根的图片(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);
Run Code Online (Sandbox Code Playgroud)
这导致我的骨架图片 - 这是一个很大的进步,谢谢你!我有点想要计算距离.我如何解释MatLab必须计算从所有小根到主根的距离(如何定义?)?为此,我必须首先使用直径,对吧?
您是否可以给出一个或另一个提示更多如何完成距离/长度问题?
谢谢你们的帮助,直到这里!
菲利普
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
好的,我设法将单个根部分开.这不是你的编辑提出的,但至少是一些东西.我也有所有根的总长度 - 也不错.但即使(我假设)超级简单的一步一步的解释,我从来没有见过这样的树.我停下来,我必须选择一个看不见的点 - 其余的对我来说太先进了.我不想浪费更多的时间,我非常感谢你给我的帮助.但我想我太MatLab愚蠢了要完成这个:)谢谢!继续这样,这真的很有帮助.
菲利普
对于一个起点,我不认为该图像需要3439x2439的分辨率,它似乎没有添加任何重要的问题,所以我只是使用800x567的调整版本(虽然应该将此答案应用于更大版本(几乎)没问题.另外,你提到regionprops但我没有看到你如何获得二进制图像的任何描述,所以让我们从头开始.
我在LAB颜色空间中考虑了你的图像,然后通过Otsu对L通道进行了二值化,对此结果进行了扩张,将前景视为黑色(同样可以通过应用侵蚀来完成),最后删除小组件.与直接亮度公式相比,L通道可以更好地表示图像,从而简化分割.扩张(或侵蚀)是为了加入次要特征,因为有相当多的分支似乎是无关紧要的.这产生了以下图像:

在这一点上,我们可以尝试使用距离变换结合灰色锚定骨架(参见Soille关于形态学的书,和/或Ranwez和Soille的"二阶和灰色调锚定骨架的顺序独立同伦变薄").但是,由于后者不容易获得,我会在这里考虑更简单的事情.如果我们在上面的图像中执行孔填充,然后进行细化和修剪,我们会得到许多根之间连接的粗略草图.下图显示了由原始图像组成的此步骤的结果(并且为了更好的可视化而扩展):

正如所料,由于孔填充,变薄的图像采用"快捷方式".但是,如果没有执行这样的步骤,那么我们最终会在这张图片中出现循环 - 这是我想避免的.然而,它似乎提供了与实际根的大小相当的近似值.
现在我们需要计算分支(或根)的大小.首先是决定主根的位置.这可以通过在扩张之前使用上述二进制图像并考虑距离变换来完成,但这不会在这里完成 - 我的兴趣只是显示计算这些长度的可行性.假设您知道主根的位置,我们需要找到从给定根到它的路径,然后该路径的大小就是该根的大小.观察一下,如果我们从稀疏图像中消除分支点,我们会得到一组很好的连接组件:

假设每个端点的根部的端部,则根的大小是将主根的最短路径,并且该路径是由只是示出图像中的连通分量的集合组成的.现在,您可以找到最大的,第二大的,以及可以通过此过程计算的所有其他.
编辑:
为了使最后一步清楚,首先让我们标记找到的所有分支(在新选项卡中打开图像以获得更好的可视化):

现在,每个分支的"数字"长度只是组件中的像素数量.您可以稍后通过考虑添加到图像的对象将此值转换为"真实世界"长度.请注意,此时根本不需要依赖图像处理算法,我们可以从这个表示构造一个树并在那里工作.树内置于以下方式:1)找出属于主根(这是"不可见的点"标签15,16之间,以及17以上的图像中)的骨架的分支点; 2)从该点到连接到它的每个分支创建一条边; 3)根据行进到另一个分支开始所需的像素量,为边缘分配权重; 4)重复新的起始分支.例如,在初始点,它需要0个像素,到达分支15,16的开始,和17.然后,从分支15,直到它的端部开始到达到,它需要的大小(像素数) 15.此时我们在此路径中没有其他任何内容可访问,因此我们创建了一个叶节点.对所有其他分支重复相同的过程.例如,以下是此标记的完整树(以下树的双重表示更节省空间):

现在找到最大的加权路径 - 对应于最大根的大小 - 依此类推.