[Stove AI] Машинное обучение 048-Harris обнаруживает углы изображения

машинное обучение искусственный интеллект Python алгоритм

[Stove AI] Машинное обучение 048-Harris обнаруживает углы изображения

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)

Существует примерно три типа алгоритмов обнаружения углов: обнаружение углов на основе изображений в градациях серого, обнаружение углов на основе бинарных изображений и обнаружение углов на основе контурных кривых. Обнаружение углов на основе изображений в градациях серого можно разделить на три категории: методы комбинирования градиентов на основе градиента, на основе шаблона и на основе шаблона. яркости изображения, которая будет относиться к соседней точке А с достаточно большой яркостной контрастностью точки, определяется как угловая точка. Общие алгоритмы обнаружения углов на основе шаблонов включают алгоритм обнаружения углов Китчена-Розенфельда, алгоритм обнаружения углов Харриса, алгоритм обнаружения углов KLT и алгоритм обнаружения углов SUSAN.


1. Угловой детектор Харриса

Обнаружение угла Харриса в основном проходит следующие этапы:

1. Примените фильтрацию Гаусса к изображению.

2. Для каждого пикселя оцените значение градиента в вертикальном направлении и выполните две одномерные свертки с ядром, аппроксимирующим производную.

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

4. Выберите порог функции отклика, чтобы выбрать лучший угол-кандидат и выполнить немаксимальное подавление.

Чтобы узнать о конкретном алгоритме детектора углов Харриса, вы можете обратиться к этому сообщению в блоге:Угловой детектор Харриса

Давайте рассмотрим пошаговый процесс использования Harris для обнаружения углов на изображении.

# Harris 角点检测器
img_gray = np.float32(gray) # Harris角点检测器需要float型数据
img_harris = cv2.cornerHarris(img_gray, 7, 5, 0.04) # 使用角点检测
plt.imshow(img_harris,cmap='gray') 

В приведенном выше примере используется функция cv2.cornerHarris() для обнаружения углов на изображении, но, как видно из рисунка, также обнаруживается много краевых линий, поэтому нам нужно найти способ удалить эти краевые линии и сохранить углы. .

# 为了图像更加平滑,使用膨胀来将图像边缘减小,使得角点更突出
img_harris = cv2.dilate(img_harris, None)
plt.imshow(img_harris,cmap='gray')

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

Но нам нужно определить метод определения угла.Здесь мы определяем значение пикселя как более 1% от максимального значения угла.Это видно из кода:

# 确定角点的方法:此处我们定义角点为:其像素值为最大值的1%以上为角点,如下:
is_corner=img_harris > 0.01 * img_harris.max()
plt.imshow(is_corner,cmap='gray') # 将角点绘制出来看一下

Приведенное выше бинарное изображение может четко определить, какие углы, так как насчет того, чтобы нарисовать эти углы в исходном изображении?

img[is_corner]=[0, 0, 255] # 用红色标注这些角点
img2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img2)

Из рисунка видно, что определение угла относительно точное.

########################резюме########################## ######

1. Сложность обнаружения угловых точек заключается в подборе параметров cv2.cornerHarris, что может занять несколько попыток, чтобы увидеть эффект.

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

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.