[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, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.