Документация Engee

Выпуклая оболочка, заполнение, утончение, очистка границ

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

using Images, Noise, ImageMorphology
using ImageBinarization
using ImageDraw
using TestImages

img_src = testimage("morphology_test_512")
wjriktn

Определение порогов изображения

img_input = binarize(Gray.(img_src), UnimodalRosin()) .> 0.5
512×512 BitMatrix:
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 ⋮              ⋮              ⋮        ⋱  ⋮              ⋮              ⋮
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0

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

Gray.(img_input)
afcwegg

Выпуклая оболочка

Операция построения выпуклой оболочки определяет внешнюю охватывающую границу двоичного изображения и возвращает ее вершины в виде массива элементов типа CartesianIndex.

cordinates = convexhull(img_input)
img_convex = RGB.(copy(img_input))
push!(cordinates, cordinates[1])
draw!(img_convex, Path(cordinates), RGB(1))
img_convex
cmolrar

Заполнение изображения

Операция заполнения изображения находит связанные компоненты изображения с помощью flood-fill algorithm и возвращает изображение с заполненными объектами, которые попадают в указанный диапазон.

Для заполнения объектов отверстия (заполняемые части) должны быть представлены в массиве значением true. Это означает цвет RGB(1)/черный.

imfill(img, interval, value, connectivity) требует массива boolean. interval — это кортеж (a,b), который определяет диапазон значений для заполнения; объекты, размер которых находится в этом диапазоне, будут заполнены значением false. connectivity принимает те же значения, что и в label_components (значение по умолчанию — 1:ndims(img)).

img_noise = salt_pepper(img_input, 0.5)
fill_image_1 = imfill(img_noise, (0.1, 1))
fill_image_2 = imfill(img_noise, (0.1, 10)) # эта конфигурация дает наилучшие результаты
fill_image_3 = imfill(img_noise, (1, 10))
fill_image_4 = imfill(img_noise, (5, 20)) # объекты меньших размеров исключаются
Gray.([img_noise fill_image_1 fill_image_2 fill_image_3 fill_image_4])
wxkvjkm

Утончение изображения

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

img_thinning = thinning(img_input, algo = GuoAlgo());
Gray.([img_input img_thinning])
hkmqrzc

Очистка границ

С помощью метода очистки границ можно очистить объекты, связанные с границей изображения.

clearborder(img, width, background) можно использовать применительно к входному двоичному изображению или изображению в оттенках серого с границей шириной width пикселей (Default is 1 pixel). background — это значение, присваиваемое очищенным пикселям (Default is 0, black color).

cleared_img_1 = clearborder(img_input, 20); # 20 — ширина исследуемой границы
cleared_img_2 = clearborder(img_input, 30); # обратите внимание: внутренний круг удаляется, даже если находится вне диапазона
cleared_img_3 = clearborder(img_input, 30, 1);

Цвет по умолчанию для удаления — 0, то есть удаляется RGB(0). Однако поскольку теперь он равен 1, очищается все изображение вследствие применения алгоритма заливки.

Gray.([img_input cleared_img_1 cleared_img_2 cleared_img_3])
otyebkq

Эта страница была создана с помощью DemoCards.jl и Literate.jl.