2

GetPixelを使用して、画像の各ピクセルの色を取得しています。画像にはさまざまな無地の不規則な形状が含まれているので、最大幅が最大高さと一致するポイント(またはピクセル)を見つけたいと思います(下の図を参照)。

代替テキスト
(ソース:fuskbugg.se

(境界線は無視してください)

これを使用して、キャプチャされたビットマップを反復処理しています。

        for (int x = 0; x < bmp.Width; x++)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                Color clr = bmp.GetPixel(x, y);

                // Hit
                if (TestColour(clr)) // See if we're within the shape. I'm just comparing a bunch of colours here.
                {
                    // Stuff I don't know
                }
            }
        }

hashTableを使用して動作させることができましたが、これはひどい解決策であることを理解しています。私は、2つの整数(1つはX用、もう1つはY用)を増分して各反復の最大値を保存し、これを前の値と比較して、値が大きい場合は値を置き換えるという行で考えていました。

そのようにネストされたforループでそのアプローチをどのように使用できるかわかりません。

何か入力はありますか?

4

2 に答える 2

1

あなたが持っているループと同様に、2つのループを使用してこのポイントを見つけるのは簡単なはずです。まず、変数を定義します。

//from http://www.artofproblemsolving.com/Wiki/images/a/a3/Convex_polygon.png
Image image = Image.FromFile(@"C:\Users\Jacob\Desktop\Convex_polygon.png");
Bitmap bitmap = new Bitmap(image);
Point maxPoint = new Point(0, 0);
Size maxSize = new Size(0, 0);

次に、GetPixelピクセルごとに1回だけ呼び出し、結果を配列にキャッシュすることをお勧めします(これは、ピクセルを取得するためにAPI呼び出しを使用する必要があったときからのバイアスかもしれませんが、操作が簡単であることがわかります)。

Color[,] colors = new Color[bitmap.Width, bitmap.Height];
for (int x = 0; x < bitmap.Width; x++)
{
    for (int y = 0; y < bitmap.Height; y++)
    {
        colors[x, y] = bitmap.GetPixel(x, y);
    }
}

次に、最大の高さと、その高さの最初のポイントのXを取得する簡単なコードを次に示します。

Color shapeColor = Color.FromArgb(245, 234, 229);

for (int x = 0; x < bitmap.Width; x++)
{
    int lineHeight = 0;
    for (int y = 0; y < bitmap.Height; y++)
    {
        if (colors[x, y] == shapeColor) // or TestColour(colors[x, y])
            lineHeight++;
    }
    if (lineHeight > maxSize.Height)
    {
        maxSize.Height = lineHeight;
        maxPoint.X = x;
    }
}

yごとに同様のループを作成して、最大幅を見つけることができます。

ここで重要な点:あなたの質問は凹型の形状に対して定義されていません-凹型の形状では、すべてのxの高さのリストがあり、最大の高さの線が最大の幅と交差しない場合があります。凸型の形状でも、複数の答えがある場合があります。その簡単な例は長方形です。

于 2010-07-24T21:03:12.347 に答える
-1

他の解決策;

 Bitmap bmp = new Bitmap(pictureBox1.Image);
        int width = bmp.Width;
        int height = bmp.Height;
        for (int x = 0; x < bmp.Width; x++)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                Color color = bmp.GetPixel(x, y);

                if (color.R == 0)
                {
                    textBox4.Text = x.ToString();
                    textBox5.Text = y.ToString();
                    return; //Starting Point.If canceled endpoint.
                }
于 2014-04-21T15:25:41.823 に答える