Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Последующие действия: поиск точного "distance" между цветами
Я ищу функцию, которая пытается количественно определить, насколько "distant" (или различны) два цвета. Этот вопрос действительно состоит из двух частей:
- Какое цветовое пространство лучше всего отражает человеческое зрение?
- Какая метрика расстояния в этом пространстве лучше всего отражает человеческое зрение (евклидово?)
Преобразуйте в La*b* (он же просто "Lab", и вы также увидите ссылку на "CIELAB"). Хорошим быстрым измерением разницы в цвете является
(L1-L2)^2 + (a1-a2)^2 + (b1-b2)^2
У цветоведов есть и другие, более утонченные измерения, которые, возможно, не стоит беспокоиться, в зависимости от точности, необходимой для того, что вы делаете.
Значения a и b представляют противоположные цвета таким же образом, как и колбочки, и могут быть отрицательными или положительными. Нейтральные цвета-белый, серый - это a=0 , b=0 . L -это яркость, определенная определенным образом, от нуля (чистая темнота) до чего угодно.
Грубое объяснение: > > учитывая цвет, наши глаза различают два широких диапазона длин волн-синий и более длинные волны. а затем, благодаря более недавней генетической мутации, конусы с более длинной длиной волны раздвоились на две части, различая для нас красный и зеленый цвета.
Кстати, это будет здорово для вашей карьеры, чтобы подняться выше ваших коллег-цветных пещерных людей, которые знают только "RGB" или "CMYK", которые отлично подходят для устройств, но отстой для серьезной работы восприятия. Я работал на ученых-визуалистов, которые ничего об этом не знали!
Для более увлекательного чтения по теории цветовых различий попробуйте:
- http://white.stanford.edu/~brian/scielab/introduction.html и информация
- и ссылки на теорию цвета в целом, websurf начиная с http://www.efg2.com/Lab/Library/Color/ и
- http://www.poynton.com/Poynton-color.html
Более подробно о Lab at http://en.kioskea.net/video/cie-lab.php3 я не могу в настоящее время найти некрасивую страницу, на которой действительно были формулы преобразования, но я уверен, что кто-то отредактирует этот ответ, чтобы включить его.
как cmetric.htm ссылка выше не удалась для меня, так и многие другие реализации для цветового расстояния я нашел (после очень долгого jurney..) как рассчитать наилучшее цветовое расстояние, И.. самый научно точный из них: deltaE и от 2 RGB (!) значения с использованием OpenCV:
Для этого потребовалось 3 преобразования цветового пространства + некоторое преобразование кода из javascript (http://svn.int64.org/viewvc/int64/colors/colors.js ) в C++
И, наконец, код (кажется, работает прямо из коробки, надеюсь, никто не найдет там серьезной ошибки ... но после ряда тестов все кажется нормально)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/photo/photo.hpp>
#include <math.h>
using namespace cv;
using namespace std;
#define REF_X 95.047; // Observer= 2°, Illuminant= D65
#define REF_Y 100.000;
#define REF_Z 108.883;
void bgr2xyz( const Vec3b& BGR, Vec3d& XYZ );
void xyz2lab( const Vec3d& XYZ, Vec3d& Lab );
void lab2lch( const Vec3d& Lab, Vec3d& LCH );
double deltaE2000( const Vec3b& bgr1, const Vec3b& bgr2 );
double deltaE2000( const Vec3d& lch1, const Vec3d& lch2 );
void bgr2xyz( const Vec3b& BGR, Vec3d& XYZ )
{
double r = (double)BGR[2] / 255.0;
double g = (double)BGR[1] / 255.0;
double b = (double)BGR[0] / 255.0;
if( r > 0.04045 )
r = pow( ( r + 0.055 ) / 1.055, 2.4 );
else
r = r / 12.92;
if( g > 0.04045 )
g = pow( ( g + 0.055 ) / 1.055, 2.4 );
else
g = g / 12.92;
if( b > 0.04045 )
b = pow( ( b + 0.055 ) / 1.055, 2.4 );
else
b = b / 12.92;
r *= 100.0;
g *= 100.0;
b *= 100.0;
XYZ[0] = r * 0.4124 + g * 0.3576 + b * 0.1805;
XYZ[1] = r * 0.2126 + g * 0.7152 + b * 0.0722;
XYZ[2] = r * 0.0193 + g * 0.1192 + b * 0.9505;
}
void xyz2lab( const Vec3d& XYZ, Vec3d& Lab )
{
double x = XYZ[0] / REF_X;
double y = XYZ[1] / REF_X;
double z = XYZ[2] / REF_X;
if( x > 0.008856 )
x = pow( x , .3333333333 );
else
x = ( 7.787 * x ) + ( 16.0 / 116.0 );
if( y > 0.008856 )
y = pow( y , .3333333333 );
else
y = ( 7.787 * y ) + ( 16.0 / 116.0 );
if( z > 0.008856 )
z = pow( z , .3333333333 );
else
z = ( 7.787 * z ) + ( 16.0 / 116.0 );
Lab[0] = ( 116.0 * y ) - 16.0;
Lab[1] = 500.0 * ( x - y );
Lab[2] = 200.0 * ( y - z );
}
void lab2lch( const Vec3d& Lab, Vec3d& LCH )
{
LCH[0] = Lab[0];
LCH[1] = sqrt( ( Lab[1] * Lab[1] ) + ( Lab[2] * Lab[2] ) );
LCH[2] = atan2( Lab[2], Lab[1] );
}
double deltaE2000( const Vec3b& bgr1, const Vec3b& bgr2 )
{
Vec3d xyz1, xyz2, lab1, lab2, lch1, lch2;
bgr2xyz( bgr1, xyz1 );
bgr2xyz( bgr2, xyz2 );
xyz2lab( xyz1, lab1 );
xyz2lab( xyz2, lab2 );
lab2lch( lab1, lch1 );
lab2lch( lab2, lch2 );
return deltaE2000( lch1, lch2 );
}
double deltaE2000( const Vec3d& lch1, const Vec3d& lch2 )
{
double avg_L = ( lch1[0] + lch2[0] ) * 0.5;
double delta_L = lch2[0] - lch1[0];
double avg_C = ( lch1[1] + lch2[1] ) * 0.5;
double delta_C = lch1[1] - lch2[1];
double avg_H = ( lch1[2] + lch2[2] ) * 0.5;
if( fabs( lch1[2] - lch2[2] ) > CV_PI )
avg_H += CV_PI;
double delta_H = lch2[2] - lch1[2];
if( fabs( delta_H ) > CV_PI )
{
if( lch2[2] <= lch1[2] )
delta_H += CV_PI * 2.0;
else
delta_H -= CV_PI * 2.0;
}
delta_H = sqrt( lch1[1] * lch2[1] ) * sin( delta_H ) * 2.0;
double T = 1.0 -
0.17 * cos( avg_H - CV_PI / 6.0 ) +
0.24 * cos( avg_H * 2.0 ) +
0.32 * cos( avg_H * 3.0 + CV_PI / 30.0 ) -
0.20 * cos( avg_H * 4.0 - CV_PI * 7.0 / 20.0 );
double SL = avg_L - 50.0;
SL *= SL;
SL = SL * 0.015 / sqrt( SL + 20.0 ) + 1.0;
double SC = avg_C * 0.045 + 1.0;
double SH = avg_C * T * 0.015 + 1.0;
double delta_Theta = avg_H / 25.0 - CV_PI * 11.0 / 180.0;
delta_Theta = exp( delta_Theta * -delta_Theta ) * ( CV_PI / 6.0 );
double RT = pow( avg_C, 7.0 );
RT = sqrt( RT / ( RT + 6103515625.0 ) ) * sin( delta_Theta ) * -2.0; // 6103515625 = 25^7
delta_L /= SL;
delta_C /= SC;
delta_H /= SH;
return sqrt( delta_L * delta_L + delta_C * delta_C + delta_H * delta_H + RT * delta_C * delta_H );
}
Надеюсь, это кому-то поможет :)
HSL и HSV лучше подходят для восприятия цвета человеком. Согласно Википедии :
Иногда предпочтительнее при работе с художественными материалами, оцифрованными изображениями или другими media использовать цветовую модель HSV или HSL по сравнению с альтернативными моделями, такими как RGB или CMYK, из-за различий в способах, которыми модели имитируют то, как люди воспринимают цвет. RGB и CMYK являются аддитивными и субтрактивными моделями, соответственно, моделирующими способ, которым первичные цветные огни или пигменты (соответственно) объединяются, чтобы сформировать новые цвета при смешивании.
В статье Википедии о цветовых различиях перечислен ряд цветовых пространств и метрик расстояний, предназначенных для согласования с человеческим восприятием цветовых расстояний.
Может выглядеть как спам, но нет, эта ссылка действительно интересна для цветовых пространств :)
http://www.compuphase.com/cmetric.htm
Проще всего, конечно, было бы просто рассматривать цвета как векторы 3d, исходящие из одного и того же источника, и принимать расстояние между их конечными точками.
Если вам нужно учесть такие факторы, что зеленый цвет более заметен в оценке интенсивности, вы можете взвесить значения.
ImageMagic предусматривает следующие масштабы:
- красный: 0.3
- зеленый: 0.6
- синий: 0.1
Конечно, такие значения будут иметь смысл только по отношению к другим значениям для других цветов, а не как что-то, что будет иметь смысл для людей, поэтому все, для чего вы можете использовать эти значения, - это порядок подобия.
Ну, в качестве первого пункта вызова я бы сказал, что общие показатели HSV (оттенок, насыщенность и значение) или HSL лучше отражают то, как люди воспринимают цвет, чем, скажем, RGB или CYMK. Смотрите HSL, HSV в Википедии .
Я полагаю, что наивно я бы построил точки в пространстве HSL для двух цветов и рассчитал величину вектора разности. Однако это означало бы, что ярко-желтый и ярко-зеленый цвета будут считаться такими же разными, как зеленый и темно-зеленый. Но тогда многие считают красный и розовый двумя разными цветами.
Кроме того, разностные векторы в одном и том же направлении в этом пространстве параметров не равны. Например, человеческий глаз воспринимает зеленый цвет гораздо лучше, чем другие цвета. Сдвиг оттенка от зеленого на ту же величину, что и сдвиг от красного, может показаться более значительным. Кроме того, сдвиг насыщенности от небольшого количества до нуля-это разница между серым и розовым, в другом месте сдвиг был бы разницей между двумя оттенками красного.
С точки зрения программистов, вам нужно было бы построить разностные векторы, но модифицированные матрицей пропорциональности, которая бы соответствующим образом регулировала длины в различных областях пространства HSL - это было бы довольно произвольно и основывалось бы на различных идеях теории цвета, но было бы изменено довольно произвольно в зависимости от того, к чему вы хотите применить это.
Еще лучше, вы можете увидеть, если кто-то уже сделал такую вещь в интернете...
Как человек, страдающий дальтонизмом, я считаю, что хорошо попытаться добавить больше разделения, чем нормальное зрение. Наиболее распространенной формой дальтонизма является дефицит красного / зеленого цвета. Это не означает, что вы не можете видеть красный или зеленый цвет, это означает, что вам труднее видеть и труднее видеть различия. Таким образом, требуется большее разделение, прежде чем дальтоник сможет определить разницу.