найти похожие цвета программно - PullRequest
13 голосов
/ 13 ноября 2009

У меня есть буферизованное изображение в java, и я хочу записать, насколько каждый пиксель похож на другой в зависимости от значения цвета. поэтому пиксели с «похожими» цветами будут иметь более высокое значение сходства. например, красный и розовый будут иметь значение сходства 1000, а красный и синий будут иметь что-то вроде 300 или меньше.

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

Ответы [ 12 ]

0 голосов
/ 03 февраля 2011

Я попробовал это. значение HSL / HSV определенно не полезно. например:

  • все цвета с L = 0 являются «черными» (RGB 000000), хотя их разность HSL может указывать на большое цветовое расстояние.

  • все цвета с S = 0 имеют оттенок «серого», хотя их различие HSL может указывать на большое цветовое расстояние.

  • диапазон H (оттенок) начинается и заканчивается оттенком красного, поэтому H = 0 и H = [max] (360 °, 100% или 240, в зависимости от применения) имеют красный цвет и относительно похожи друг на друга, но расстояние евклидова HSL близко к максимуму.

поэтому я рекомендую использовать евклидово расстояние RGB (r2-r1) ² + (g2-g1) ² + (b2-b1) ² без корня. (субъективный) порог в 1000 тогда отлично работает для похожих цветов. цвета с разницей> 1000 хорошо различимы человеческим глазом. Кроме того, может быть полезно взвешивать компоненты по-разному (см. предыдущий пост).

0 голосов
/ 13 ноября 2009

Этот вопрос похож на # 1634206 .

Если вы ищете расстояние в RGB-пространстве, евклидово расстояние будет работать, при условии, что вы рассматриваете значения красного, зеленого и синего одинаково.

Если вы хотите взвешивать их по-разному, как это обычно делается при преобразовании цвета / RGB в оттенки серого, вам необходимо взвешивать каждый компонент по-разному. Например, используя популярное преобразование из RGB в оттенки серого: 30% красный + 59% зеленый + 11% синий:

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;

Чем меньше значение d2, тем ближе цвета (r1,g1,b1) и (r2,g2,b2) друг к другу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...