Подтвердить что ты не робот

Как распознать деревья в изображении Карт Google с помощью обработки изображений?

Я пытаюсь найти приблизительно площадь, покрытую деревьями, с учетом изображения статической карты (левое изображение).

Метод, который, как я думал, включал в себя выполнение пиксельно-пиксельного анализа изображения, в котором сначала были обнаружены "зеленые" пиксели (с использованием цветовой схемы HSV для извлечения значения оттенка).

Я понял, что на некоторых снимках, сделанных на рассвете или в сумерках, деревья могут вообще не иметь зеленого цвета и могут появляться только темно-серые/черные. В то время как те, что были сделаны в течение полудня, выглядят ярко-зелеными. Поэтому я попытался использовать порог изображения и получил приличные результаты (правое изображение):

kqMtt.pngSfGPm.png

Но я все еще не удовлетворен как тени зданий, или темные объекты могут дать мне ложные срабатывания.

Я хотел бы использовать опыт некоторых разработчиков здесь, в Stack Overflow, и предложить, какой инструмент обработки изображений и подход дали бы мне наилучшие результаты в таком сценарии?

4b9b3361

Ответ 1

Проблема с -threshold Y% заключается в следующем: он преобразует все пиксели, которые достаточно темны в черном!

Если у вас есть другой темный цвет (темно-коричневый, темно-синий, темно-красный, темно-серый или черный), вы ошибочно идентифицируете его как "дерево".

Если я правильно вас понимаю, вы ищете только те пиксели, которые имеют какой-то зеленый или темно-зеленый цвет.

Поэтому я предлагаю сравнить свой собственный подход с некоторым вариантом следующей команды:

compare                              \
 -size 600x600                       \
 -fuzz 30%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'darkgreen'                     \
  output-1.png    

Вместо "darkgreen" вы можете использовать соответствующее значение цвета "# 006400", то же самое:

compare                              \
 -size 600x600                       \
 -fuzz 30%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#006400'                       \
  output-2.png    

Вышеупомянутая команда compare создает output-1.png из двух входных изображений со следующими характеристиками:

  • сравнение исходного изображения выполняется с динамически созданным (xc:) 600x600 пиксельным патчем однородного цвета "darkgreen";
  • вывод показывает исходное изображение в виде бледного фона;
  • вывод показывает красные пиксели, где соответствующие пиксели исходного изображения отличаются от значения цвета "темный" после учета "фактора фаз" 30% (где "0%" означает точное соответствие значения цвета );
  • на выходе отображаются белые/полупрозрачные пиксели, где соответствующие пиксели исходного изображения похожи на цвет "темный" (в пределах 30%).

Вот результат в бок о бок сравнение:

Side by side comparison of original image with resulting image. The original image serves as a pale background. Red pixels show up where the original image is NOT 'darkgreen' within 30% fuzz factor.

Конечно, вы можете играть с фактором fuzz, а также с точным определением цветового значения "darkgreen". Вот результат для -fuzz 25%:

Side by side comparison of original image with resulting image. The original image serves as a pale background. Red pixels show up where the original image is NOT 'darkgreen' within 25% fuzz factor.

Если вы хотите, чтобы сравнение показывало обратные цвета (отображаются красные пиксели, где исходное изображение имеет зеленоватые цвета, прозрачный/белый - там, где пиксели были не зелеными), используйте инвертированный цвет "darkgreen" в качестве сравнительного патча (это какой-то розовый, BTW) и другой фактор fuzz:

compare                              \
 -size 600x600                       \
 -fuzz 70%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#ff9bff'                     \
  output-3.png    

Теперь результат:

Side by side comparison of original image with resulting image. The original image serves as a pale background. Red pixels show up where the original image is not 'light-pink' (or IS 'darkgreen') within 25% fuzz factor.

Если вы хотите, чтобы на выходе НЕ отображалось исходное изображение в виде бледного фона, добавьте -compose src к вашим командам:

compare                              \
 -size 600x600                       \
 -fuzz 70%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#ff9bff'                       \
 -compose src                        \
  output-4.png    

Side by side comparison of original image with resulting image. The original image serves no longer as the pale background picture. Red pixels show up where the original image is not 'light-pink' (or IS 'darkgreen') within 25% fuzz factor. White pixels are the ones which were non-greenish in the original image.

Вы также можете изменить красный цвет, который выделяет пиксели "треугольник" в некоторый другой цвет. Использовать черный:

compare                              \
 -highlight-color black              \
 -size 600x600                       \
 -fuzz 60%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#ff9bff'                       \
 -compose src                        \
  output-5.png    

Теперь вы можете использовать результат последней команды как "маска". Наложите эту маску на исходное изображение и составьте их таким образом, чтобы в результате можно было отобразить только "только дерево" части изображения, забрав все остальные части.