Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 5

Программа на C++, которая переводит цветовую модель RGB в модель HSV

13.03.2014, 17:52. Показов 6989. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Я - начинающий программист. Мне нужна ваша помощь. Мне нужно сделать программу на C++, которая переводит цветовую модель RGB в модель HSV. С чего начать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2014, 17:52
Ответы с готовыми решениями:

Отобразить цветовую модель YIQ
Всем привет! Как отобразить каналы цветовой модели YIQ? Получить значения y i и q по формулам получаю, а как вывести каналы как тут? Image...

Создать Класс: Цвет (модель RGB)
По заданию нужно создать класса. представляющий цвет в модели rgb Класс: Цвет (модель RGB) Состояние (поля): красная, зеленая и синяя...

Преобразование изображения из цветовой модели RGB в модель HSL
Всем доброго времени суток! Я учусь на программиста, и мне очень нужна ваша помощь. Что нужно для преобразования изображения из...

6
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
13.03.2014, 18:08
С теории.
http://ru.wikipedia.org/wiki/RGB
http://ru.wikipedia.org/wiki/H... B%D1%8C%29 (см. RGB → HSV)
2
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 5
13.03.2014, 18:10  [ТС]
Спасибо за ссылки, а как программу свою начать? С чего, вернее. Как эти формулы правильно написать?
0
 Аватар для recoder
135 / 134 / 53
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
13.03.2014, 18:34
Лучший ответ Сообщение было отмечено Kabahol как решение

Решение

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
#include <iostream>
using namespace std;
 
int max(int r, int g, int b);
int min(int r, int g, int b);
 
int main() {
 
    int r, g, b;
    cin >> r >> g >> b;
 
    int h, s, v;
    int p = max(r,g,b);
    int t = min(r,g,b);
 
    if (p == t)
        h = 0;
    else if (p == r && h >= b)
        h = 60 * ((g - b) / (p - t));
    else if (p == r && g < b)
        h = 60 * ((g - b) / (p - t)) + 360;
    else if (p == g)
        h = 60 * ((b - r) / (p - t)) + 120;
    else if (p == b)
        h = 60 * ((r - g) / (p - t)) + 240;
 
    if (p == 0)
        s = 0;
    else s = 1 - t/p;
 
    v = p;
 
    cout << h << " " << s << " " << v << "\n";
    cin.get();
    cin.get();
    return 0;
}
 
int max(int r, int g, int b) {
    if (r > g && r > b)
        return r;
    else if (g > r && g > b)
        return g;
    else return b;
}
 
int min(int r, int g, int b) {
    if (r < g && r < b)
        return r;
    else if (g < r && g < b)
        return g;
    else return b;
}
1
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 5
14.03.2014, 18:53  [ТС]
Спасибо, у тебя ошибка была, вместо h должна g быть в строке:
C++
1
else if (p == r && h >= b)
Теперь еще вопрос:
Уже сколь своих методов перепробовал, но, почему то считает неправильно, когда я введу значения 1 1 0. Должен получиться ответ 60 100 0 , а получается 0 0 0. Что это?
0
 Аватар для recoder
135 / 134 / 53
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
14.03.2014, 22:56
Лучший ответ Сообщение было отмечено Kabahol как решение

Решение

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
#include <iostream>
#include <cstdlib>
 
#define MIN3(x,y,z)  ((y) <= (z) ? \
                          ((x) <= (y) ? (x) : (y)) \
                      : \
                          ((x) <= (z) ? (x) : (z)))
 
#define MAX3(x,y,z)  ((y) >= (z) ? \
                         ((x) >= (y) ? (x) : (y)) \
                     : \
                         ((x) >= (z) ? (x) : (z)))
 
struct rgb_color {
    double r, g, b;    // 0.0 and 1.0
};
 
struct hsv_color {
    double hue;        // 0.0 and 360.0 
    double sat;        // 0.0 (gray) and 1.0
    double val;        // 0.0 (black) and 1.0 */
};
 
struct hsv_color rgb_to_hsv(struct rgb_color rgb) {
 
    struct hsv_color hsv;
    double rgb_min, rgb_max;
    rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
    rgb_max = MAX3(rgb.r, rgb.g, rgb.b);
    hsv.val = rgb_max;
    if (hsv.val == 0) {
        hsv.hue = hsv.sat = 0;
        return hsv;
    }
 
    // Норм. значение 1
    rgb.r /= hsv.val;
    rgb.g /= hsv.val;
    rgb.b /= hsv.val;
    rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
    rgb_max = MAX3(rgb.r, rgb.g, rgb.b);
    hsv.sat = rgb_max - rgb_min;
    if (hsv.sat == 0) {
        hsv.hue = 0;
        return hsv;
    }
    
    // Насыщение 1
    rgb.r = (rgb.r - rgb_min)/(rgb_max - rgb_min);
    rgb.g = (rgb.g - rgb_min)/(rgb_max - rgb_min);
    rgb.b = (rgb.b - rgb_min)/(rgb_max - rgb_min);
    rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
    rgb_max = MAX3(rgb.r, rgb.g, rgb.b);
 
    if (rgb_max == rgb.r) {
        hsv.hue = 0.0 + 60.0*(rgb.g - rgb.b);
        if (hsv.hue < 0.0) {
            hsv.hue += 360.0;
        }
    } else if (rgb_max == rgb.g) {
        hsv.hue = 120.0 + 60.0*(rgb.b - rgb.r);
    } else /* rgb_max == rgb.b */ {
        hsv.hue = 240.0 + 60.0*(rgb.r - rgb.g);
    }
    return hsv;
}
 
 
int main(int argc, char* argv[]) {
    struct rgb_color rgb;
    struct hsv_color hsv;
    std::cin >> rgb.r;
    std::cin >> rgb.g;
    std::cin >> rgb.b;
    hsv = rgb_to_hsv(rgb);
    std::cout << "Hue: " << hsv.hue << std::endl;
    std::cout << "Saturation: " << hsv.sat << std::endl;
    std::cout << "Value: " << hsv.val << std::endl;
 
    std::cin.get();
    std::cin.get();
    return 0;
}
1
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 5
16.03.2014, 23:40  [ТС]
Немного исправил, доработал. Формулы как раз те, что и надо! Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2014, 23:40
Помогаю со студенческими работами здесь

Перевод RGB в HSV
Уважаемые форумчане! Есть функция для перевода RGB в HSV. void RGBtoHSV (int *hue, int *sat, int *val, int r, int g, int b) { int...

Перевод из RGB в HSV
у меня есть три массива RGB картинки, соответственно красный, синий и зеленый. Как перейти из цветовой модели RGB в цветовую модель HSB...

Перевод из RGB в HSV
Доброго всем времени суток) Для одного web-приложения мне нужно реализовать функцию перевода цветов из RGB в HSV. В принципе я нашёл в сети...

Переход из RGB в HSV
Есть функция, везде хорошо описанная. Как ее применить на практике?.. Подскажите пожалуйста Для перевода цвета из RGB в HSV...

Преобразования цветного изображения из модели RGB в модель YCbCr. Поменять местами Cb и Cr, выполнить обратное преобразо
Задание:Преобразования цветного изображения из модели RGB в модель YCbCr. Поменять местами Cb и Cr, выполнить обратное преобразование. В...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru