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

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

13.03.2014, 17:52. Показов 6916. Ответов 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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru