我工作在一个陌生的项目。 我已经获得,我使用,使模具(金属)的激光切割机。 我可以用坐标机器割断某图像的程序,但我不知道是:我怎么能写一个程序,将采取扫描的图像,这是黑色和白色,并给了我黑色区域的坐标 ? 我不介意它给了,即使我只需要在外线的每一个像素,我能做到这一点的一部分。
我搜索了一会儿,但问题已经有很多成果,比如颜色和像素,我发现吨的不相关的信息,这么多的话。 我想用C ++或C#,但我可以使用包括脚本的任何语言。
我工作在一个陌生的项目。 我已经获得,我使用,使模具(金属)的激光切割机。 我可以用坐标机器割断某图像的程序,但我不知道是:我怎么能写一个程序,将采取扫描的图像,这是黑色和白色,并给了我黑色区域的坐标 ? 我不介意它给了,即使我只需要在外线的每一个像素,我能做到这一点的一部分。
我搜索了一会儿,但问题已经有很多成果,比如颜色和像素,我发现吨的不相关的信息,这么多的话。 我想用C ++或C#,但我可以使用包括脚本的任何语言。
如果我们假定在扫描图像是完全白和全黑没有在中间的颜色,那么我们就可以只取图像作为RGB值的阵列,并且简单地扫描0值。 如果该值为0,它必须是黑色的吗? 然而,图像可能不会是完全的黑,所以你会想要一些回旋的余地。
你做那么什么会是这个样子:
for(int i = 0; i < img.width; i++){
for(int j = 0; j < img.height; j++){
// 20 is an arbitrary value and subject to your opinion and need.
if(img[i][j].color <= 20)
//store i and j, those are your pixel location
}
}
现在,如果您使用C#,它会很容易导入大多数图像格式,坚持时间在一个阵列,并得到结果。 但是如果你想更快的结果,你会用C ++更好。
此快捷方式完全依赖于图像值是非常极端的。 如果您的图像大面积的真灰色的,那么这种方法的准确性是可怕的。
我用GetPixel
在C#
public List<String> GetBlackDots()
{
Color pixelColor;
var list = new st<String>();
for (int y = 0; y < bitmapImage.Height; y++)
{
for (int x = 0; x < bitmapImage.Width; x++)
{
pixelColor = bitmapImage.GetPixel(x, y);
if (pixelColor.R == 0 && pixelColor.G == 0 && pixelColor.B == 0)
list.Add(String.Format("x:{0} y:{1}", x, y));
}
}
return list;
}
虽然有许多语言很多的解决方案,我就勾勒出一个简单的解决方案,我可能会使用自己。 有一个用于Python的成像伟大的图书馆称为PIL(Python图像库- http://www.pythonware.com/products/pil/ ),它可以完成你所需要的非常容易。
下面是一些可能帮助你开始一个例子。
image = Image.open("image.png")
datas = image.getdata()
for item in datas:
if item[0] < 255 and item[1] < 255 and item[2] < 255 :
// THIS PIXEL IS NOT WHITE
当然,这会算,是不是完全是白色的任何像素的,你可能要添加一些填充所以这是不完全的白色也得到回升为白色像素。 您还可以跟踪这些像素您正在寻找。