Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Вычислить длинну волны цвета


Автор: DoZENT 26.5.2010, 09:14
Общая задача такая: взять цвет пикселя и определить, к какому из 7 основных цветов он принадлежит, т.е. оттенком которого он является. Появилась идея найти длину волны цвета, а по ней уже определять основной цвет. Как это можно сделать и может быть есть какой-то другой более легкий способ?

Автор: Фантом 26.5.2010, 11:34
Цитата(DoZENT @  26.5.2010,  09:14 Найти цитируемый пост)
Появилась идея найти длину волны цвета, а по ней уже определять основной цвет. Как это можно сделать и может быть есть какой-то другой более легкий способ? 

Это просто невозможно сделать - далеко не все цвета являются монохроматичными, т.е. описываются одной длиной волны.

Проще, пожалуй, так. В RGB есть "выделенные" цвета:
0, 0, 0 - черный
255, 0, 0 - красный
0, 255, 0 - зеленый
0, 0, 255 - синий
255, 255, 0 - желтый
0, 255, 255 - голубой (вернее, "циановый")
255, 0, 255 - пурпурный
255, 255, 255 - белый

Для RGB-координат пиксела можно определить какое-то расстояние (ну, например, банальный корень квадратный из суммы квадратов разностей координат), после чего посмотреть, к какому из "выделенных" цветов пиксел ближе.

Автор: Bitter 26.5.2010, 12:27
а вы о цветовых моделях HSB и HLS слышали? Ключевая буква в этих моделях - H, обозначающая оттенок. Переведите RGB в HLS и вы получите оттенок. А дальше умножьте это значение на 7 и разделите на 240. Вот вам и цвет. Если надо точнее, задайте 7 значений цветов и ищите минимальное расстояние от полученого значения к заданным значениям.

Автор: x128 26.5.2010, 16:03
Как вариант, можно найти у максимального значения rgb позицию старшего установленного бита, проверить эту позицию в каждой компоненте и сложить результат:
Код

uses math;
...
function IdentColor(r,g,b: byte): TColor;
var
  s: byte;
begin
  s:=1 shl trunc(log2(max(max(r,g),b)));
  result:=rgb(ord(r and s<>0)*255, ord(g and s<>0)*255, ord(b and s<>0)*255);
end;

Это решение точнее вычисления расстояния и проще перевода в другое цветовое пространство хоть и не такое точное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)