假设: -该图像可以被认为是只有 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 循环中,此代码从左到右扫描图像,但是您可以更改它...