图像处理基础知识

时间:2012-07-28 14:53:44

标签: c image-processing matlab fiber

enter image description here

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

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

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

此致 阿迪

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

EDIT2 - 我发现了research article如何使用Hough变换计算长度,但我无法在MATLAB中实现它。有人请帮忙

5 个答案:

答案 0 :(得分:2)

如果您的图像与您发布的图像一样干净,那么这是一个非常简单的问题。

我尝试的第一种技术是使用Hough Transform来估计线参数,OpenCV中有一个很好的implementation算法。拥有它们之后,您可以根据您拥有的其他任何限制来估计它们的长度。

答案 1 :(得分:0)

我认为问题是双重的: 1)从起始位置找到起点和终点。 2)确定起点和终点之间的长度

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

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

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

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

答案 2 :(得分:0)

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

根据这些假设: 开始扫描图像边框(从您想要的任何方向开始,只需要保持一致),直到遇到第一个白色像素为止。此时您的程序将会明白这绝对是一个起点。通过了解这一点,您将收集所有白色像素,直到达到某个限制(或阈值)。这里的想法是,如果有光纤,你将得到光纤和边界之间的角度,起点就在......当然你得到的像素越多(你得到的内部)你就越确定结束。这是最棘手的部分。在某种程度上以一条线结束...你需要计算角度(基本三角法)。由于您知道起点,图像的宽度/高度以及角度(或者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循环中,此代码从左到右扫描图像,但是您可以更改此...

答案 3 :(得分:0)

既然你了解C ++和C,我会推荐OpenCV 。它是开源的,所以如果你不相信像我这样的人,你就不会有问题;)。此外,如果你想使用像#VictorS这样的C#。提到我会使用EmguCV这是OpenCV的C#等效物。包含OpenCV教程,可以找到EmguCV on their website。希望这有帮助!

答案 4 :(得分:0)

下载并安装最新版本的3Dslicer, 加载数据,然后转到没有Atlas的package> EM segmenter>

segmentation

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

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

edges

black areas

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