Найти пиксель, где максимальная ширина и максимальная высота цветной области пересекаются, используя GetPixel () - PullRequest
2 голосов
/ 24 июля 2010

Я использую GetPixel, чтобы получить цвет каждого пикселя изображения. Изображения содержат разные неправильные формы однотонного цвета, и я хотел бы найти точку (или пиксель), где максимальная ширина соответствует максимальной высоте (см. Рисунок ниже).

альтернативный текст http://data.fuskbugg.se/skalman01/figure.jpg

(без учета границы)

Я использую это, чтобы перебрать захваченное растровое изображение:

        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, но я понимаю, что это изящное решение. Я думал о том, что нужно просто увеличить два целых числа (одно для X, одно для Y) и сохранить максимальное значение для каждой итерации, затем сравнить это с предыдущим и заменить значение, если оно выше.

Я не понимаю, как бы я мог использовать этот подход с такими вложенными циклами for.

Любой ввод?

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Должно быть просто найти эту точку с помощью двух петель, аналогично той, что у вас есть.Сначала определите ваши переменные:

//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 только один раз на пиксель и кэшировать результаты в массиве (это может быть смещением, когда мне пришлось использовать 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, и линия максимальной высоты не может пересекать максимальную ширину.Даже на выпуклых формах у вас может быть более одного ответа: простым примером этого является прямоугольник.

0 голосов
/ 21 апреля 2014

другие решения;

 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.
                }
...