我正在做一个奇怪的项目。我可以使用我用来制作模板(金属)的激光切割机。我可以使用坐标对机器进行编程以切割特定图像,但我想知道的是:我怎样才能编写一个程序来获取黑白扫描图像,并给我黑色区域的坐标?我不介意它是否给出了每个像素,即使我只需要外线,我也可以做到这一点。
我已经搜索了一段时间,但是这个问题有很多单词和很多结果,比如颜色和像素,我发现了大量不相关的信息。我想使用 C++ 或 C#,但我可以使用任何语言,包括脚本。
我正在做一个奇怪的项目。我可以使用我用来制作模板(金属)的激光切割机。我可以使用坐标对机器进行编程以切割特定图像,但我想知道的是:我怎样才能编写一个程序来获取黑白扫描图像,并给我黑色区域的坐标?我不介意它是否给出了每个像素,即使我只需要外线,我也可以做到这一点。
我已经搜索了一段时间,但是这个问题有很多单词和很多结果,比如颜色和像素,我发现了大量不相关的信息。我想使用 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;
}
如果我们假设扫描的图像是完美的白色和完美的黑色,没有中间颜色,那么我们可以将图像作为 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#,将很容易导入大多数图像格式,将 em 粘贴到数组中并获得结果。但是,如果您想要更快的结果,那么使用 C++ 会更好。
这个快捷方式完全依赖于非常极端的图像值。如果您的图像的大部分区域真的是灰色的,那么这种方法的准确性很糟糕。
虽然有多种语言的许多解决方案,但我将概述一个我自己可能会使用的简单解决方案。有一个用于 Python 的强大的成像库,称为 PIL(Python Imaging Library - 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
当然,这将计算任何不完全白色的像素,您可能需要添加一些填充,以便不完全白色的像素也被拾取为白色。您还必须跟踪您当前正在查看的像素。