Анализ размеров зерен Python-ом с использованием водораздела
Список содержания
- Введение
- Анализ распределения размеров зерен
- Применение анализа распределения размеров зарен для сегментации клеток
- Импортирование изображения и библиотек
- Преобразование пикселей в микроны
- Бинаризация изображения
- Дополнительные морфологические операции
- Маркировка объектов изображения
- Измерение параметров объектов
- Создание отчета
Анализ распределения размеров зерен
В предыдущем уроке мы рассмотрели анализ распределения размеров зерен с использованием микроскопического изображения. Но этот метод не ограничивается только металлическими сплавами и горными пробками - он также может быть применен к сегментации клеток в биологии.
Введение
Привет ребята, это Трини и вы смотрите уроки по Python на моем канале Python с различных баз. В предыдущем уроке я рассказал о анализе распределения размеров зерен с использованием микроскопического изображения. Этот метод также может быть применен для сегментации клеток, если вы являетесь биологом. Давайте перейдем к коду и посмотрим на него.
Сначала мы импортируем изображение и все необходимые библиотеки. Затем мы преобразуем пиксели в микроны, чтобы иметь возможность измерять расстояния и площади в микронах, а не в пикселях.
Затем мы бинаризуем изображение, используя пороговый фильтр, чтобы выделить границы зерен. После этого мы проводим несколько морфологических операций для улучшения границ зерен и создания маски, разделяющей границы зерен и сами зерна.
Затем мы маркируем изображение с помощью функции regionprops
, которая выдает различные измерения обнаруженных объектов. Мы выбрали для отчета площадь, диаметр, ориентацию, основную и побочную оси, а также минимальную, максимальную и средние интенсивности. Затем мы открываем пустой файл CSV и заполняем первую строку заголовками столбцов.
Далее мы заполняем значениями ячейки в основном теле отчета, преобразуя значения с некоторыми коэффициентами конверсии, если это необходимо. Например, площадь умножается на коэффициент преобразования пикселей в микроны в квадрате. После завершения этого шага мы получаем отчет с данными о каждом обнаруженном зерне.
Однако есть одна проблема, которую мы заметили в результате анализа. Некоторые зерна, которые находятся рядом с границей изображения, показаны как одно большое зерно, так как программе недостаточно информации для их разделения. Чтобы решить эту проблему, мы вводим понятие водораздела. Введите-го разбора, разделения, сегментации.
Водораздел
Водораздел представляет собой метод сегментации, о котором вы могли слышать, если использовали программы обработки изображений, такие как ImageJ или MATLAB. Он позволяет разделять различные зерна, клетки или регионы, которые сложно сегментировать с помощью обычного фильтрации. Что же такое водораздел?
Слово "водораздел" в английском языке обозначает "область земли, сливающая воду в общее водохранилище". Это означает, что вода, падающая в данной области, стекает и сливается в однопроливную площадь, а затем соединяется с рекой или ручьем. Таким образом, наличие границы водораздела означает, что вода, падающая на другой стороне этой границы, будет течь в другом направлении. То же самое относится и к сегментации с помощью водораздела.
Для лучшего понимания водораздела давайте вернемся к нашему изображению. Представьте себе линию, обозначающую кромку горной гряды, как эти белые регионы здесь. Если вы бросите воду здесь, она стекает и течет в эту долину внизу. Горы являются преградами между долинами, поэтому вы можете отчетливо разделить отдельные зерна внутри этих цепочек гор. Как применить это в Python?
В библиотеке OpenCV существуют функции для водораздела, которые принимают на вход изображение и маркеры. Маркеры - это области, которые вы знаете наверняка: это центр зерна, границы зерна и недостоверные или двусмысленные области. Затем функция водораздела возвращает отдельные границы водораздела, где пиксели на границах помечаются значением -1.
Давайте реализуем это в нашем коде. Мы продолжим с вот этого момента, и сначала мы очистим весь код после него.
(Продолжение в следующем сообщении)