Форум РадиоКот • Просмотр темы - преобразование HSV в RGB
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 5 ]
Автор
Сообщение
FreshMan
Заголовок сообщения: преобразование HSV в RGB
Добавлено: Ср янв 04, 2017 21:29:23
Друг Кота
Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15Сообщений: 6296Откуда: Ukraine
Рейтинг сообщения: 0
Вернуться наверх
Реклама
ARV
Заголовок сообщения: Re: преобразование HSV в RGB
Добавлено: Ср янв 04, 2017 22:07:02
Ум, честь и совесть. И скромность.
Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18403Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
попробуйте вот это - я накорябал сам на основе тех ссылок, которые вам рекомендовал. думаю, разберетесь...
Код:
/** \file rgb.c * \par \author ARV \par * \n \date 25 дек. 2016 г. * Copyright 2015 © ARV. All rights reserved. * \par * Для компиляции требуется:\n * -# Atmel Toolchain 3.4.5 или более новая версия */ #include <avr/io.h> #include <avr_helper.h> /// если этот макрос есть, оттенок (HUE для HSV-модели цвета) будет в градусах /// иначе в условных единицах от 0 до 255 //#define HUE_SMOOTH #if defined(HUE_SMOOTH) #define hue_t uint16_t #define HUE_MAX 360 #else #define hue_t uint8_t #define HUE_MAX 256 #endif #define HUE_QUADRANT ((HUE_MAX + 5)/ 6) typedef struct{ uint8_t r; uint8_t g; uint8_t b; } color_rgb_t; typedef struct{ hue_t h; uint8_t s; uint8_t v; } color_hsv_t; void hsv_to_rgb(const color_hsv_t *hsv, color_rgb_t *rgb); void rgb_to_hsv(const color_rgb_t *rgb, color_hsv_t *hsv); void hsv_to_rgb(const color_hsv_t *hsv, color_rgb_t *rgb){ uint8_t region, fpart, p, q, t; if(hsv->s == 0) { /* color is grayscale */ rgb->r = rgb->g = rgb->b = hsv->v; return; } /* make hue 0-5 */ region = hsv->h / HUE_QUADRANT; /* find remainder part, make it from 0-255 */ fpart = (hsv->h - (region * HUE_QUADRANT)) * 6; /* calculate temp vars, doing integer multiplication */ p = (hsv->v * (255 - hsv->s)) >> 8; q = (hsv->v * (255 - ((hsv->s * fpart) >> 8))) >> 8; t = (hsv->v * (255 - ((hsv->s * (255 - fpart)) >> 8))) >> 8; /* assign temp vars based on color cone region */ switch(region) { case 0: rgb->r = hsv->v; rgb->g = t; rgb->b = p; break; case 1: rgb->r = q; rgb->g = hsv->v; rgb->b = p; break; case 2: rgb->r = p; rgb->g = hsv->v; rgb->b = t; break; case 3: rgb->r = p; rgb->g = q; rgb->b = hsv->v; break; case 4: rgb->r = t; rgb->g = p; rgb->b = hsv->v; break; default: rgb->r = hsv->v; rgb->g = p; rgb->b = q; break; } } #define MIN(x,y) ((x) < (y))?(x):(y) #define MAX(x,y) ((x) > (y))?(x):(y) void rgb_to_hsv(const color_rgb_t *rgb, color_hsv_t *hsv){ uint8_t min, max, delta; int16_t hsvh; min = MIN(rgb->r, MIN(rgb->g, rgb->b)); max = MAX(rgb->r, MAX(rgb->g, rgb->b)); hsv->v = max; // v, 0..255 delta = max - min; // 0..255, < v if(max != 0) hsv->s = (int)(delta)*255 / max; // s, 0..255 else { // r = g = b = 0 // s = 0, v is undefined hsv->s = 0; hsv->h = 0; return; } if(rgb->r == max) hsvh = (rgb->g - rgb->b)*HUE_QUADRANT/delta; // between yellow & magenta else if(rgb->g == max) hsvh = (HUE_QUADRANT*2) + (rgb->b - rgb->r)*HUE_QUADRANT/delta; // between cyan & yellow else hsvh = (HUE_QUADRANT*4) + (rgb->r - rgb->g)*HUE_QUADRANT/delta; // between magenta & cyan if(hsvh < 0) hsvh += HUE_MAX; hsv->h = hsvh; }
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
Реклама
FreshMan
Заголовок сообщения: Re: преобразование HSV в RGB
Добавлено: Чт янв 05, 2017 12:06:09
Друг Кота
Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15Сообщений: 6296Откуда: Ukraine
Рейтинг сообщения: 0
Код:
const color_hsv_t *hsv
из каких соображений вы указатель сделали константой ?
значения получаются в процентах
_________________Tell Me The Truth
Вернуться наверх
ARV
Заголовок сообщения: Re: преобразование HSV в RGB
Добавлено: Чт янв 05, 2017 16:42:20
Ум, честь и совесть. И скромность.
Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18403Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
не указатель, а структуру, на которые он указывает - чтобы оптимизатор мог воспользоваться, если пожелает, тем фактом, что данные в этой струтуре меняться в функции не будут.
FreshMan писал(а):
значения получаются в процентах
мне казалось, в моем коде значения должны получаться в пределах от 0 до 255. хотя сам-то я и не проверял - на вас надеюсь
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
Реклама
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Подробнее>>
FreshMan
Заголовок сообщения: Re: преобразование HSV в RGB
Добавлено: Чт фев 02, 2017 21:12:43
Друг Кота
Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15Сообщений: 6296Откуда: Ukraine
Рейтинг сообщения: 1
после долгих поисков была найдена оптимальная ф-ция преобразования HSV в RGB для AVR которая выдает оптимальный результат
Спойлер Код:
void hsv_to_rgb(volatile uint8_t *r, volatile uint8_t *g, volatile uint8_t *b, uint16_t h, uint8_t s, uint8_t v){ uint8_t hi,fr, p, q, t; volatile uint8_t h_pr; if(s == 0) { /* color is grayscale */ *r = *g = *b = v; return; } hi = h / 60; switch(hi) { case 0: h_pr = h; break; case 1: h_pr = h - 60; break; case 2: h_pr = h - 120; break; case 3: h_pr = h - 180; break; case 4: h_pr = h - 240; break; case 5: h_pr = h - 300; break; } fr = ( h_pr * 255 ) / 60; p = v * ( 255 - s ) / 255; q = v * ( 255 - ( ( s * fr ) / 255 ) ) / 255; t = v * ( 255 - ( s * ( 255 - fr ) / 255 ) ) / 255; switch(hi) { case 0: *r = v; *g = t; *b = p; break; case 1: *r = q; *g = v; *b = p; break; case 2: *r = p; *g = v; *b = t; break; case 3: *r = p; *g = q; *b = v; break; case 4: *r = t; *g = p; *b = v; break; case 5: *r = v; *g = p; *b = q; break; } }
алгоритм
пользуйтесь, на здоровье
первоисточник
http://radiolaba.ru/microcotrollers/tsv ... mment-1790
_________________Tell Me The Truth
Вернуться наверх
Реклама
Страница 1 из 1
[ Сообщений: 5 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения