Как сопоставить похожие цвета в Java с помощью getRGB - PullRequest
6 голосов
/ 31 декабря 2011

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

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

Мой вопрос, скажем, у меня были BufferedImage Screenshot и BufferedImage smallImage, как бы я определил, если Screenshot.getRGB (1,1) и smallImage.getRGB (1,1) имеют похожих цветов?

Ответы [ 3 ]

4 голосов
/ 31 декабря 2011

Существует интересная статья, посвященная именно этой проблеме:

. М. Сарифуддин: Новое воспринимаемое однородное цветовое пространство со связанной мерой цветового сходства для поиска изображений и видео на основе контента *1005*.и Rokia Missaoui

Вы можете легко найти это с помощью Google или, в частности, Google Scholar.

Подводя итог, некоторые цветовые пространства (например, RGB, HSV, Lab) и меры расстояния (такие как среднее геометрическое и евклидово расстояние) являются лучшими представлениями человеческого восприятия цветового сходства, чем другие.В статье говорится о новом цветовом пространстве, которое лучше, чем остальные, но оно также обеспечивает хорошее сравнение общих существующих цветовых пространств и мер расстояния.Качественно *, кажется, лучшая мера для воспринимаемого расстояния с использованием общедоступных цветовых пространств: цветовое пространство HSV и цилиндрическая мера расстояния.

* По крайней мере, согласно рисунку 15 в ссылочной статье.

Цилиндрическая мера расстояния (в латексной записи):

D_ {cyl} = \ sqrt {\ Delta V ^ {2} + S_1 ^ {2} + S_2 ^ {2} -2S_1S_2cos (\ Delta H)}

Также обратите внимание, что есть несколько похожих вопросов, касающихся той же проблемы:

программный поиск похожих цветов

«Расстояние» между цветами в PHP

Наконец, в Java есть простой способ конвертировать из RGBзначения в другие цветовые пространства:

ColorSpace.fromRGB

1 голос
/ 31 декабря 2011

Для цветового сходства пусть DR=R1-R2, DG=G1-G2, DB=B1-B2, затем вычислите DR×DR+DG×DG+DB×DB и возьмите квадратный корень из этого, и сравните его с некоторым пороговым значением.Конечно, это можно оптимизировать, просто пропустив квадратно-корневую часть и просто возведя в квадрат порог.

Но вам может быть лучше, если вам удастся каким-то образом заставить OSX отобразить PNG, содержащий ваше изображение на экране,затем прочитайте эту часть экрана, а затем найдите точное совпадение с этим.

0 голосов
/ 31 декабря 2011

вы используете этот метод getRGB? Если да, я бы сравнил элементы массива 1–3 (RGB) друг с другом, вычтя их и проверив, находится ли абсолютное значение этого значения ниже заданного порогового значения (например, 10). Так что это будет что-то вроде

if(Math.abs(firstPixel[1]-secondPixel[1])<10) 
   redIsSimilar = true; 
else 
   redIsSimilar=false;

без оператора if:

redIsSimilar = Math.abs(firstPixel[1]-secondPixel[1]) < 10;

Конечно, вам нужно скопировать и вставить это для зеленого и синего цветов. Надеюсь это поможет, Christoph

...