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.
Я предлагаю вам начать читать здесь
Формулы цветового различия , если вы хотите сделать это правильно. Он объясняет формулы ΔE * ab
, ΔE * 94
, ΔE * 00
и ΔE * CMC
для расчета разницы цветов.
Этот вопрос похож на # 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, которые могут лучше подходить для вашей проблемы .
Я считаю, что значения HSL легче понять. HSL Color объясняет, как они работают, и предоставляет процедуры преобразования. Как и в случае с другим ответом, вам необходимо определить, что для вас значит подобное.
HSL - плохой ход. L * a * b - это цветовое пространство, предназначенное для представления того, как на самом деле воспринимается цвет, и основано на данных сотен экспериментов с участием людей с настоящими глазами, смотрящих на разные цвета и говорящих: «Я могу различить эти два цвета. Но не те два".
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;
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.
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.