Сортировка списка раскрашивает один размер?

Я хотел бы отсортировать одномерный список цветов так, чтобы цвета, которые типичный человек будет чувствовать как друг как друг, были друг около друга.

Очевидно, это - трудное или возможно невозможная проблема для получения "отлично", так как цвета обычно описываются с тремя измерениями, но это не означает, что нет некоторых методов сортировки, которые выглядят, очевидно, более естественными, чем другие.

Например, сортировка по RGB не работает очень хорошо, поскольку это отсортирует в следующем порядке, например:

(1) R=254 G=0 B=0 (2) R=254 G=255 B=0 (3) R=255 G=0 B=0 (4) R=255 G=255 B=0

Таким образом, это чередует те красные цвета, желтый, красный, желтый цвет, при этом эти два "красных" будут по существу незначительно отличающиеся друг, чем друг и эти два желтых, также являющихся незначительно отличающимся друг от друга.

Но сортировка по HLS работает намного лучше, вообще говоря, и я думаю HSL еще лучше, чем это; с также, красные будут друг рядом с другом, и желтый будет друг рядом с другом.

Но HLS/HSL имеет некоторые проблемы, также; вещи, которые люди чувствовали бы как "черные", могли быть разделены далеко друг от друга друг от друга, как мог вещи, которые люди будут чувствовать как "белые".

Снова, я понимаю, что в значительной степени должен признать, что будут некоторые разделения как это; я просто задаюсь вопросом, нашел ли кто-либо лучший путь, чем HLS/HSL. И я знаю, что "лучше" несколько произвольно; я имею в виду "более естественный для типичного человека".

Например, неопределенная мысль я имел, но еще не попробовал, возможно, "L, самая важная вещь, если это очень высоко или очень низко", но иначе это наименее важно. Кто-либо попробовал это? Это работало хорошо? Что конкретно Вы решали "очень низко" и "очень высоко" предназначенный? И так далее. Или кто-либо нашел что-либо еще, что улучшило бы HSL?

Я должен также отметить, что знаю, что я могу определить заполняющую пространство кривую через куб цветов, и заказывать им одномерно, поскольку с ними встретились бы при перемещении вдоль той кривой. Это устранило бы воспринятые разрывы. Однако это не действительно, что я хочу; я хочу достойные полные крупномасштабные группировки больше, чем я хочу идеальные небольшие группировки.

Заранее спасибо за любую справку.

16
задан Ptah- Opener of the Mouth 10 June 2010 в 12:44
поделиться

5 ответов

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

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

Более простой альтернативой (которая не будет работать идеально) будет выбор двух цветов «конечной точки», предпочтительно на противоположных сторонах цветового круга. Так, например, вы можете выбрать красный в качестве одного цвета конечной точки и синий в качестве другого. Затем вы должны преобразовать каждую точку данных цвета в значение по шкале от 0 до 1, где цвет, который сильно красноватый, получит оценку около 0, а цвет, который сильно синеватый, получит оценку около 1. Оценка. 5 будет обозначать цвет, в котором либо нет красного или синего (он же зеленый), либо в нем равное количество красного и синего (он же фиолетовый). Этот подход не идеален, но это лучшее, что вы можете сделать с этой проблемой.

5
ответ дан 30 November 2019 в 22:09
поделиться

Есть два подхода. Самый простой подход состоит в том, чтобы преобразовать каждый цвет в одно значение, после чего список значений можно отсортировать. Комплексный подход будет зависеть от всех цветов, которые вам нужно отсортировать; возможно, это будет итеративное решение, которое многократно перетасовывает цвета, пытаясь минимизировать «энергию» всей последовательности.

Я предполагаю, что вам нужно что-то простое и быстрое, которое выглядело бы «достаточно красиво» (вместо того, чтобы пытаться выяснить «оптимальную» эстетическую цветовую сортировку), поэтому вам достаточно простого подхода.

Я бы сказал, что HSL - лучший выбор. Что-то вроде

sortValue = L * 5 + S * 2 + H

при условии, что H, S и L находятся в диапазоне [0, 1].

4
ответ дан 30 November 2019 в 22:09
поделиться

Существует несколько стандартных методов сведения нескольких измерений к одному с некоторым понятием «близости».

Я думаю, вам следует особенно обратить внимание на преобразование z-порядка .

Вы можете реализовать быструю версию этого, перемежая биты трех ваших цветовых компонентов и сортируя цвета на основе этого преобразованного значения.

Следующий код Java должен помочь вам приступить к работе:

    public static int zValue(int r, int g, int b) {
            return split(r) + (split(g)<<1) + (split(b)<<2);
    }

    public static int split(int a) {
            // split out the lowest 10 bits to lowest 30 bits
            a=(a|(a<<12))&00014000377;
            a=(a|(a<<8)) &00014170017;
            a=(a|(a<<4)) &00303030303;
            a=(a|(a<<2)) &01111111111;
            return a;
    }
4
ответ дан 30 November 2019 в 22:09
поделиться

Вот идея, которую я придумал после нескольких минут размышлений. Это может быть чушь, а может и вообще не работать, но я все равно выкладываюсь.

Определите функцию расстояния в пространстве цветов, d (x, y) (где входы x и y - это цвета, а выход - возможно число с плавающей запятой). Выбранная вами функция расстояния может не иметь большого значения.Это может быть сумма квадратов различий в компонентах R, G и B, скажем, или это может быть полином разницы в компонентах H, L и S (компоненты имеют разный вес в зависимости от того, насколько важными вы их считаете. находятся).

Затем вы вычисляете «расстояние» каждого цвета в вашем списке друг от друга, что фактически дает вам график. Затем вы вычисляете минимальное остовное дерево вашего графа. Затем вы определяете самый длинный путь (без возврата), который существует в вашем MST. Конечные точки этого пути будут конечными точками окончательного списка. Затем вы пытаетесь «сплющить» дерево в линию, перенося точки в «ветвях» с вашего пути на сам путь.

Хм. Это может не сработать, если ваш MST окажется в форме почти петли в цветовом пространстве. Но, возможно, у любого подхода возникнет такая проблема.

0
ответ дан 30 November 2019 в 22:09
поделиться
 A. R=254 G=0 B=0
 B. R=254 G=255 B=0
 C. R=255 G=0 B=0
 D. R=255 G=255 B=0

Вам нужно посмотреть на разницу между соседними цветами.

Разница между A и B равна 0 + 255 + 0 = 255. Разница между A и C равна 1 + 0 + 0 = 1.

Разница между A и B больше, чем между A и C, поэтому A ближе к C, поэтому поменяйте местами B и C.

 A. R=254 G=0 B=0 
 C. R=255 G=0 B=0
 B. R=254 G=255 B=0
 D. R=255 G=255 B=0

Разница между C и B равна 1 + 255 + 0 = 256. Разница между C и D равна 0 + 255 + 0 = 255.

Разница между C и B больше, чем между C и D, поэтому C ближе к D, поэтому поменяйте местами B и D.

A. R=254 G=0 B=0 
C. R=255 G=0 B=0
D. R=255 G=255 B=0
B. R=254 G=255 B=0

Рассматривайте это как сортировку пузырьков. Это не идеальный алгоритм, и, вероятно, есть лучшие способы, но это может быть толчком в правильном направлении.

Также...

Вам понадобится какой-нибудь забавный способ сравнения по предмету.

0
ответ дан 30 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: