Как последовательно нумеровать контуры во временном ряду изображения?

#python #opencv #time-series #measurement #rate

#питон #opencv #временные ряды #измерение #Оценить #python

Вопрос:

Я автоматизировал задачу измерения площади завода во времени для экстраполяции темпов роста, используя временные ряды изображений и следующие два метода: (1) Python ArcGIS и (2) Python OpenCV.

В первом методе ArcGIS позволяет мне создавать векторную сетку на изображении. Каждая ячейка сетки содержит одно растение, поэтому я нумерую каждую ячейку, начиная с верхнего левого угла до нижнего правого. После создания двоичного изображения, в котором пиксели растений == 1, а все остальное == 0, я применяю зональную статистику, чтобы найти область моего растения. Таким образом, номера объектов остаются неизменными, потому что я использую одну и ту же сетку для всех изображений во временных рядах, но это требует ручного вмешательства.

Метод ArcGIS для нумерации растений путем ручного создания векторной сетки.

Во втором методе я использую OpenCV для поиска растений по контурам. Нумерация каждого контура выполняется автоматически на основе его координат центроида и размеров ограничивающей рамки. В настоящее время они отсортированы «сверху вниз», но, очевидно, это не такая идеальная сортировка, как созданная вручную сетка. Кроме того, растение № 1 может не оставаться растением № 1 на втором или третьем изображении, потому что каждое растение растет и перемещается в течение эксперимента, а также появляются новые растения и изменяют общее количество контуров (изображения делаются каждый час в течение нескольких недель). Поэтому я не могу сравнить завод № 1 на первом изображении и завод № 1 на последующих изображениях, потому что они могут даже не быть одним и тем же заводом.

Как я могу последовательно нумеровать одно и то же растение на протяжении всего временного ряда, используя второй метод? Я рассматривал возможность привязки центроидов на последующих изображениях к координатам (x, y) на предыдущем изображении, которые были наиболее похожи (когда данные представлены в табличной форме), но это не позволило бы получить обновленное нумерованное контурное изображение.

Растения, пронумерованные по контурам.

Комментарии:

1. Пожалуйста, попробуйте повысить читаемость сообщения.

2. Пожалуйста, дайте мне знать, если это лучше.

3. Немного неясно, в чем вопрос, но, если я правильно понимаю, вы хотите отсортировать контуры сверху слева направо?

4. Нет, я уже могу (в основном) сортировать контуры. Проблема в том, что на последующих изображениях растение, помеченное как # 1 на контурном изображении, становится # 13 или # 8, в зависимости от новых размеров центроида и ограничивающей рамки. Поэтому я не могу со временем сравнить # 1 со следующим # 1, чтобы получить скорость роста, потому что на самом деле это разные растения. Мне нужен способ гарантировать, что завод, сначала помеченный # 1, останется с тем же номером на всех изображениях.

Ответ №1:

Решение этой проблемы заключалось в автоматическом определении окружности с помощью функции преобразования Хафа OpenCV (cv2.HoughCircles()), нахождении результирующих центроидов окружности Хафа и последующем наложении их на исходное изображение RGB для создания опорного ключа. Поскольку у меня вообще не было изображения без каких-либо растений, я адаптировал метод, чтобы он нашел правильное количество источников, но результат был бы лучше на изображении без растений.

Ссылочный ключ, созданный из кругов Хафа

Я преобразовал результирующие CSV-файлы для эталонного изображения кругов Хафа (столбцы: OID, X, Y) и контуров растений (столбцы: CID, X, Y, Area и т.д.) В GeoPandas GeoDataFrames и использовал cKDTree Scipy для их объединения с помощью алгоритма ближайшего соседа.

Особая благодарность за ответ JHuw вhttps://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe поскольку функция nearest_points от Shapely у меня не работала.