Не можете нарисовать изображение с помощью этой программы? - PullRequest
1 голос
/ 29 августа 2011

Я пытаюсь обработать изображение для обнаружения областей красного цвета в нем. Я сканирую пиксели, и если они окажутся ДОСТАТОЧНО красными, они преобразуются в черный, в противном случае - в белый.

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

    public void ProcessFrame( ref Bitmap image )
    {
        int skip = 10;
        Graphics g = Graphics.FromImage(System.Drawing.Image.FromHbitmap(image.GetHbitmap()));
        SolidBrush black = new SolidBrush(Color.Black);
        SolidBrush white = new SolidBrush(Color.White);
        for (int i = 0; i < image.Width; i=i+skip)
        {
            for (int j = 0; j < image.Height; j = j + skip)
            {

                Color cl = image.GetPixel(i, j);
                if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))
                {
                    g.FillRectangle(black, new Rectangle(i, j, skip, skip));
                }
                else
                {
                    g.FillRectangle(white, new Rectangle(i, j, skip, skip));
                }
            }
        }
   }

Можете ли вы указать на ошибку, ИЛИ на какой-либо другой лучший способ добиться того, к чему я стремлюсь?

Ответы [ 3 ]

4 голосов
/ 29 августа 2011

Пустым вы имеете в виду белый цвет?

Я не знаю вашего изображения, но if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2)) не является хорошим тестом на покраснение. # 010000 проходит этот тест, но в основном черный. И, #ffaaaa выглядит красным, но не пройдет.

Если у вас было очень темное изображение, множество пикселей могут пройти этот тест, которые не очень красные. Со светлым изображением много красных пикселей не пройдет.

Вероятно, лучший способ - преобразовать цвет HSL, а затем использовать значения H (ue), которые находятся в красной зоне, но только если S (интенсивность) и L (яркость) достаточно яркие и не серые. (через порог, чтобы не быть черным или серым).

2 голосов
/ 29 августа 2011

Попробуйте использовать:

Graphics g = Graphics.FromImage(image);

Затем рассмотрите другие ответы, чтобы улучшить цветопередачу.

0 голосов
/ 29 августа 2011

Вы не указали, где создается image, но этот код будет отображаться в растровом изображении:

var bmp = new Bitmap(200,200);
using (g = Graphics.FromImage(bmp))
{
    g.FillEllipse(Brushes.Red, 10, 10, 50, 50);
}

Обратите внимание, что вам нужно позвонить Graphics.Dispose (или использовать using) перед тем, какиспользуя изображение.

Также обратите внимание, что использование GetPixel для обработки изображений будет очень медленным.Используйте низкоуровневый доступ к памяти (Bitmap.LockBits) или попробуйте какую-нибудь библиотеку обработки изображений для .NET (например, AForge ).

...