powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Цвет, яркость, контрастность...
25 сообщений из 49, страница 1 из 2
Цвет, яркость, контрастность...
    #39684618
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,
в которых можно было бы выставить имеющиеся ( R,G,B )
и поменять их значениями, типа - цвет, яркость, контрастность .
Поэтому попытался написать свои в этой программе...
Программа (формулы - в окошке, снизу по центру "оставить галочку на - поменять цвет RGB")
С кодом дружу плохо, все тормозит и антивирусники ругаются..
Может кто-то знает нормальные "формулы"?
Заранее благодарен...
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684621
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684636
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из Гугла:

Яркость (стандартная для определенных цветовых пространств): (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-я формула наиболее точная.

Остальные формулы найдете в Гугле сами.
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684648
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это новый вирус такой - через docx распространяется ?
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684656
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraphUtil.ColorRGBToHLS
GraphUtil.ColorHLSToRGB
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684660
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
d7i,
Ну вот я подставлю свои значения R,G,B в эту формулу
"sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)"
А как сделать яркость больше, меньше?
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684665
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,
Не программным способом, а с помощью формул
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684670
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi,
После скачивания вордовского документа, у него почему-то теряется формат.
В имени файла дописываю .docx и тогда открывается..
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684677
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, вордовский документ в виде изображения пытался загрузить.. :\
Поменять цвет (R,G,B)
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684680
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ученик_333Не программным способом, а с помощью формул
Посмотри на реализацию этих методов, там и найдёшь формулы.
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684686
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ученик_333d7i,
Ну вот я подставлю свои значения 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.
Формулы преобразований моделей найдете в интернете. Заодно изучите вопрос о цвете в общем.
Там не всё так просто...
Творите.
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684691
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ученик_333Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,

надо было Википедию почитать что ли....
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684749
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d7iСудя по обсуждениям, 3-я формула наиболее точная. Сомнительно это очень.
Все формулы - ни что иное, как попытка адаптации под психофизику человеческого зрения. И там все должно быть линейно, эвклидовой метрики неоткуда взяться.
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684789
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Соколинский Борис]d7iэвклидовой метрики неоткуда взяться.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 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', примеры поищите в интернете).
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684803
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контрастность не может быть применена к цвету, если что. Контрастность - это отношение яркости, как минимум, двух цветов. Про оттенок и яркость уже сказали - их всяко удобно менять в HLS
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684811
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей NВ приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход. Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, поэтому простые линейные формулы тоже плохо работают).
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684818
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот теперь Ученик_333, наверное, уже понял во что он вляпался...
Работа с цветом и его характеристиками не очень простая. Там не только несколько моделей, но ещё
и кучу цветовых профилей нужно использовать применительно к целевому устройству и назначению.
Достаточно посмотреть на всю эту кухню , к примеру, в фотошопе, чтобы убедится что это далеко не травиальная задача,
которая сводится к паре формул...
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39684891
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужны формулы элементарно разжеванные как здесь, ! поставил свои значения и ковыряешься в носу !....
У меня процедура получилась очень большая, есть ли что-то подобное, только компактнее? (В виде формул! + - все дела)

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

R := вставить число от 0 до 255; G := … ; B := … ; // Свое значение "RGB"
Код: pascal
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.
 // Найти максимальное, минимальное и среднее значение из заданных 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)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// 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; // Поменять Контрастность
Код: pascal
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.
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));
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Переменные
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")
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39685023
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiКонтрастность - это отношение яркости, как минимум, двух цветов
Сергей Nметод минимального контраста с серым

что не так?
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39685197
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисСергей NВ приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход. Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, ...).
В плане физики вроде норм, это не расстояние, это энергия. У каждого цвета свой диапазон длин волн и соответственно энергия. Весь вопрос в нормировочных коэффициентах и их корректировке в плане физиологии человеческого глаза
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39685223
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
Энергия - скаляр, а формула явно для векторов.
ЕМНИП, правильная формула все же линейная, но с переменными крэффициентами, которые зависят от точки белого (white point), а она тоже может плавать.
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39685282
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

это да, но у каждого цвета своя энергия, а спектр по цветам и есть вектор
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39685330
Сергей N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соколинский Борисkealon(Ruslan),
правильная формула все же линейная, но с переменными крэффициентами, которые зависят от точки белого (white point), а она тоже может плавать.

По сути, Вы говорите об относительном сером цвете с максимальной яркостью (термин не очень подходит) для данного источника (монитора). Про зависимость от точки белого я согласен, но, к сожалению, мне не удалось свести с приемлемой точностью известные линейные функции с визуальной сравнительной оценкой соответствующего серого цвета. Мой опыт дал противоположный результат. Гораздо быстрее удавалось свести квадратичные функции (энергетические или интенсивностные). Так что я согласен с kealon.
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39691556
Ученик_333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev AlexeyGraphUtil.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) - Фиолетовый (темный,чистый,светлый)
...
Рейтинг: 0 / 0
Цвет, яркость, контрастность...
    #39691589
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Относительно "радуги" лично у меня имеются большие сомнения...
Там один цвет (голубой) явно притянут за уши.
Судите сами: есть 3 основных цвета - красный,желтый,синий. И между ними 3 дополнительных (смеси соседних):
красный+желтый=оранжевый
желтый+синий=зеленый
синий+красный=фиолетовый
Итого имеем: красный-оранжевый-желтый-зеленый-синий-фиолетовый
Голубой сюда просто не вписывается, так как является частью синего.

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

Так что не всё так просто и от формул с коэффициентами избавиться не удастся, так как все формулы
адаптированы под человека. Можете их упростить, но тогда они будут под непонятно кого.
Может для робота-андроида сгодятся, если его зрение будет работать именно по этим формулам.
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Цвет, яркость, контрастность...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]