Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
kondrn1
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 8
1

Подсчитать количество черных пикселей на Picturebox

28.05.2018, 23:09. Просмотров 251. Ответов 4
Метки нет (Все метки)

написал код который должен считать количество черных пикселей на картинке, загруженной в picturebox. Сама картинка из paint черно-белая на ней изображены рандомные черные линии. Но видимо ошибка в коде и черные пиксели не считает. Сам код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void button2_Click(object sender, EventArgs e)
        {
            Bitmap b = new Bitmap(pictureBox1.Width,pictureBox1.Height);
            for (int i = 0; i < pictureBox1.Height; i++)
            {
                for (int h = 0; h < pictureBox1.Width; h++)
                {
                    if (b.GetPixel(i, h) == Color.Black)
                        a4++;
                }
            }
            label1.Text = Convert.ToString(a4);
        }
Помогите пожалуйста разобраться почему не идет подсчет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2018, 23:09
Ответы с готовыми решениями:

Загрузка в Picturebox пикселей
Я загружаю изображение, потом есть массив цветов его пикселей, далее я провожу...

Вывести количество пикселей монитора
Здравствуйте! Короче, такая фигня - надо вывести разрешение экрана - именно...

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

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

На picturebox наложить N количество bitmap
Добрый день. Подскажите кто знает. Можно ли на picturebox наложить N количество...

4
Shogun31337
534 / 514 / 222
Регистрация: 02.11.2016
Сообщений: 1,538
Завершенные тесты: 2
28.05.2018, 23:52 2
Цитата Сообщение от kondrn1 Посмотреть сообщение
Помогите пожалуйста разобраться почему не идет подсчет?
Вы не загружаете картинку, а создаете новую, указывая размеры pictureBox1. И т.к. картинка пустая, то черных пикселей на ней нет. Вот и не считает. Ну и, кроме того, может возникнуть исключение, т.к. у Вас цикл неверно организован. Если не ошибаюсь, в GetPixel нужно первым параметром указывать индекс по ширине, а вторым по высоте. А у Вас наоборот. Значит может вылезти исключение при попытке доступа к несуществующему пикселю.
1
kondrn1
0 / 0 / 0
Регистрация: 24.04.2018
Сообщений: 8
29.05.2018, 15:02  [ТС] 3
Shogun31337, допустим, вот 2-я версия кода, что тогда тут не так? Можете помочь с кодом пожалуйста?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        private void button1_Click(object sender, EventArgs e)
        {        
            OpenFileDialog open_dialog = new OpenFileDialog();
            open_dialog.Filter = "Image Files(*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG|All files (*.*)|*.*";
            if (open_dialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    int a3 = 0;
                    Image image = new Bitmap(open_dialog.FileName);
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                    Size s = new Size(image.Width, image.Height);
                    Bitmap objBitmap = new Bitmap(image, s);
                    this.pictureBox1.Size = s;
                    pictureBox1.Image = objBitmap;
                    for (int i = 0; i < pictureBox1.Width; i++)
                    {
                        for (int h = 0; h < pictureBox1.Height; h++)
                        {
                            if (objBitmap.GetPixel(i, h) == Color.Black)
                                a3++;
                        }
                    }
                    label1.Text = Convert.ToString(a3);
                    pictureBox1.Invalidate();
                }
                catch
                {
                    DialogResult rezult = MessageBox.Show("Невозможно открыть выбранный файл",
                    "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
 
            }
        }
0
Ellizio
58 / 54 / 48
Регистрация: 09.11.2015
Сообщений: 156
29.05.2018, 16:18 4
kondrn1, даже если пиксель черный, то, что возвращает .GetPixel() не эквивалентно Color.Black. Можете сами проверить в режиме отладки

Что бы посчитать пиксели нужного цвета, можно сделать так
C#
1
2
3
4
5
6
7
8
9
10
11
Bitmap bm = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
 
int k = 0;
for (int i = 0; i < bm.Height; i++)
{
     for (int j = 0; j < bm.Width; j++)
     {
          if (bm.GetPixel(j, i).Name.Equals("ff000000")) //альфа-канал = 255. R = 0, G = 0, B = 0
               k++;
     }
}
либо сравнивая все компоненты цвета. Они измеряются от 0 до 255. При таком варианте использования легко задать интервал значения компонента, подсчитывая так же оттенки нужно цвета
C#
1
2
3
4
5
6
7
8
9
10
11
12
Bitmap bm = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
 
int k = 0;
for (int i = 0; i < bm.Height; i++)
{
     for (int j = 0; j < bm.Width; j++)
     {
          Color c = bm.GetPixel(j, i);
          if (c.A == Color.Black.A && c.R == Color.Black.R && c.G == Color.Black.G && c.B == Color.Black.B)
               k++;
     }
}
0
Shogun31337
534 / 514 / 222
Регистрация: 02.11.2016
Сообщений: 1,538
Завершенные тесты: 2
29.05.2018, 19:03 5
Еще вариант:
C#
1
2
3
4
5
6
7
8
9
for (int i = 0; i < pictureBox1.Width; i++)
{
    for (int h = 0; h < pictureBox1.Height; h++)
    {
        Color c = objBitmap.GetPixel(i, h);
        Color b = Color.FromArgb(Color.Black.ToArgb());                    
        if (c == b)
            a3++;
    }
kondrn1, все дело в том, что у вас сравниваются не значения цвета пикселя, а 2 переменные типа Color. И условие c == b вернет true только в том случае, если все поля этих переменных будут равны. Но, тип Color содержит не только сведения о цвете, который может и совпадать, а еще кучу полей. В частности поле Name, которое, если брать цвет из палитры (т.е. Color.Black) будет иметь имя Black. GetPixel же присваивает имя, исходя из значения (т.е. ff000000). Вот поэтому условие и не выполнялось и, соответственно, подсчет у Вас не велся.
0
29.05.2018, 19:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2018, 19:03

Не получается подсчитать количество пикселей
Мучаюсь с утра не могу подсчитать количество пикселей на кадре может быть не...

Подсчитать количество пикселей, потребовавшееся на закраску треугольника
Программа рисует треугольник. Затем закрашивает его белым цветом. И...

Разбить изображения на 20 ровных сектора и подсчитать количество черных пикселов в каждом из найденых секторов
Здравствуйте. Задача заключается в следующем. Нужно разбить изображение на 20...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru