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

Обнаружение углов

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

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

using Images, TestImages
img = Gray.(testimage("house"))
vgxqzhy

Мы используем изображение дома со множеством краев и углов.

Обнаружить углы на изображении можно с помощью функции imcorner. Она возвращает массив логических значений, где значение true означает, что соответствующий пиксель может быть углом. Мы отметим эти пиксели красным цветом на копии изображения.

corners = imcorner(img)
img_copy = RGB.(img)
img_copy[corners] .= RGB(1.0, 0.0, 0.0)
img_copy
qajqllx

Как видите, несколько точек, которые лежат внутри объекта (дома), также были распознаны как углы. Чтобы исправить это, можно повысить пороговый процентиль.

corners = imcorner(img, Percentile(98.5))
img_copy2 = RGB.(img)
img_copy2[corners] .= RGB(1.0, 0.0, 0.0)
img_copy2
djyprgh

Теперь гораздо лучше. Подробные сведения о параметрах функции см. в документации по imcorner.

На внутреннем уровне функция imcorner использует один из трех алгоритмов для обнаружения углов: Харриса, Ши-Томаси или Китчена-Розенфельда. Требуемый алгоритм можно указать с помощью параметра method функции imcorner. Для каждого алгоритма также есть отдельный метод.

detection_methods = [harris, shi_tomasi, kitchen_rosenfeld]
img_copies = [RGB.(img) for i in 1:length(detection_methods)]
for i in 1:length(detection_methods)
    corners = imcorner(img, Percentile(98.5); method=detection_methods[i])
    img_copies[i] = RGB.(img)
    img_copies[i][corners] .= RGB(1.0, 0.0, 0.0)
end
mosaicview(img_copies; nrow=1)
pejjdam

Эти алгоритмы используют градиент изображения для определения углов, поскольку в угловых точках интенсивность резко меняется, что приводит к появлению больших градиентов. Однако из-за этого они требуют больших вычислительных затрат.

Детектор углов FAST (Features from Accelerated Segment Test, признаки в результате ускоренного теста сегмента) — это алгоритм обнаружения признаков, который разработан так, чтобы требовать меньше вычислений, поэтому работает он намного быстрее. Он классифицирует пиксель как угол, если по крайней мере смежных точек из 16 точек в круге вокруг него имеют интенсивность больше (или меньше) на определенное пороговое значение .

corners = fastcorners(img, 11, 0.1) # fastcorners(img, n, t), где n и t — необязательные аргументы
img_copy3 = RGB.(img)
img_copy3[corners] .= RGB(1.0, 0.0, 0.0)
img_copy3
pylxuoe

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