Как зайти в Даркнет?!
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
Последующие действия: "Sorting" цветов по различительности
Если вам дано N максимально удаленных цветов (и некоторая связанная метрика расстояния), можете ли вы придумать способ сортировки этих цветов в некотором порядке, чтобы первые M также были разумно близки к максимально отличному набору?
Другими словами, учитывая кучу различных цветов, придумайте порядок, чтобы я мог использовать столько цветов, сколько мне нужно, начиная с самого начала, и быть разумно уверенным, что все они различны и что соседние цвета также очень различны (например, синевато-красный не рядом с красновато-синим).
Рандомизация-это OK, но, конечно, не оптимально.
Уточнение: учитывая некоторый большой и визуально различимый набор цветов (скажем, 256 или 1024), я хочу отсортировать их так, чтобы при использовании первого, скажем, 16 из них я получал относительно визуально различимое подмножество цветов. Это эквивалентно, грубо говоря, тому, что я хочу отсортировать этот список 1024 так, чтобы чем ближе отдельные цвета визуально, тем дальше они находятся в списке.
Это также звучит для меня как своего рода график сопротивления , где вы пытаетесь наметить путь наименьшего сопротивления. Если вы инвертируете требования, путь максимального сопротивления, он, возможно, может быть использован для получения набора, который с самого начала производит максимальную разницу, а ближе к концу начинает возвращаться к значениям, более близким к другим.
Например, вот один из способов, возможно, сделать то, что вы хотите.
- Вычислите расстояние (ref ваш другой пост ) от каждого цвета до всех других цветов
- Суммируйте расстояния для каждого цвета, это даст вам представление о том, как далеко этот цвет находится от всех других цветов в целом
- Упорядочивайте список по расстоянию, спускаясь вниз
Это, по-видимому, приведет к созданию списка, который начинается с цвета, наиболее далекого от всех других цветов, а затем идет вниз, цвета к концу списка будут ближе к другим цветам в целом.
Edit: чтение вашего ответа на мой первый пост, о пространственном подразделении, не совсем соответствует описанию выше, так как цвета, близкие к другим цветам, попадут в нижнюю часть списка, но предположим, что у вас где-то есть кластер цветов, по крайней мере один из цветов из этого кластера будет расположен в начале списка, и это будет тот, который обычно находится дальше всего от всех других цветов в целом. Если это имеет смысл.
Эта проблема называется цветовым квантованием и имеет много хорошо известных алгоритмов: http://en.wikipedia.org/wiki/Color_quantization я знаю людей, которые реализовали подход octree для хорошего эффекта.
Кажется, восприятие важно для вас, в этом случае вы можете рассмотреть возможность работы с перцептивным цветовым пространством, таким как YUV, YCbCr или Lab. Каждый раз, когда я использовал их, они давали мне гораздо лучшие результаты, чем только sRGB.
Преобразование в sRGB и из sRGB может быть болезненным, но в вашем случае это действительно может сделать алгоритм проще, и в качестве бонуса он будет работать в основном для цветных блайндов тоже!
N максимально удаленных цветов можно считать набором хорошо распределенных точек в трехмерном (цветовом) пространстве. Если вы можете генерировать их из последовательности Холтона, то любой префикс (первые M цветов) также состоит из хорошо распределенных точек.
Вы можете просто отсортировать цвета-кандидаты на основе максимального расстояния от минимального расстояния до любого из индексных цветов.
Используя цвет Евклидово расстояние:
public double colordistance(Color color0, Color color1) {
int c0 = color0.getRGB();
int c1 = color1.getRGB();
return distance(((c0>>16)&0xFF), ((c0>>8)&0xFF), (c0&0xFF), ((c1>>16)&0xFF), ((c1>>8)&0xFF), (c1&0xFF));
}
public double distance(int r1, int g1, int b1, int r2, int g2, int b2) {
int dr = (r1 - r2);
int dg = (g1 - g2);
int db = (b1 - b2);
return Math.sqrt(dr * dr + dg * dg + db * db);
}
Хотя вы можете заменить его на все, что захотите. Ему просто нужна процедура цветового расстояния.
public void colordistancesort(Color[] candidateColors, Color[] indexColors) {
double current;
double distance[] = new double[candidateColors.length];
for (int j = 0; j < candidateColors.length; j++) {
distance[j] = -1;
for (int k = 0; k < indexColors.length; k++) {
current = colordistance(indexColors[k], candidateColors[j]);
if ((distance[j] == -1) || (current < distance[j])) {
distance[j] = current;
}
}
}
//just sorts.
for (int j = 0; j < candidateColors.length; j++) {
for (int k = j + 1; k < candidateColors.length; k++) {
if (distance[j] > distance[k]) {
double d = distance[k];
distance[k] = distance[j];
distance[j] = d;
Color m = candidateColors[k];
candidateColors[k] = candidateColors[j];
candidateColors[j] = m;
}
}
}
}
- Начните с двух списков. CandidateColors, который изначально содержит ваши различные цвета и SortedColors, который изначально пуст.
- Выберите любой цвет, удалите его из CandidateColors и поместите в SortedColors. Это первый цвет и будет наиболее распространенным, поэтому это хорошее место, чтобы выбрать цвет, который хорошо сочетается с вашим приложением.
- Для каждого цвета в CandidateColors вычислите его общее расстояние. Общее расстояние - это сумма расстояний от CandidateColor до каждого из цветов в SortedColors.
- Удалите цвет с наибольшим общим расстоянием от CandidateColors и добавьте его в конец SortedColors.
- Если CandidateColors не пусто, вернитесь к шагу 3.
Этот жадный алгоритм должен дать вам хорошие результаты.
Если я правильно понимаю вопрос, вы хотите получить подмножество M цветов с наибольшим средним расстоянием между цветами, учитывая некоторую функцию расстояния d .
Другими словами, рассматривая начальный набор из N цветов как большой неориентированный граф, в котором все цвета связаны, вы хотите найти самый длинный путь , который посещает любые M узлов.
Боюсь, что решение NP-полных графовых задач мне не по силам, но вы можете попробовать запустить простую физическую симуляцию:
- Генерация M случайных точек в цветовом пространстве
- Вычислите расстояние между каждой точкой
- Вычислите векторы отталкивания для каждой точки, которая будет отдалять ее от всех других точек (используя 1 / (расстояние ^ 2) в качестве величины вектора)
- Суммируйте векторы отталкивания для каждой точки
- Обновите положение каждой точки в соответствии с суммированными векторами отталкивания
- Ограничьте любые из связанных координат (например, светимость становится отрицательной или выше единицы)
- Повторите с шага 2, пока точки не стабилизируются
- Для каждой точки выберите ближайший цвет из исходного набора N
Это далеко не эффективно, но для малых м это может быть достаточно эффективно, и это даст почти оптимальные результаты.
Если ваша функция цветового расстояния проста, возможно, существует более детерминированный способ генерации оптимального подмножества.
Вы хотите сказать, что из множества N цветов вам нужно выбрать M цветов, где M < N, таких, что M является лучшим представлением N цветов в пространстве M?
В качестве лучшего примера уменьшите истинный цвет (24-битное цветовое пространство) до 8-битного отображенного цветового пространства (GIF?).
Для этого существуют алгоритмы квантования, такие как алгоритм адаптивного пространственного разделения , используемый ImageMagic.
Эти алгоритмы обычно не просто выбирают существующие цвета из исходного пространства, но создают новые цвета в целевом пространстве, которые наиболее близко напоминают исходные цвета. В качестве упрощенного примера, если у вас есть 3 цвета в исходном изображении, где два являются красными (с разной интенсивностью или голубоватыми оттенками и т. д.) и третий-синий, и нужно уменьшить до двух цветов, целевое изображение может иметь красный цвет, который является своего рода средним из исходных двух красных + синий цвет от исходного изображения.
Если вам нужно что-то еще, то я не понял вашего вопроса :)
Вы можете разделить их в формате RGB HEX, чтобы можно было сравнить R с R другого цвета, то же самое с G и B.
Тот же формат, что и HTML
XX XX XX
RR GG BB
00 00 00 = black
ff ff ff = white
ff 00 00 = red
00 ff 00 = green
00 00 ff = blue
Поэтому единственное, что вам нужно будет решить, - это насколько близко вы хотите, чтобы цвета и какая допустимая разница для сегментов считались разными.