Выделение трещины на изображении

Автор
avatar-ussmoussmo
Notebook

Выделение трещины на изображении

В данном примере мы рассматриваем процесс предобработки изображений с целью последующего анализа и выделения ключевых объектов на изображении с трещиной. Цель — выделить трещину. Исходное изображение содержит сложные текстуры и объекты, которые необходимо упростить для более эффективного анализа. Мы применяем несколько ключевых шагов: преобразование изображения в оттенки серого, адаптивная бинаризация для выделения объектов, морфологические операции для сглаживания и удаления шумов, и, наконец, скелетизация для получения скелетной структуры объектов.

Подключаем необходимые пакеты для работы с изображениями

In [ ]:
import Pkg; Pkg.add("ImageMorphology");
import Pkg; Pkg.add("ImageBinarization");
import Pkg; Pkg.add("ImageFiltering");
In [ ]:
using Images                    # Библиотека для работы с изображениями
using ImageMorphology           # Морфология изображения
using ImageBinarization         # Бинаризация изображения
using ImageFiltering            # Фильтрация изображения
using Plots                     # Библиотека для работы с графиками

Загрузка изображения

Указываем путь к изображению, загружаем и отображаем его:

In [ ]:
path_to_img = "$(@__DIR__)/crack.jpg"   
Image = load(path_to_img)
Out[0]:
No description has been provided for this image

Преобразование изображения в оттенки серого

Функция Gray преобразует цветные пиксели в оттенки серого. Для каждого пикселя вычисляется эквивалентное значение в градациях серого. В результате каждый пиксель имеет одно значение яркости вместо трёх (красный, зелёный, синий).

In [ ]:
gray_image = Gray.(Image)
Out[0]:
No description has been provided for this image

Бинаризация изображения

Процесс бинаризации — это перевод изображения в двухцветное (черно-белое) с помощью порогового значения t, с которым сравнивается яркость каждого пикселя. В данном коде используется адаптивная бинаризация, где порог вычисляется локально для каждой области изображения. Размер этой области задан параметром window_size = 128, что означает, что каждая область размером 128x128 пикселей будет иметь свой локальный порог. Значение порога уменьшается на 30% от среднего значения интенсивности пикселей.

In [ ]:
binary_method = AdaptiveThreshold(window_size = 128, percentage=30)         
bw = binarize(gray_image, binary_method)
Out[0]:
No description has been provided for this image

Инверсия бинарного изображения

Инвертируем бинарное изображение, меняя черные и белые пиксели местами.

In [ ]:
BW_negative = .~bw
Out[0]:
No description has been provided for this image

Удаление мелких объектов ("блобов")

Блобы — это связные области на бинарном изображении, представляющие собой объекты или группы пикселей с одинаковыми значениями (обычно 1 — белые пиксели на фоне из 0 — черных пикселей).

Операция area_opening удаляет блобы (связные области) площадью меньше заданного значения. В данном случае удаляем объекты площадью меньше 1000 пикселей.

In [ ]:
filtered_image = area_opening(BW_negative; min_area=1000)
Out[0]:
No description has been provided for this image

Создание структурирующего элемента для морфологии

Создаем структурный элемент в форме ромба размером 19x19 пикселей с радиусом 14 для морфологических операций.

In [ ]:
kernel = strel_diamond((19, 19), r=14)
Out[0]:
19×19 ImageMorphology.StructuringElements.SEDiamondArray{2, 2, UnitRange{Int64}, 0} with indices -9:9×-9:9:
 0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  0  0  0  0
 0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  0  0  0
 0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0  0
 0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0
 0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0  0
 0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  0  0  0
 0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  0  0  0  0

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

In [ ]:
display(colorview(Gray, float.(kernel)))
No description has been provided for this image

Применение морфологического закрытия

Применяется операция морфологического закрытия для заполнения мелких пробелов и сглаживания контуров объектов. Закрытие — последовательное применение дилатации и эрозии, которое объединяет близко расположенные объекты и заполняет пустоты.

In [ ]:
BWclose = closing(filtered_image, kernel)
Out[0]:
No description has been provided for this image

Снова удаляем лишние объекты

Удаляем более крупные объекты площадью меньше 5000 пикселей.

In [ ]:
filtered_image = area_opening(BWclose; min_area=5000)
Out[0]:
No description has been provided for this image

Конвертация изображения в битовую матрицу

Изображение преобразуется в битовую матрицу для применения алгоритмов.

In [ ]:
bit_image = convert(BitMatrix, filtered_image);

Скелетизация (алгоритм Го-Холла)

Алгоритм Го-Холла используется для скелетизации бинарных изображений. Скелетизация преобразует объекты на изображении в линии шириной в один пиксель, представляющие основные структуры объектов.

In [ ]:
img_thinning = thinning(bit_image, algo = GuoAlgo());

Сравнение изображений

Отображаем исходное и обработанное изображения:

In [ ]:
Gray.([Image img_thinning])
Out[0]:
No description has been provided for this image

Выводы

В данном примере была проведена обработка изображения для локализации трещины, а также выделение контура линии шириной в один пиксель. Были разобраны такие операции как бинаризация, морфологическое закрытие, удаление маленьких блобов, скелетизация. В результет получили качественное отображение контуров трещин.