Как найти количество пикселей определенного цвета на изображении? - PullRequest
2 голосов
/ 21 июня 2011

Итак, я пытаюсь создать программу, которая сможет определить, сколько пикселей определенного цвета в нем.Изображения являются фотографиями, снятыми камерой, и после этого некоторые области на них были отмечены в фотошопе, и мне нужно найти точное количество этих пикселей.Но у меня мало проблем.Я использую getPixel (x, y), но я сравниваю с Color.FromArgb (красный, зеленый, синий), который я хочу, но ... моя первая проблема заключается в том, что цвета немного отличаются, например, я хочуузнайте цвет RGB 116,110,40, но когда вы рисуете этим цветом в фотошопе, некоторые пиксели получают немного другой цвет, такой как RGB 115,108,38 (и другие похожие), и я хочу включить это также.Итак, я наконец-то придумал этот код (но похоже, что id теперь работает правильно):

public Form1()
    {
        InitializeComponent();
    }

    Bitmap image1;
    int count=0;
    int red, green, blue;
    int redt, greent, bluet;
    double reshenie;

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            red = int.Parse(textBox1.Text);
            green = int.Parse(textBox2.Text);
            blue = int.Parse(textBox3.Text);

                           // Retrieve the image.
            image1 = new Bitmap(@"C:\bg-img.jpg", true);
             double widht, height, pixel ;
            int x, y;
            MessageBox.Show(pixel.ToString());

            // Loop through the images pixels            
            for (x = 0; x < image1.Width; x++)
            {
                for (y = 0; y < image1.Height; y++)
                {
                    Color pixelColor = image1.GetPixel(x, y);
                    redt = pixelColor.R;
                    greent = pixelColor.G;
                    bluet = pixelColor.B;


                    if ((red+10>=redt) && (red-10>=redt))//i used +-10 in attempt to resolve the problem that i have writed about the close colours
                    {

                        if ((green + 10 >= greent) && (green - 10 >= greent))
                        {
                            if ((blue + 10 >= bluet) && (blue - 10 >= bluet))
                            {
                                count += 1;

                            }
                        }
                    }
                }
            }

            pictureBox1.Image = image1;

            MessageBox.Show("Imashe " + count.ToString());
            count = 0;

        }
        catch (ArgumentException)
        {
            MessageBox.Show("There was an error." +
                "Check the path to the image file.");

        }

    }

Проблема в том, что я не получаю ожидаемого результата.Например, когда мне нужно получить около 1000 пикселей, я получаю больше или меньше, и я не могу найти, где моя ошибка.Так что если кто-то может дать мне представление о том, что я делаю неправильно.Заранее всем спасибо за помощь.

Ответы [ 3 ]

5 голосов
/ 21 июня 2011

Попробуйте вместо этого использовать этот цикл:

int epsilon = 10;

for (x = 0; x < image1.Width; ++x)
{
    for (y = 0; y < image1.Height; ++y)
    {
        Color pixelColor = image1.GetPixel(x, y);
        redt = pixelColor.R;
        greent = pixelColor.G;
        bluet = pixelColor.B;

        if (Math.Abs(redt   - red)   <= epsilon &&
            Math.Abs(greent - green) <= epsilon &&
            Math.Abs(bluet  - blue)  <= epsilon)
        {
            ++ count;
        }
    }
}

Где epsilon - максимальная разница между цветом пикселя и целевым цветом для каждого канала.

1 голос
/ 21 июня 2011

Я думаю, что ваше сравнение цветов не правильно.Вы смешали <= и >=, пытаясь приблизиться к цвету.Попробуйте это:

if ((red+10 >= redt) && (red-10 <= redt)) //i used +-10 in attempt to resolve the problem that i have writed about the close colours
{
    if ((green + 10 >= greent) && (green - 10 <= greent))
    {
        if ((blue + 10 >= bluet) && (blue - 10 <= bluet))
        {
           count += 1;
        }
    }
}
1 голос
/ 21 июня 2011

Из вашего кода:

if ((green + 10 >= greent) && (green - 10 >= greent))

Если (a - 10 >= b), то наверняка (a + 10 >= b).Посмотрите, можете ли вы понять, почему.

Я думаю, что вы могли иметь в виду

if ((green - 10 <= greent) && (greent <= green + 10))

Упорядочение подобного условия помогает с удобочитаемостью, потому что greent должно быть между green - 10 и green + 10, а также физически расположен между этими выражениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...