Для реализации ("умной") программы "компьютерное зрение", необходимо выделять области изображения по цветам, группируя их в один объект если цветовые переходы плавные. То есть нужно игнорировать тени и засвеченность. Обычно эту процедуру называют "сегментация изображения методом градиентного спуска". Без математических формул, чисто программным языком это выглядит достаточно просто:
Берём в первой точке
(например, верхний левый угол изображения x=0,y= 0) пробу цвета:
public static double currentColor;
----------------------------------
Color color = new Color(image.getRGB(X,Y));
double red = color.getRed();
double green = color.getGreen();
double blue = color.getBlue();
if (red!=0)
//считаем уровень отклонения от красного
red=(red+green+blue)/red;
if (green!=0)
//считаем уровень отклонения от зелёного
green=(red+green+blue)/green;
double alpha1 = (red+green)/2;
if(currentColor==0)
currentColor = alpha1;
Далее, производим выборку пикселей "скользящим окошком", проверяя отклонения цвета в точке x=1,y=0; от x=0, y=0; Процесс взятия пробы в первой и второй точке - одинаков. Если цвета отличаются не значительно, перезаписываем "currentColor":
if (currentColor-alpha2<0.06 && currentColor-alpha2>-0.06) {
//перезаписываем значение текущего цвета и возвращаем true - цвет одинаков.
currentColor = alpha2;
return true;
}
Казалось бы, что всё правильно. Но почему-то алгоритм работает неправильно... Или же я что-то не учёл? Вот два результата:
Первый с перезаписью "currentColor"
Второй - без перезаписи "currentColor":
Убирая
static currentColor
получаются разные результаты...