Сравнение растровых объектов с разными цветами - PullRequest
1 голос
/ 27 февраля 2020

У меня есть растровый объект рукописного опроса (см. Изображение опроса ниже), который содержит различные флажки. Я использую алгоритм для сравнения растрового изображения пустого, немаркированного флажка с растровым изображением того же флажка (который может или не может быть помечен), чтобы определить, отмечен ли флажок или нет. Этот код в основном циклически перемещается по каждому местоположению флажка на растровом изображении и сканирует пиксель за пикселем, используя bm.GetPixel(x, y).GetBrightness() < 0.5f, делая флажок ha sh и сохраняя его в списке. Затем я сравню значения ha sh пустого флажка со значениями ha sh переданного флажка (с некоторым допуском), чтобы определить, отмечен он или нет.

Теперь моя проблема это отлично работает, если флажки помечены черным пером. Если для пометки этих флажков используется любое другое цветное перо (красный, синий и т. Д. c.), То bm.GetPixel(x, y).GetBrightness() < 0.5f не распознает изменение в пикселях. Может кто-нибудь сказать мне, что я могу изменить, чтобы включить другие цветные метки?

        foreach (KeyValuePair<string, CheckboxData> element in b1.CheckboxLocations)
        {

            int startX = element.Value.startX;
            int endX = element.Value.endX;
            int startY = element.Value.startY;
            int endY = element.Value.endY;

            List<bool> lResult = new List<bool>();

                for (int y = startY; y < endY; y++)
                {
                    for (int x = startX; x < endX; x++)
                    {
                        lResult.Add(bm.GetPixel(x, y).GetBrightness() < 0.5f);
                    }
                }

            int numMarked = 0;
            foreach(bool b in lResult)
            {
                if(b == true)
                {
                    numMarked++;
                }
            }

            Console.WriteLine($"Box Name: {element.Key}\nNumber of Pixels Marked: {numMarked}\n");

        }

enter image description here

1 Ответ

1 голос
/ 27 февраля 2020

Попробуйте вместо этого взглянуть на свойства R, G и B объекта Bitmap. Затем вы можете проверить каждый цвет отдельно по уникальному порогу. Что-то вроде ниже может быть более полезным:

lResult.Add(bm.GetPixel(x, y).R < 128 || bm.GetPixel(x, y).G < 128 || bm.GetPixel(x, y).B < 128);
...