Сканирование на красные цвета в изображении с помощью растрового изображения и ARGB - C# - PullRequest
1 голос
/ 23 января 2020

Я снимаю изображение и проверяю, есть ли в нем оттенки красного. По крайней мере один пиксель на изображении красного цвета должен возвращать значение true. В моем решении не все оттенки красного покрыты. Я использую Bitmap для проверки каждого пикселя на изображении. Вот код, который я пробовал:

public bool HasRedColor(string imagePath)
        {
            if(imagePath != null)
            {
                var image = Image.FromFile(imagePath);
                var redColors = TakeRed();

                Bitmap bmp = new Bitmap(imagePath, true);
                for (int i = 0; i < image.Height; i++)
                {
                    for (int j = 0; j < image.Width; j++)
                    {
                        //Get the color at each pixel
                        Color pixelColor = bmp.GetPixel(j, i);

                        //Compare Pixel's Color ARGB property with the picked color's ARGB property 
                        if (redColors.Any(x => x == pixelColor))
                        {
                            return true;
                        }
                    }
                }
                return false;
            }

            return false;
        }

        public List<Color> TakeRed()
        {
            var listOfRedColors = new List<Color>();
            for (int i = 150; i < 255; i++)
            {
                listOfRedColors.Add(Color.FromArgb(255, i, 0, 0));
            }

            return listOfRedColors;
        }
    }

Однако моя функция TakeRed () не охватывает все оттенки красного. Любые предложения о том, как получить все оттенки красного?

1 Ответ

2 голосов
/ 23 января 2020

То, что вы делаете, создает список красных цветов, но он неполон. Вы не учитываете значения G и B. Если они не 0, а, скажем, 1. Это тоже можно считать красным, со значениями R от 150 до 255. Поэтому вам нужно добавить свой список, пока в нем не появятся все оттенки красного. Я думаю, что это может быть весьма субъективным, чтобы установить диапазоны.

НО! Чтобы поместить все цвета, которые вы считаете красными, в список и выполнять итерацию по списку каждый раз, вы хотите проверить, является ли красный цвет совершенно неэффективным. Вместо этого установите диапазоны. Если, например, вы скажете, что каждый цвет со значением R больше 150 и значениями G и B меньше 20, решение может выглядеть следующим образом.

        public bool isRed(Color pixelColor)
        {
            if (pixelColor.R > 0x96 && pixelColor.G < 0x14 && pixelColor.B < 0x14)
            {
                return true;
            }
            return false;
        }

Вы проверяете R, G и B значения отдельно, если они находятся в диапазоне. R, G и B имеют тип байта. Вы можете использовать шестнадцатеричные значения, чтобы установить диапазоны.

...