@My1Name

Как правильно написать алгоритм градиентного спуска?

Для реализации ("умной") программы "компьютерное зрение", необходимо выделять области изображения по цветам, группируя их в один объект если цветовые переходы плавные. То есть нужно игнорировать тени и засвеченность. Обычно эту процедуру называют "сегментация изображения методом градиентного спуска". Без математических формул, чисто программным языком это выглядит достаточно просто:

Берём в первой точке (например, верхний левый угол изображения 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"6395bb1342525219887536.gif Второй - без перезаписи "currentColor": 6395bb2aef53f328325750.gif Убирая static currentColor получаются разные результаты...
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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