Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Цвет, яркость, контрастность... / 25 сообщений из 49, страница 1 из 2
08.08.2018, 09:49
    #39684618
Ученик_333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,
в которых можно было бы выставить имеющиеся ( R,G,B )
и поменять их значениями, типа - цвет, яркость, контрастность .
Поэтому попытался написать свои в этой программе...
Программа (формулы - в окошке, снизу по центру "оставить галочку на - поменять цвет RGB")
С кодом дружу плохо, все тормозит и антивирусники ругаются..
Может кто-то знает нормальные "формулы"?
Заранее благодарен...
...
Рейтинг: 0 / 0
08.08.2018, 09:54
    #39684621
Ученик_333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
...
Рейтинг: 0 / 0
08.08.2018, 10:17
    #39684636
d7i
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
08.08.2018, 10:30
    #39684648
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Это новый вирус такой - через docx распространяется ?
...
Рейтинг: 0 / 0
08.08.2018, 10:39
    #39684656
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
GraphUtil.ColorRGBToHLS
GraphUtil.ColorHLSToRGB
...
Рейтинг: 0 / 0
08.08.2018, 10:40
    #39684660
Ученик_333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
d7i,
Ну вот я подставлю свои значения R,G,B в эту формулу
"sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2)"
А как сделать яркость больше, меньше?
...
Рейтинг: 0 / 0
08.08.2018, 10:46
    #39684665
Ученик_333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Kazantsev Alexey,
Не программным способом, а с помощью формул
...
Рейтинг: 0 / 0
08.08.2018, 10:51
    #39684670
Ученик_333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
schi,
После скачивания вордовского документа, у него почему-то теряется формат.
В имени файла дописываю .docx и тогда открывается..
...
Рейтинг: 0 / 0
08.08.2018, 11:00
    #39684677
Ученик_333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Прошу прощения, вордовский документ в виде изображения пытался загрузить.. :\
Поменять цвет (R,G,B)
...
Рейтинг: 0 / 0
08.08.2018, 11:03
    #39684680
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Ученик_333Не программным способом, а с помощью формул
Посмотри на реализацию этих методов, там и найдёшь формулы.
...
Рейтинг: 0 / 0
08.08.2018, 11:15
    #39684686
d7i
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
08.08.2018, 11:24
    #39684691
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Ученик_333Давно искал формулы для работы с цветом,
наверное плохо искал, но так и не пришел к простым и понятным формулам,

надо было Википедию почитать что ли....
...
Рейтинг: 0 / 0
08.08.2018, 12:20
    #39684749
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
d7iСудя по обсуждениям, 3-я формула наиболее точная. Сомнительно это очень.
Все формулы - ни что иное, как попытка адаптации под психофизику человеческого зрения. И там все должно быть линейно, эвклидовой метрики неоткуда взяться.
...
Рейтинг: 0 / 0
08.08.2018, 13:06
    #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
08.08.2018, 13:34
    #39684803
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Контрастность не может быть применена к цвету, если что. Контрастность - это отношение яркости, как минимум, двух цветов. Про оттенок и яркость уже сказали - их всяко удобно менять в HLS
...
Рейтинг: 0 / 0
08.08.2018, 13:48
    #39684811
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Сергей NВ приводимых формулах Евклидова метрика не при чем. Это чисто эмпирический подход. Но Вы же ей пользуетесь когда возводите в квадрат, суммируете и извлекаете корень. Это применимо для измерения расстояний но совершенно не соответствует принципу работы зрительного анализатора (он устроен весьма сложно, поэтому простые линейные формулы тоже плохо работают).
...
Рейтинг: 0 / 0
08.08.2018, 13:57
    #39684818
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
Вот теперь Ученик_333, наверное, уже понял во что он вляпался...
Работа с цветом и его характеристиками не очень простая. Там не только несколько моделей, но ещё
и кучу цветовых профилей нужно использовать применительно к целевому устройству и назначению.
Достаточно посмотреть на всю эту кухню , к примеру, в фотошопе, чтобы убедится что это далеко не травиальная задача,
которая сводится к паре формул...
...
Рейтинг: 0 / 0
08.08.2018, 15:42
    #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
08.08.2018, 19:25
    #39685023
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет, яркость, контрастность...
schiКонтрастность - это отношение яркости, как минимум, двух цветов
Сергей Nметод минимального контраста с серым

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

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

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

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

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


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