Выделение трещины на изображении
Выделение трещины на изображении¶
В данном примере мы рассматриваем процесс предобработки изображений с целью последующего анализа и выделения ключевых объектов на изображении с трещиной. Цель — выделить трещину. Исходное изображение содержит сложные текстуры и объекты, которые необходимо упростить для более эффективного анализа. Мы применяем несколько ключевых шагов: преобразование изображения в оттенки серого, адаптивная бинаризация для выделения объектов, морфологические операции для сглаживания и удаления шумов, и, наконец, скелетизация для получения скелетной структуры объектов.
Подключаем необходимые пакеты для работы с изображениями¶
import Pkg; Pkg.add("ImageMorphology");
import Pkg; Pkg.add("ImageBinarization");
import Pkg; Pkg.add("ImageFiltering");
using Images # Библиотека для работы с изображениями
using ImageMorphology # Морфология изображения
using ImageBinarization # Бинаризация изображения
using ImageFiltering # Фильтрация изображения
using Plots # Библиотека для работы с графиками
Загрузка изображения¶
Указываем путь к изображению, загружаем и отображаем его:
path_to_img = "$(@__DIR__)/crack.jpg"
Image = load(path_to_img)
Преобразование изображения в оттенки серого¶
Функция Gray
преобразует цветные пиксели в оттенки серого. Для каждого пикселя вычисляется эквивалентное значение в градациях серого. В результате каждый пиксель имеет одно значение яркости вместо трёх (красный, зелёный, синий).
gray_image = Gray.(Image)
Бинаризация изображения¶
Процесс бинаризации — это перевод изображения в двухцветное (черно-белое) с помощью порогового значения t
, с которым сравнивается яркость каждого пикселя. В данном коде используется адаптивная бинаризация, где порог вычисляется локально для каждой области изображения. Размер этой области задан параметром window_size = 128
, что означает, что каждая область размером 128x128 пикселей будет иметь свой локальный порог. Значение порога уменьшается на 30% от среднего значения интенсивности пикселей.
binary_method = AdaptiveThreshold(window_size = 128, percentage=30)
bw = binarize(gray_image, binary_method)
Инверсия бинарного изображения¶
Инвертируем бинарное изображение, меняя черные и белые пиксели местами.
BW_negative = .~bw
Удаление мелких объектов ("блобов")¶
Блобы — это связные области на бинарном изображении, представляющие собой объекты или группы пикселей с одинаковыми значениями (обычно 1 — белые пиксели на фоне из 0 — черных пикселей).
Операция area_opening
удаляет блобы (связные области) площадью меньше заданного значения. В данном случае удаляем объекты площадью меньше 1000 пикселей.
filtered_image = area_opening(BW_negative; min_area=1000)
Создание структурирующего элемента для морфологии¶
Создаем структурный элемент в форме ромба размером 19x19 пикселей с радиусом 14 для морфологических операций.
kernel = strel_diamond((19, 19), r=14)
Преобразуем структурирующий элемент в изображение в градациях серого и отображаем его:
display(colorview(Gray, float.(kernel)))
Применение морфологического закрытия¶
Применяется операция морфологического закрытия для заполнения мелких пробелов и сглаживания контуров объектов. Закрытие — последовательное применение дилатации и эрозии, которое объединяет близко расположенные объекты и заполняет пустоты.
BWclose = closing(filtered_image, kernel)
Снова удаляем лишние объекты¶
Удаляем более крупные объекты площадью меньше 5000 пикселей.
filtered_image = area_opening(BWclose; min_area=5000)
Конвертация изображения в битовую матрицу¶
Изображение преобразуется в битовую матрицу для применения алгоритмов.
bit_image = convert(BitMatrix, filtered_image);
Скелетизация (алгоритм Го-Холла)¶
Алгоритм Го-Холла используется для скелетизации бинарных изображений. Скелетизация преобразует объекты на изображении в линии шириной в один пиксель, представляющие основные структуры объектов.
img_thinning = thinning(bit_image, algo = GuoAlgo());
Сравнение изображений¶
Отображаем исходное и обработанное изображения:
Gray.([Image img_thinning])
Выводы¶
В данном примере была проведена обработка изображения для локализации трещины, а также выделение контура линии шириной в один пиксель. Были разобраны такие операции как бинаризация, морфологическое закрытие, удаление маленьких блобов, скелетизация. В результет получили качественное отображение контуров трещин.