3

在此处输入图像描述

我必须做一些图像处理,但我不知道从哪里开始。我的问题如下: -

我有一个 2D 纤维图像(附在这篇文章中),其中纤维边缘用白色表示,纤维内部是黑色的。我想选择光纤内的任何黑色像素,然后沿着光纤的长度从它移动。这将涉及将对比度与周围像素进行比较,然后沿所需方向行进。我的主要目的是找到纤维的长度

那么有人可以告诉我至少从哪里开始吗?我已经在脑海中制定了一个关于如何解决我的问题的粗略算法,但我什至不知道要使用哪个软件/库。

问候阿迪

EDIT1 - 我开始使用 MATLAB 而不是 OpenCV,因为我发现它更容易。我应用了 Hough 变换,然后应用了最大编号的 Houghpeaks 函数。峰数 = 100,以便包括所有纤维。之后,我得到了以下图像。我现在如何找到长度?

EDIT2 - 我找到了一篇关于如何使用霍夫变换计算长度的研究文章,但我无法在 MATLAB 中实现它。有人请帮忙

4

5 回答 5

2

如果你的图片都和你发布的一样干净,这是一个很容易的问题。

我尝试的第一个技术是使用霍夫变换来估计线参数,并且在 OpenCV 中有一个很好的算法实现。拥有它们之后,您可以根据您拥有的任何其他限制以任何您想要的方式估计它们的长度。

于 2012-07-29T04:07:29.270 回答
0

既然您了解 C++ 和 C,我会推荐OpenCV 。它是开源的,所以如果你不信任像我这样的人,你不会有问题;)。此外,如果您想使用像 @VictorS 这样的 C#。提到我会使用EmguCV,它是 OpenCV 的 C# 等价物。包括 OpenCV 的教程,EmguCV 的教程可以在他们的网站上找到。希望这可以帮助!

于 2012-07-29T00:58:26.140 回答
0

假设: -该图像可以被认为是只有 0s(黑色)和 1s(白色)的二进制图像。-所有的纤维都是直的,它们的起点和终点都在边界上。-我们可以提出纤维厚度的限制(白线的厚度)。

在这些假设下:开始扫描图像边界(从任何你想要的任何方向开始......只要保持一致)直到你遇到第一个白色像素。此时你的程序会明白这绝对是一个起点. 通过了解这一点,您将收集所有白色像素,直到达到某个限制(或阈值)。这里的想法是,如果有纤维,您将获得纤维与起点所在边界之间的角度......当然,您获得的像素越多(获得的内部),您在结尾。这是最棘手的部分。在以某种方式结束后......你需要计算角度(基本三角)。由于您知道起点、图像的宽度/高度和角度(或这些角度的 cos/sin),您将获得终点的确切坐标。请注意...这里的准确性并不是您可能真正理解的,因为我们可能(事实是我们会)在 cos/sin 值中存在计算错误。因此,您需要尽可能长时间地保持阈值。因此,您的终点实际上不是一个点,而是一个表明终点可能位于该区域内的区域的区域。剩下的只是简单的数学。

显然,您可以在此方法中添加太多细节,例如检查构成光纤的两条白线并确定哪一条更长,或者您可以允许一些误差余量,因为这些线不会正确笔直......这是一个概念性的地方厚度来到舞台等。

编程:C# 有很好的东西并且易于使用...我将在这里放一些代码...

newBitmap = new Bitmap(openFileDialog1.FileName);

for (int x = 0; x < newBitmap.Width; x++)
{
   for (int y = 0; y < newBitmap.Height; y++)
   {
      Color originalColor = newBitmap.GetPixel(x, y);//gets the pixel value...
      //things go here...
   }
}

您将从 openfiledialog 获取图像并对图像进行位图。在嵌套的 for 循环中,此代码从左到右扫描图像,但是您可以更改它...

于 2012-07-28T21:40:10.437 回答
0

在我看来,问题有两个方面:1)从您的起始位置定位起点和终点。2)确定起点和终点之间的长度

由于我不知道您的输入数据,我假设它是像素数据,每个像素上的 0..1 数据表示它的“白度”。

为了找到终点,我会做某种 WALKER/AI,它试图在不同的位置行走,知道原始位置和最后遍历的方向,然后沿着那条路线继续前进,直到“前进弧”全是白色。这假设纤维有点直(是吗?)。

获得起点和终点后,您可以将它们输入到 aa* 路径查找算法中,并为黑色像素赋予低值而白色非常高。然后找到起点和终点之间的最短距离,即光纤的长度。

有点难以提供更多细节,因为我不知道您将使用什么技术以及一些示例输入数据。

于 2012-07-28T15:43:37.367 回答
0

下载并安装最新版本的 3Dslicer,加载您的数据并进入软件包>EM 分段器,无需 Atlas>

分割

在 2 个不同的标签中选择您的解剖树,后面的标签是您的目的,白色边缘。选择整个 2D 图像作为您的 ROI,然后单击分段。

这是结果,我将边缘标记为绿色,将黑色区域标记为白色

边缘

黑色区域

您可以修改您的树并更改您定义的结构。您可以为分割提供更多样本以使其更准确。

于 2018-10-26T10:54:58.620 回答