Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
1

Обработка изображения(группировка пикселей)

21.03.2017, 03:43. Показов 2841. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, почитал статью http://job-interview.ru/articles/post/362 и захотел реализовать тоже самое, но что-то не получилось. В чем ошибка, вроде код один в один.
Спасибо
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace yourPicture
{
    public partial class Form1 : Form
    {
        Bitmap image;
        int[] mas_color;
        Graphics g;
        public Form1()
        {
            InitializeComponent();
            image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        }
 
        public void FindMean(Bitmap Im, int length, char canal)
        {
            int middlepixel = 0;
            middlepixel = Im.GetPixel(pictureBox1.Width / 2, pictureBox1.Height / 2).G;
            int count = 0;
            int countofcolor=0;
            countofcolor=Math.Abs(256/length);
            mas_color=new int[countofcolor];
 
            for (int i = 0; i < countofcolor; i++)
                mas_color[i] = 0;
 
            if (canal=='B')
            {
                for (int i = 0; i<Im.Width; i++)
                    for (int j = 0; j <Im.Height; j++)
                        if (Im.GetPixel(i,j).B!=Color.Black.B)
                        {
                            mas_color[Math.Abs(Im.GetPixel(i, j).B / length)]++;
                            count++;
                        }
            }
 
            if (canal == 'G')
            {
                for (int i = 0; i<Im.Width; i++)
                    for (int j = 0; j <Im.Height; j++)
                        if (Im.GetPixel(i, j).G != Color.Black.G)
                        {
                            mas_color[Math.Abs(Im.GetPixel(i, j).G / length)]++;
                            count++;
                        }
            }
 
            if (canal == 'R')
            {
                for (int i = 0; i<Im.Width; i++)
                    for (int j = 0; j <Im.Height; j++)
                        if (Im.GetPixel(i, j).R != Color.Black.R)
                        {
                            mas_color[Math.Abs(Im.GetPixel(i, j).R / length)]++;
                            count++;
                        }
            }
 
            if (canal == 'A')
            {
                for (int i = 0; i<Im.Width; i++)
                    for (int j = 0; j <Im.Height; j++)
                        if (Im.GetPixel(i, j).A != Color.Black.A)
                        {
                            mas_color[Math.Abs(Im.GetPixel(i, j).A / length)]++;
                            count++;
                        }
            }
        }
 
        public void MarkBlue(Bitmap Im)
        {
            int count = 0;
      
 
            count = 0;
            FindMean(Im, 4,'B');
            int maxColor = mas_color[0];
            int maxIndex = 0;
            for (int i = 1; i< 256 / 4; i++)
                if (maxColor<mas_color[i])
                {
                    maxColor = mas_color[i];
                    maxIndex = i;
                }
 
            //  MessageBox.Show(Convert.ToString(mas_color[20]));
            for (int i = 0; i<Im.Width; i++)
                for (int j = 0; j <Im.Height; j++)
                    if (maxIndex> (Im.GetPixel(i, j).B) / 4)
                    {
                    //  count++;
                        Im.SetPixel(i, j, Color.Black);
                    }
 
            for (int i = 0; i<Im.Width; i++)
                for (int j = 0; j <Im.Height; j++)
                    if (Im.GetPixel(i, j) == Color.Black)
                        count++;
        }
 
        private void fff(Bitmap image)
        { 
            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
                {
                    image = new Bitmap(open_dialog.FileName);
                    //вместо pictureBox1 укажите pictureBox, в который нужно загрузить изображение 
                    this.pictureBox1.Size = image.Size;
                    pictureBox1.Image = image;
                    pictureBox1.Invalidate();
                }
                catch
                {
                    DialogResult rezult = MessageBox.Show("Невозможно открыть выбранный файл",
                    "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {           
            
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            fff(image);
            MarkBlue(image);
            pictureBox1.Image = image;            
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2017, 03:43
Ответы с готовыми решениями:

Нахождение всех пикселей изображения?
Пишу курсовую, необходимо найти каждый пиксель в изображении,знаю что через bitmap и GetPixel(), не...

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

Увеличить размер изображения в два раза с сохранением количества пикселей
Необходимо рисунок 250х250 визуально увеличить и засунуть в picture box размером 500х500, т.е....

Обработка изображения размером 800х600 пикселей
Здравствуйте,подскажите пожалуйста, что не так. Есть исходное изображение размером 800х600...

13
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
21.03.2017, 10:40 2
Nike1995, "не получилось" - это что означает? Неправильно области выделяет или вообще не выделяет ничего, или наоборот черным всё закрашивает?
В метод fff() мне кажется надо по ссылке передавать картинку, т.е.
C#
1
2
3
4
 private void fff(ref Bitmap image)
        {
           ...
        }
C#
1
2
3
4
5
 private void button1_Click(object sender, EventArgs e)
        {
           fff(ref image);
           ...
        }
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
21.03.2017, 16:05  [ТС] 3
Людвиг Бодмер, спасибо, ref помог. Но все закрашивается в черный цвет. в статье же все хорошо работает. не могли бы Вы сказать почему?
0
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
21.03.2017, 17:01 4
Nike1995, такое ощущение, что алгоритм не совсем верный или не совсем правильно применен. Пробовал менять немного алгоритм,в итоге выделяет области, но не те, что вроде бы должен. Так что пока сам не разобрался.
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.03.2017, 17:05 5
Цитата Сообщение от Nike1995 Посмотреть сообщение
спасибо, ref помог. Но все закрашивается в черный цвет
А у меня ваш пример работает. Другое дело, что код плохой, но то таке...
Вот результат:
Обработка изображения(группировка пикселей)
Вложения
Тип файла: zip WindowsFormsApplication367.zip (55.7 Кб, 22 просмотров)
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
21.03.2017, 18:20  [ТС] 6
И у меня заработало. А можете сказать, как реализовать следующее: разбить картинку на области с примерно одинаковыми цветами и обвести контур вокруг этой области. может кто посоветовать литературу или алгоритмы по реализации. просто очень интересно, уже год думаю как бы это сделать, несколько раз тут писал, но никто не отвечал.
0
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
21.03.2017, 19:01 7
Nike1995, возможно вам будет интересна книга Р. Гонсалес, Р. Вудс "Цифровая обработка изображений". Сам не читал, но судя по оглавлению, есть много интересного по теме.
1
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.03.2017, 19:20 8
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Цитата Сообщение от Nike1995 Посмотреть сообщение
А можете сказать, как реализовать следующее: разбить картинку на области с примерно одинаковыми цветами и обвести контур вокруг этой области. может кто посоветовать литературу или алгоритмы по реализации. просто очень интересно, уже год думаю как бы это сделать, несколько раз тут писал, но никто не отвечал.
Это называется сегментация изображения. Гуглите - материала много. Если вам нужно для дела - то используйте OpenCV, там есть несколько готовых методов сегментации. Если вам просто так, повелосипедить, то почитайте вот например эту статью: https://habrahabr.ru/post/81279/
Если кратко, то сегментация сводится к кластерному анализу в пространстве X,Y,R,G,B (где XY - координаты пиксела, а RGB - его цвет). При этом используются разные метрики, которые собственно и определяют разные типы сегментации. На выходе каждый кластер будет представлять собой отдельный сегмент изображения.

Добавлено через 11 минут
Вот еще здесь посмотрите Сегментация наращиванием областей
2
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
21.03.2017, 19:51  [ТС] 9
Людвиг Бодмер, Storm23, спасибо большое))
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
22.03.2017, 02:45  [ТС] 10
Storm23, у меня вот какая идея, сделать раскраску по номерам. т.е. на вход идёт какая-то картинка, а на выходе что-то вроде того, что я прикрепил.
Хочу взять в виде курсача по компьютерной графике.
Обработка изображения(группировка пикселей)
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
22.03.2017, 02:56  [ТС] 11
Storm23, у меня получится это сделать? Я почитал про методы сегментации в OpenCV, но там они картинку разбивают на какие-то примитивы. но у меня примитив может быть очень сложным объектом и если на картинке будет только зеленое поле и небо, то, боюсь, что там ничего не получится.

Добавлено через 1 минуту
Людвиг Бодмер, забыл о Вас. Может Вы тоже сможете как-то помочь?
И вопрос неправильно поставил.
Я так понимаю, что придётся все самому там писать и не рассчитывать на библиотеки?

Добавлено через 7 минут
Storm23, уже чуть-чуть углубился и кое-что нашел. Если получится, то укажу вас в РПЗ, за помощь))
Ну или тут отпишусь))
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.03.2017, 04:27 12
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Цитата Сообщение от Nike1995 Посмотреть сообщение
у меня получится это сделать? Я почитал про методы сегментации в OpenCV, но там они картинку разбивают на какие-то примитивы. но у меня примитив может быть очень сложным объектом и если на картинке будет только зеленое поле и небо, то, боюсь, что там ничего не получится.
Нет, там сегменты могут быть произвольной формы. Но если использовать метод Watershed, то он не совсем то, что вам нужно. Этот так называемый marker-based метод, то есть он требует затравочных точек. Их конечно можно найти, но все же думаю лучше использовать методы без затравочных точек. Вот только я не припомню, есть ли такие в OpenCV.
Поэтому лучше все таки сделать кластерный анализ, как я уже писал. Это не так сложно как кажется.
Если что - обращайтесь, там работы минут на 30
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
22.03.2017, 04:34  [ТС] 13
по выделению контура тут хорошую статейку нашел http://docs.opencv.org/2.4/doc... tours.html
0
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
22.03.2017, 08:41 14
Nike1995, c OpenCV мало работал, не подскажу. Благодаря наводкам от Storm23 нашел еще немного материала, может вам пригодится:
https://www.codeproject.com/Ar... zy-C-means
http://accord-framework.net/samples.html# Clustering
1
22.03.2017, 08:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2017, 08:41
Помогаю со студенческими работами здесь

Обработка изображения: поиск пикселей определённого цвета
Добрый вечер! Имеется такое задание: есть изображение, нужно найти пиксели определенного цвета и...

Обработка изображения с веб камеры на предмет движущихся объектов\изменившихся пикселей
Специально для тех кто долго дрючил свои мозги, перерыл пол гугля и нихрена не нашёл выкладываю...

Перебор пикселей изображения
Здравствуйте, есть большое изображение, например 1000х1000 (но это не важно), я хочу получить из...

Подсчет пикселей изображения
Пожалуйста помогите имеется изображение мне надо подсчитать сколько значений пикселя 255 на...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru