нахождение схожих цветов программно

svn annotate

иначе вина SVN от TortoiseSVN.

13
задан Cœur 3 August 2017 в 09:01
поделиться

8 ответов

First, how are you getting the integer value?

Once you get the RGB values, you could try

((r2 - r1)2 + (g2 - g1)2 + (b2 - b1)2)1/2

This would give you the distance in 3D space from the two points, each designated by (r1,g1,b1) and (r2,g2,b2).

Or there are more sophisticated ways using the HSV value of the color.

21
ответ дан 1 December 2019 в 17:40
поделиться

Я предлагаю вам начать читать здесь

Формулы цветового различия , если вы хотите сделать это правильно. Он объясняет формулы ΔE * ab , ΔE * 94 , ΔE * 00 и ΔE * CMC для расчета разницы цветов.

9
ответ дан 1 December 2019 в 17:40
поделиться

Этот вопрос похож на # 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, которые могут лучше подходить для вашей проблемы .

0
ответ дан 1 December 2019 в 17:40
поделиться

Я считаю, что значения HSL легче понять. HSL Color объясняет, как они работают, и предоставляет процедуры преобразования. Как и в случае с другим ответом, вам необходимо определить, что для вас значит подобное.

1
ответ дан 1 December 2019 в 17:40
поделиться

HSL - плохой ход. L * a * b - это цветовое пространство, предназначенное для представления того, как на самом деле воспринимается цвет, и основано на данных сотен экспериментов с участием людей с настоящими глазами, смотрящих на разные цвета и говорящих: «Я могу различить эти два цвета. Но не те два".

8
ответ дан 1 December 2019 в 17:40
поделиться

You could get the separate bytes as follows:

int rgb = bufferedImage.getRGB(x, y); // Returns by default ARGB.
int alpha = (rgb >>> 24) & 0xFF;
int red = (rgb >>> 16) & 0xFF;
int green = (rgb >>> 8) & 0xFF;
int blue = (rgb >>> 0) & 0xFF;
2
ответ дан 1 December 2019 в 17:40
поделиться

The easiest is to convert both colours to HSV value and find the difference in H values. Minimal changes means the colours are similar. It's up to you to define a threshold though.

2
ответ дан 1 December 2019 в 17:40
поделиться

You're probably calling getRGB() on each pixel which is returning the color as 4 8 bits bytes, the high byte alpha, the next byte red, the next byte green, the next byte blue. You need to separate out the channels. Even then, color similarity in RGB space is not so great - you might get much better results using HSL or HSV space. See here for conversion code.

In other words:

int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;

I don't know the specific byte ordering in java buffered images, but I think that's right.

2
ответ дан 1 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

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