Выпуклая оболочка, заполнение, утончение, очистка границ
В этой демонстрации показаны такие морфологические операции, как выпуклая оболочка, утончение изображения, заполнение отверстий и очистка границ.
using Images, Noise, ImageMorphology
using ImageBinarization
using ImageDraw
using TestImages
img_src = testimage("morphology_test_512")
Определение порогов изображения
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)
Выпуклая оболочка
Операция построения выпуклой оболочки определяет внешнюю охватывающую границу двоичного изображения и возвращает ее вершины в виде массива элементов типа CartesianIndex.
cordinates = convexhull(img_input)
img_convex = RGB.(copy(img_input))
push!(cordinates, cordinates[1])
draw!(img_convex, Path(cordinates), RGB(1))
img_convex
Заполнение изображения
Операция заполнения изображения находит связанные компоненты изображения с помощью 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])
Утончение изображения
Применяет двоичную операцию утончения пятен для скелетизации входного изображения. Алгоритм Го решает, какие пиксели оставить, а какие удалить, по трем правилам, приведенным в оригинальной работе.
img_thinning = thinning(img_input, algo = GuoAlgo());
Gray.([img_input img_thinning])
Очистка границ
С помощью метода очистки границ можно очистить объекты, связанные с границей изображения.
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])
Эта страница была создана с помощью DemoCards.jl и Literate.jl.