5

私は奇妙なプロジェクトに取り組んでいます。私は(金属から)ステンシルを作るために使用しているレーザーカッターにアクセスできます。座標を使って特定の画像をカットするようにマシンをプログラムすることはできますが、私が疑問に思っていたのは、白黒のスキャン画像を取得して黒い領域の座標を取得するプログラムを作成するにはどうすればよいですか?外側の線だけが必要なのに、それがすべてのピクセルを与えるかどうかは気にしません、私はその部分を行うことができます。

しばらく検索してきましたが、質問には色やピクセルなどの結果がたくさんある単語がたくさんあるので、関係のない情報がたくさん見つかります。C ++またはC#を使用したいのですが、スクリプトを含む任意の言語を使用できます。

4

3 に答える 3

4

私はで使用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;
}
于 2012-08-01T01:26:54.793 に答える
3

スキャンされた画像が完全に白で完全に黒で、中間の色がないと仮定すると、画像を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++を使用したほうがよいでしょう。

このショートカットは、画像値が非常に極端であることに完全に依存しています。画像の広い領域が本当に灰色の場合、このアプローチの精度はひどいものです。

于 2012-08-01T01:22:22.350 に答える
2

多くの言語で多くの解決策がありますが、私がおそらく自分で使用するであろう簡単な解決策の概要を説明します。PIL(Python Imaging Library- http://www.pythonware.com/products/pil/)と呼ばれるPython用の優れたイメージングライブラリがあり、必要なことを非常に簡単に実行できます。

これはあなたが始めるのを助けるかもしれない何かの例です。

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

もちろん、完全に白ではないピクセルはカウントされます。正確に白ではないピクセルも白としてピックアップされるように、パディングを追加することをお勧めします。また、現在見ているピクセルを追跡する必要があります。

于 2012-08-01T01:22:02.347 に答える