С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 0
Регистрация: 11.04.2014
Сообщений: 115
1

Построить гистограмму по RGB картинки без Chart

23.05.2015, 18:52. Показов 2594. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, мне нужно построить гистограмму по RGB картинки, точнее три гистограммы (R, G и B) на одном Image. Использовать компонент Chart нельзя. Я построила алгоритм, а как воплотить его не знаю:
  • Выбрать количество столбиков (варьируется TrackBar)->n = TrackBar1->Position;
  • Далее загрузить картинку raw формата c помощью структуры
    C++
    1
    2
    3
    4
    5
    
    struct r_g_b
    {
            float r, g, b;
    };
    r_g_b clr;
  • Создать три массива R[1000], G[1000], B[1000]
  • Далее нужно найти размер каждого из интервалов, он у всех одинаковый
    C++
    1
    
    float I = 1 / n
  • Теперь нужно проверить попадает ли точка clr.r (или clr.g...) в какой-то из интервалов и вернуть номер интервала, и этот номер записать индексом массива R, увеличив значение массива по этому индексу на единицу. То есть, например с 0 до 4 два интервала, точка 1,25 попадает в 0, значит наращиваться на единицу будет значение R[0]. Этот пункт и следующий я не знаю, как реализовать
  • Нужно отрисовать все три массива с помощью FillRect...
Заранее спасибо!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2015, 18:52
Ответы с готовыми решениями:

Построить гистограмму chart
Здравствуйте уважаемые, просьба помочь. Список содержит сведения о проданных товарах в сети...

Извлечь из картинки rgb значение цвета [0; 255] и построить 3 трёхмерных графика
Ребят, уже писал сюда по поводу другой диаграммы, спасибо очень помогли. Но теперь возникли другие...

Как в Chart нарисовать гистограмму
Доброго времени суток. Подскажите пожалуйста как изменить имеющийся код, чтоб нарисовать...

Построить графики на логарифмической оси, построить объемную гистограмму
Всем привет! Ребята помогите плиз с таблицей! От этой таблички зависит моя сессия по информатике((...

5
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.05.2015, 19:18 2
Краткое руководство по работе с классом TCanvas для начинающих
0
2 / 2 / 0
Регистрация: 11.04.2014
Сообщений: 115
23.05.2015, 19:54  [ТС] 3
Спасибо, но отрисовка это пол дела, мне нужна функция, я написала что-то похожее, но как-то неправильно получается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float TForm1::fR(float RED, float I)
{
 
        for (interR = 0; interR < N; interR++)
        {
                if (clr.r >= 0 && clr.r < 1)
                {
                        float x = 0;
                        float inter = I;
                        if (RED >= x && RED < inter)
                        {
                                return interR;
 
                        }
                        else
                        {
                                inter += inter;
                                x = inter;
                        }
          
                }
        }
}
RED-->это clr.r
I-->interval(interval = 1/n)
N = 1000
Помогите, пожалуйста исправить
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.05.2015, 20:47 4
Цвета в С++Builder хранятся в типе TColor, для получения интенсивности по каждому из каналов, можно использовать ф-ции: GetRValue(),GetGValue(),GetBValue(), для объединение каналов в цвет макрос RGB()
0
2 / 2 / 0
Регистрация: 11.04.2014
Сообщений: 115
25.05.2015, 11:57  [ТС] 5
Здравствуете, у меня есть три массива, мне нужно их отобразить, как гистограмму, но без chart, а отрисовать на Image, причем в массивах есть самое большое число, поэтому нужно масштабировать гистограмму, относительно размеров Image. Использовать можно как FillRect, так и Line To, Move To
0
случайный прохожий
3032 / 2064 / 626
Регистрация: 20.07.2013
Сообщений: 5,572
25.05.2015, 18:46 6
Набросок:
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
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
  Bitmap->Assign(Image1->Picture);
 
  Image2->Canvas->FillRect(Image2->Canvas->ClipRect);
 
  const n = 256;
  unsigned long count_R[n] = {0}, count_G[n] = {0}, count_B[n] = {0};
 
  if(Bitmap->PixelFormat == pf24bit)
  {
    Byte *ptr, R, G, B;
    for(int y = 0; y < Bitmap->Height; y++)
    {
      ptr = (Byte*)Bitmap->ScanLine[y];
      for (int x = 0; x < Bitmap->Width; x++)
      {
        B = *(ptr + x*3);
        G = *(ptr + x*3+1);
        R = *(ptr + x*3+2);
 
        count_B[B]++;
        count_G[G]++;
        count_R[R]++;
      }
    }
  }
  delete Bitmap;
 
  unsigned long value[3] = {0};
  for (int i = 0; i < n; i++)
  {
    if (count_R[i] > value[0])
      value[0] = count_R[i];
    if (count_G[i] > value[1])
      value[1] = count_G[i];
    if (count_B[i] > value[2])
      value[2] = count_B[i];
  }
 
  Image2->Canvas->Pen->Color = clRed;
  for (int i = 0; i < n; i++)
  {
    Image2->Canvas->MoveTo(i+(Image2->Width-n)/2, Image2->Height/3);
    Image2->Canvas->LineTo(i+(Image2->Width-n)/2, Image2->Height/3*(1-1.*count_R[i]/value[0]));
  }
 
  Image2->Canvas->Pen->Color = clGreen;
  for (int i = 0; i < n; i++)
  {
    Image2->Canvas->MoveTo(i+(Image2->Width-n)/2, Image2->Height*2/3);
    Image2->Canvas->LineTo(i+(Image2->Width-n)/2, Image2->Height/3*(2-1.*count_G[i]/value[1]));
  }
 
  Image2->Canvas->Pen->Color = clBlue;
  for (int i = 0; i < n; i++)
  {
    Image2->Canvas->MoveTo(i+(Image2->Width-n)/2, Image2->Height);
    Image2->Canvas->LineTo(i+(Image2->Width-n)/2, Image2->Height/3*(3-1.*count_B[i]/value[2]));
  }
Миниатюры
Построить гистограмму по RGB картинки без Chart  
0
25.05.2015, 18:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2015, 18:46
Помогаю со студенческими работами здесь

Через Chart показать температуру воздуха за месяц через гистограмму
Доброго времени суток, джентльмены! Дали задание - его я указал выше, + ещё нужно указать плюсовую...

Построить гистограмму
Здраствуйте Есть проблема, в процессе выполнения лабы по решению СЛАУ - надо построить гистограмму...

Построить гистограмму
Даны значения: DATE| TIME| DOY| IGLX 2015-08-11| 00:00:00.250| 223| ...

Построить гистограмму
Построить гистограмму из заданного количества символов (*,%,=,+), количество символов вводится с...


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

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