Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,
в которых можно было бы выставить имеющиеся (R,G,B)
и поменять их значениями, типа - цвет, яркость, контрастность.
Поэтому попытался написать свои в этой программе...
Программа (формулы - в окошке, снизу по центру "оставить галочку на - поменять цвет RGB")
С кодом дружу плохо, все тормозит и антивирусники ругаются..
Может кто-то знает нормальные "формулы"?
Заранее благодарен...

К сообщению приложен файл (! Поменять цвет (R,G,B).docx - 26Kb) cкачать
8 авг 18, 09:49    [21633841]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39


К сообщению приложен файл (Поменять цвет (R,G,B).docx - 26Kb) cкачать
8 авг 18, 09:54    [21633850]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 411
Из Гугла:

Яркость (стандартная для определенных цветовых пространств): (0.2126*R + 0.7152*G + 0.0722*B)
Luminance (вариант 1): (0.299*R + 0.587*G + 0.114*B)
Luminance (вариант 2, медленнее для вычисления): sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 ) или
sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)

Судя по обсуждениям, 3-я формула наиболее точная.

Остальные формулы найдете в Гугле сами.
8 авг 18, 10:17    [21633915]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
Это новый вирус такой - через docx распространяется ?
8 авг 18, 10:30    [21633950]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3480
GraphUtil.ColorRGBToHLS
GraphUtil.ColorHLSToRGB
8 авг 18, 10:39    [21633969]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
d7i,
Ну вот я подставлю свои значения R,G,B в эту формулу
"sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)"
А как сделать яркость больше, меньше?
8 авг 18, 10:40    [21633976]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
Kazantsev Alexey,
Не программным способом, а с помощью формул
8 авг 18, 10:46    [21633985]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
schi,
После скачивания вордовского документа, у него почему-то теряется формат.
В имени файла дописываю .docx и тогда открывается..
8 авг 18, 10:51    [21633995]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
Прошу прощения, вордовский документ в виде изображения пытался загрузить.. :\
Поменять цвет (R,G,B)
8 авг 18, 11:00    [21634017]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3480
Ученик_333
Не программным способом, а с помощью формул

Посмотри на реализацию этих методов, там и найдёшь формулы.
8 авг 18, 11:03    [21634023]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 411
Ученик_333
d7i,
Ну вот я подставлю свои значения R,G,B в эту формулу
"sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)"
А как сделать яркость больше, меньше?


Вычисляем текущую яркость:
Y=sqrt(0.299*R^2 + 0.587*G^2 + 0.114*B^2);

Измененная яркость (умноженная на коэффициент К):
Y1=K*sqrt(0.299*R^2 + 0.587*G^2 + 0.114*B^2);

Значение Y1 нам известно.

Вычисляем новые значения RGB и устанавливаем их.
Как быстрее и точнее вычислить - ищите в Гугле.
Там всё есть, только искать надо уметь.

От себя: в данной задаче легче будет работать через HLS-модель, а не RGB.
Формулы преобразований моделей найдете в интернете. Заодно изучите вопрос о цвете в общем.
Там не всё так просто...
Творите.
8 авг 18, 11:15    [21634036]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Ученик_333
Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,


надо было Википедию почитать что ли....
8 авг 18, 11:24    [21634045]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 9695
d7i
Судя по обсуждениям, 3-я формула наиболее точная.
Сомнительно это очень.
Все формулы - ни что иное, как попытка адаптации под психофизику человеческого зрения. И там все должно быть линейно, эвклидовой метрики неоткуда взяться.
8 авг 18, 12:20    [21634148]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Сергей N
Member

Откуда: отсюда
Сообщений: 57
[quot Соколинский Борис]
d7i
эвклидовой метрики неоткуда взяться.


В приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход. Можно нашлепать и еще формулы:

 function RGBMultiLuminance(Color: TColor; Mode: Byte): integer;
begin
  with LongRec(ColorToRGB(Color)) do
    case Mode of
      // Быстрая R:= Round(0.299 * Bytes[0] + 0.587 * Bytes[1] + 0.114 * Bytes[2]);
      0: Result:= (306 * Bytes[0] + 601 * Bytes[1] + 117 * Bytes[2] + 511) shr 10;
      // Быстрая R:= Round(0.2126 * Bytes[0] + 0.7152 * Bytes[1] + 0.0722 * Bytes[2]);
      1: Result:= (3483 * Bytes[0] + 11718 * Bytes[1] + 1183 * Bytes[2] + 8191) shr 14;
      // Медленная функция
      2: Result:= Round(SqrtX(0.299*Bytes[0]*Bytes[0] + 0.587*Bytes[1]*Bytes[1] + 0.114*Bytes[2]*Bytes[2]));
      // Медленная
      3: Result:= Round(SqrtX(0.241*Bytes[0]*Bytes[0] + 0.691*Bytes[1]*Bytes[1] + 0.068*Bytes[2]*Bytes[2]));
      // Медленная
      4: Result:= Round(SqrtX(0.2126*Bytes[0]*Bytes[0] + 0.7152*Bytes[1]*Bytes[1] + 0.0722*Bytes[2]*Bytes[2]));
      // Медленная уточненная
      5: Result:= Round(SqrtX(0.312161399548533*Bytes[0]*Bytes[0] + 0.612838600451467*Bytes[1]*Bytes[1] + 0.075*Bytes[2]*Bytes[2]));
      // Медленная уточненная
      6: Result:= Round(SqrtX(0.322285553*Bytes[0]*Bytes[0] + 0.632714447*Bytes[1]*Bytes[1] + 0.045*Bytes[2]*Bytes[2]));
      // Медленная уточненная
      7: Result:= Round(SqrtX(0.31*Bytes[0]*Bytes[0] + 0.639*Bytes[1]*Bytes[1] + 0.051*Bytes[2]*Bytes[2]));
    else
      Result:= (306 * Bytes[0] + 601 * Bytes[1] + 117 * Bytes[2] + 511) shr 10;
    end;
end;


Я, например, на практике для уточнения коэффициентов использовал метод минимального контраста с серым, рассчитанная яркость которого равна рассчитанной яркости исходного цвета (нужен калиброванный экран). (Почему-то не получается вставить картинку).
Чтобы не ломать голову, для изменения яркости в процентах вполне подходит функция ColorAdjustLuma (external 'Shlwapi.dll', примеры поищите в интернете).

К сообщению приложен файл. Размер - 100Kb
8 авг 18, 13:06    [21634271]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
Контрастность не может быть применена к цвету, если что. Контрастность - это отношение яркости, как минимум, двух цветов. Про оттенок и яркость уже сказали - их всяко удобно менять в HLS
8 авг 18, 13:34    [21634330]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 9695
Сергей N
В приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход.
Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, поэтому простые линейные формулы тоже плохо работают).
8 авг 18, 13:48    [21634365]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 411
Вот теперь Ученик_333, наверное, уже понял во что он вляпался...
Работа с цветом и его характеристиками не очень простая. Там не только несколько моделей, но ещё
и кучу цветовых профилей нужно использовать применительно к целевому устройству и назначению.
Достаточно посмотреть на всю эту кухню , к примеру, в фотошопе, чтобы убедится что это далеко не травиальная задача,
которая сводится к паре формул...
8 авг 18, 13:57    [21634383]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
Нужны формулы элементарно разжеванные как здесь, !поставил свои значения и ковыряешься в носу!....
У меня процедура получилась очень большая, есть ли что-то подобное, только компактнее? (В виде формул! + - все дела)

Красным вы вводите нужное вам значение, синим выделен полученный на выходе результат...

R := вставить число от 0 до 255; G := … ; B := … ; // Свое значение "RGB"
 // Найти максимальное, минимальное и среднее значение из заданных R,G,B
 RGBmax:=(((((R+G)/2)+(abs(R-G)/2))+B)/2)+(abs((((R+G)/2)+(abs(R-G)/2))-B)/2);
 RGBmin:=(((((R+G)/2)-(abs(R-G)/2))+B)/2)-(abs((((R+G)/2)-(abs(R-G)/2))-B)/2);
 RGBmid:=(R+G+B)-(RGBmax+RGBmin);
// Обозначить максимальное значение в виде «2», среднее «1» и минимальное «0»
     Rm:=abs((Trunc((R+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(R+1))-1);
     Gm:=abs((Trunc((G+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(G+1))-1);
     Bm:=abs((Trunc((B+1)/(RGBmax+1))*3)+Trunc((RGBmin+1)/(B+1))-1);
BGW:=1-Trunc((Rm+Gm+Bm)/9);            // Если (R=G=B), то BGW=0, иначе BGW=1
D:=((RGBmax-RGBmin+1)/2)-Trunc((RGBmax-RGBmin+1)/2); // Если нечетн. яркость. или (R=G=B), то D=0.5 , иначе D=0
Light:=((253+((RGBmax-127)-(127-RGBmin)))/2)-D+(1-BGW); // Яркость выбранного цвета
E := Ceil((RGBmid-Light)/129); // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
// Номер треугольника
Q := ((1-E)*(Trunc(Rm/2)+Trunc(Gm/2)*3+Trunc(Bm/2)*5)+E*((1-Ceil(Bm/2))*2+(1-Ceil(Rm/2))*4+(1-Ceil(Gm/2))*6))*BGW;
Zmax := Floor(abs(127-abs((127-Light)-D)))*BGW; // Максимальное количество рядов на яркости "Light"
Z := (127-((RGBmax-Light)-1-(D*2)))*BGW; // Контрастность (Номер ряда с цветом)
Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду "Z"
Qp := Q-Floor(Q/4)*3; // Приравниваем 6 треугольников к виду 1,2,3 (1-4,2-5,3-6)
 // Если выделена левая сторона треугольника, или центр, LR=0. Если правая, LR=1
LR := (1-abs(Bm-1))*Trunc((Qp-1)/2)+      // Если Bm = RGBmid, и Qp = 3(6), то LR=1 
          (1-abs(Rm-1))*(1-abs(Qp-2))+          // Если Rm = RGBmid, и Qp = 2(5), то LR=1 
          (1-abs(Gm-1))*(1-Ceil((Qp-1)/2));   // Если Gm = RGBmid, и Qp = 1(4), то LR=1 
Xc := abs((Light-RGBmin)*(1-LR*2)-abs(RGBmid-RGBmin*(1-E)-RGBmax*E)+(D*2)*E*(1-LR*2));  // Порядковый № ячейки 
Xmain := ((127-Y1/2)+Xc+(Q-1)*255)*BGW;// Координата по оси X, на общей сетке координат
//--------------------------------------------------------Противоположное значение цвета -------------------------------------------------------------
// "не обязательно" Чтобы найти значение цвета через определенный промежуток - прибавить число от +1 до +1529
// Xmain := Xmain + вставить число от 1 до 1529;
// Lc := Trunc(Xmain/1530); // Если Xmain>1529, то Lc=1, иначе Lc=0
// Xmain := Xmain - Lc*1530; // Установить значение цвета в пределах от 0 до 1529. Ниже поменять Xall := Xmain+1;
//-----------------------------------------------------------------------Поменять «Цвет» -------------------------------------------------------------------- 
 // Xall = (от 0 до 1531), где 0 - координата для переброса из начала 1 треуг. в конец 6| 1531 - из конца 6 тр. в начало 1
  //                                                      а координаты от 1 до 1530, то же что и координаты с ячейками от 0 до 1529

// Чтобы оставить знач. цвета в прежнем состоянии (Xall = Xmain+1)
Xall := вставить число от 0 до 1531; // Поменять Цвет (Координата выбранной ячейки с цветом, по оси X)
// Xout - формула для переброса от 0 к 1529, в «0» ряду. Т.к. пустых ячеек для отслеживания переходов там нет
   Xout :=  Ceil((765-Xall)/766)*((1-Ceil(Xall/1531))+Trunc(Xall/1531)); //  Если Xall=0, то Xout=1. Если Xall=1531, то Xout=-1
   Xall2 := Xall + Xout - 1; // Выравниваем значение координаты Xall
  Q := Ceil((Xall2+1)/255);    // Номер выбранного треугольника
  E := 1-(Q/2-Trunc(Q/2))*2; // Если выбран четный (2,4,6) треугольник, то E=1, иначе (1,3,5) E=0
  Y1 := (((127-Z)*2)+(D*4)*E)*BGW; // Количество ячеек в ряду "Z"
   Xborder := 127-(Y1/2); // Количество пустых ячеек, слева от треугольника
   Qa := (Q-1)*255;       // Координаты квадрата с выбранным треугольником
   Xc := Xall2-Qa; // Порядковый номер ячейки в пределах квадрата (в котором находится треугольник)
   LR := Ceil((Xc/254)-0.5) ; // Если ячейка находится левее центра, то LR=0 , иначе LR=1
  Lc := 1-Ceil(Trunc(abs((Xall2-Qa)-127)/((Y1/2)+1))/128); // Если координата в пределах треугольника, то Lc=1, иначе Lc=0
  Xc := (Xc-Xborder)*Lc+(Y1*LR)*(1-Lc);  // Порядковый номер выбранной ячейки в треугольнике
 // т.к. в 1 ряду, при D=0,5, только 1 пустая ячейка, то делаем сплошной переход (включая в рассчеты эту ячейку)
 SkipRow1 := Trunc((127-Z)/126)*(D*2)*(1-Lc);  // При D=0,5 и Z=1, SkipRow1=1, иначе 0
Xx:= trunc(((1530*(1-Ceil((Q-1)/6))+Qa-Xborder-1+(1-2*E)*(D*2))*(1-LR)+ (Qa+255+Xborder-(1-2*E)*(D*2)-1530*Trunc(Q/6))*
LR)*(1-Lc-SkipRow1+abs(Xout))+ (Xall-1)*(Lc+SkipRow1-abs(Xout))); // Цвет - на контрастности Z
   Qrgbmax := Trunc((Q+((1-LR)*(-E)+LR*E)-(LR*Trunc(Q/6)*6))/2); // = 0- R, 1- G, 2- B .  К какому из цветов отнести RGBmax
   Qrgbmin := ((Q+((1-LR)*(-(1-E))+LR*(1-E))+((1-LR)*((1-Ceil((Q-1)/6))*6)))/2)-1;   // = 0- B, 1- R, 2- G .                            - RGBmin
   Qp := Q - Floor(Q/4)*3; // Приравниваем все 6 треугольников, к 1,2,3 (1-1,2-2,3-3) (4-1,5-2,6-3)
   Qrgbmid := (Qp+LR-(LR*Trunc(Qp/3)*3))-1;  //  = 0- B, 1- G, 2- R .  К какому из цветов отнести RGBmid
   // Приравниваем RGB(min,max,mid) к соответствующим Rm, Gm, Bm
   Rm := (1-Ceil(Qrgbmax/2))*2 + Trunc(Qrgbmid/2);
   Gm := (1-abs(Qrgbmax-1))*2 + (1-abs(Qrgbmid-1));         Bm := Trunc(Qrgbmax/2)*2 + (1-Ceil(Qrgbmid/2));
//------------------------------------------------Поменять значения «Яркость» - «Контрастность» ------------------------------------------------

// Чтобы оставить знач. яркости в прежнем состоянии (Yarkost = Light*2)
Yarkost := вставить число от 0 до 508 / 2; // Поменять Яркость
// Чтобы оставить знач. контрастности в прежнем состоянии (Zcontrast = Z)
Zcontrast := вставить число от 0 до 127; // Поменять Контрастность
D := Yarkost-Trunc(Yarkost); // Четная (D=0) или нечетная (D=0.5) яркость
Yarkost := Trunc(Yarkost);
Zmax2 := Floor(abs(127-abs((127-Yarkost)-D)))*BGW; // Максимальное количество рядов, на заданной яркости "Yarkost"
Lc := 1-Ceil(((127-Zcontrast)-Zmax)/128); // Если Zcontrast меньше или равен Zmax , то Lc=1, иначе Lc=0
 Zcontrast := (127-Zcontrast)*Lc + Zmax*(1-Lc); // Если выбранная контрастность, за пределами Zmax, то Zcontrast=Zmax
 Lc := 1-Ceil((Zmax2-Zmax)/128); // Если Zmax2 меньше или равен Zmax , то Lc=1, иначе Lc=0

// Чтобы узнать контрастность в ряду Zmax, относительно Zmax2, можно поменять их местами, в 2-х формулах ниже 
Zero := 1-Ceil(Zmax/127); // Переменная, для исключения деления на ноль
Zcontrast := 127 - (Round((Zmax2/(Zmax+Zero))*Zcontrast)*Lc + Zcontrast*(1-Lc));  // Ряд-Контрастность , при «Yarkost»
//------------------------------------Установить ограничение по контрастности (не обязательно)----------------------------------------------
// Zmainmax2 := trunc(127-Zmax);  // Минимальное значение контраст., на заданной яркости "Yarkost"
//---------------Ниже, можно использовать формулы, по отдельности для - «Яркость-Контрастность» или «Цвет»---------------
 Zero2 := 1-Ceil(Y1/254); // Переменная, для исключения деления на ноль
//  (Xc+Zero2) Можно поменять на  (Xc+Zero2/2)- чтобы "k" в 127 ряду (0 ячейка), был =  0,5. Или только (Xc), "k"=0
 k := (1/(Y1+Zero2))* (Xc+Zero2);   // Коэффициент положения ячейки в Основном ряду (Z)
 Y2 := ((127-Zcontrast)*2)+(D*4)*E; // Количество ячеек в Целевом ряду (Zcontrast)

 Xc2 := abs((Y2*LR)-Round(abs(k-LR)*Y2)); // Порядковый номер ячейки в Целевом ряду (Zcontrast)

 Xx2 := (127-Y2/2)+Xc2+(Q-1)*255; // Цвет - на контрастности Zcontrast 

// NoRow254= 0 если Yarkost=254, иначе NoRow254= 1.  «на 254 яркости, при D=0.5, нет ячеек с цветом»
NoRow254 := 1-Trunc(Yarkost/254); 
// Вычислить максимальное, минимальное и среднее значение
RGBmax2 := Yarkost+(127-Zcontrast)+1+(D*2)*NoRow254;      RGBmin2 := Yarkost-(127-Zcontrast);
RGBmid2 := abs(abs((Y2/2)-Xc2)+(RGBmin2*(1-E)-RGBmax2*E));

// Результат "RGB" Сопоставить полученные результаты (RGBmid, RGBmin, RGBmax) с (R, G, B)
R:=Trunc(abs((Trunc(Rm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Rm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
G:=Trunc(abs((Trunc(Gm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Gm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
B:=Trunc(abs((Trunc(Bm/2)*(RGBmax2+RGBmid2))+(Trunc(1/(Bm+1))*(RGBmin2+RGBmid2))-RGBmid2)*BGW + Yarkost*(1-BGW));
// Переменные
R, G, B : byte;
RGBmax, RGBmin, RGBmid, Rm, Gm, Bm,
Light, BGW, D, E, Q, Qp, Qa, LR, Y1, Xc,
Zero, Zero2, k, Y2, Xc2, Z, Zcontrast,
Yarkost, Lc, Zmax, Zmax2, NoRow254,
RGBmax2, RGBmin2, RGBmid2, Xmain,
Xall, Xall2, Xx, Xx2, Xborder, Xout,
SkipRow1, Qrgbmax, Qrgbmin, Qrgbmid : Extended;


Небольшая программка с примером конкретно этих формул (вместе с исходниками "Delphi")

Большая программа, понапихано все подряд (без исходников)
Большая программа, понапихано все подряд (с исходниками "Delphi")

К сообщению приложен файл. Размер - 108Kb
8 авг 18, 15:42    [21634586]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Arioch
Member

Откуда:
Сообщений: 10807
schi
Контрастность - это отношение яркости, как минимум, двух цветов

Сергей N
метод минимального контраста с серым


что не так?
8 авг 18, 19:25    [21634908]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4487
Соколинский Борис
Сергей N
В приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход.
Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, ...).

В плане физики вроде норм, это не расстояние, это энергия. У каждого цвета свой диапазон длин волн и соответственно энергия. Весь вопрос в нормировочных коэффициентах и их корректировке в плане физиологии человеческого глаза
9 авг 18, 08:49    [21635355]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 9695
kealon(Ruslan),
Энергия - скаляр, а формула явно для векторов.
ЕМНИП, правильная формула все же линейная, но с переменными крэффициентами, которые зависят от точки белого (white point), а она тоже может плавать.
9 авг 18, 09:20    [21635397]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4487
Соколинский Борис,

это да, но у каждого цвета своя энергия, а спектр по цветам и есть вектор
9 авг 18, 10:40    [21635524]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Сергей N
Member

Откуда: отсюда
Сообщений: 57
Соколинский Борис
kealon(Ruslan),
правильная формула все же линейная, но с переменными крэффициентами, которые зависят от точки белого (white point), а она тоже может плавать.


По сути, Вы говорите об относительном сером цвете с максимальной яркостью (термин не очень подходит) для данного источника (монитора). Про зависимость от точки белого я согласен, но, к сожалению, мне не удалось свести с приемлемой точностью известные линейные функции с визуальной сравнительной оценкой соответствующего серого цвета. Мой опыт дал противоположный результат. Гораздо быстрее удавалось свести квадратичные функции (энергетические или интенсивностные). Так что я согласен с kealon.
9 авг 18, 11:21    [21635632]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
Ученик_333
Member

Откуда:
Сообщений: 39
Kazantsev Alexey
GraphUtil.ColorRGBToHLS GraphUtil.ColorHLSToRGB

schi
Про оттенок и яркость уже сказали - их всяко удобно менять в HLS

HLS модель не подходит, т.к. хотелось бы работать со всеми имеющимися цветами без потерь...
Из-за введенных констант в формулах типа - (Y = 0.299 * R + 0.587 * G + 0.114 * B)
нет уверенности, что учитывается весь диапазон цвета (16 777 216 цветов).
В этой программе я расставил все цвета таким образом, чтобы они не терялись и не повторялись...
(каждый, конечно, не проверял, но вроде бы все на своих местах)
Только в формулах очень много лишнего, если постараться, то можно написать и покороче, но я не математик...
Arioch
надо было Википедию почитать что ли....

d7i
ищите в Гугле. Там всё есть

Еще раз перелопатил весь интернет в поисках нужного алгоритма,
но опять столкнулся с тем, что в каждой найденной теме используются константы.
Очевидно - глаза у всех видят по разному, а значит что и константа нужна лишь затем,
чтобы сформировать конкретный диапазон цвета, под конкретного человека
+ нужно учитывать, что каждый монитор показывает цвета по разному,
так что смысл не в том, чтобы подгонять цвета под константы, а в том, чтобы
расставить их в таком порядке, в каком они используются в природе.
(та же радуга к примеру или преломление света через призму)
(1 0 0) (255 0 0) (255 254 254) - Красный (темный,чистый,светлый)
(1 1 0) (255 255 0) (255 255 254) - Желтый (темный,чистый,светлый)
(0 1 0) (0 255 0) (254 255 254) - Зеленый (темный,чистый,светлый)
(0 1 1) (0 255 255) (254 255 255) - Голубой (темный,чистый,светлый)
(0 0 1) (0 0 255) (254 254 255) - Синий (темный,чистый,светлый)
(1 0 1) (255 0 255) (255 254 255) - Фиолетовый (темный,чистый,светлый)

К сообщению приложен файл. Размер - 129Kb
22 авг 18, 10:51    [21650405]     Ответить | Цитировать Сообщить модератору
 Re: Цвет, яркость, контрастность...  [new]
d7i
Member

Откуда:
Сообщений: 411
Относительно "радуги" лично у меня имеются большие сомнения...
Там один цвет (голубой) явно притянут за уши.
Судите сами: есть 3 основных цвета - красный,желтый,синий. И между ними 3 дополнительных (смеси соседних):
красный+желтый=оранжевый
желтый+синий=зеленый
синий+красный=фиолетовый
Итого имеем: красный-оранжевый-желтый-зеленый-синий-фиолетовый
Голубой сюда просто не вписывается, так как является частью синего.

В мониторах (телевизорах и т.д.) желтый цвет вообще заменен на зеленый (RGB).
Отсюда начинают вылезать формулы с разными коэффициентами для адаптации к зрению человека.
Для адаптации к другим устройствам синтеза цветов (принтеры, типографские машины и т.п.) эти
коэффициенты получаются везде разные.

Так что не всё так просто и от формул с коэффициентами избавиться не удастся, так как все формулы
адаптированы под человека. Можете их упростить, но тогда они будут под непонятно кого.
Может для робота-андроида сгодятся, если его зрение будет работать именно по этим формулам.
22 авг 18, 11:31    [21650472]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить