[Искусственный интеллект печи] Машинное обучение 046-Метод обнаружения края изображения

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

[Искусственный интеллект печи] Машинное обучение 046-Метод обнаружения края изображения

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

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

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

Общие операторы обнаружения границ: Робертс, Собель, Превитт, Лапласиан, Лог/Марр, Канни, Кирш, Невития.


1. Оператор Собеля

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

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

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

import cv2
image=cv2.imread('E:\PyProjects\DataSet\FireAI/chair.jpg')
# Sobel 算子进行图像边缘检测
sobel_h=cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3)
sobel_v=cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
plt.figure(13,figsize=(15,30))

plt.subplot(131)
plt.imshow(image,cmap='gray') # 彩色图像显示异常,plt采用RGB模式,而cv2采用BGR模式
plt.title('raw_img')

plt.subplot(132)
plt.imshow(sobel_h,cmap='gray')
plt.title('sobel_h')

plt.subplot(133)
plt.imshow(sobel_v,cmap='gray')
plt.title('sobel_v')

Может быть только параметр ksize, где необходимо оптимизировать оператор Собеля. ksize может соответствовать только четырем числам 1, 3, 5 и 7.


2. Оператор Лапласа

Оператор Лапласа — это дифференциальный оператор второго порядка в N-мерном евклидовом пространстве, определяемый как дивергенция div градиента grad. Расчет и принцип действия этого оператора здесь не объясняются, объясняются только его использование и эффекты.

# Laplacian算子进行图像边缘检测
lap=cv2.Laplacian(image, cv2.CV_64F)
plt.figure(12,figsize=(10,30))

plt.subplot(121)
plt.imshow(image,cmap='gray') # 彩色图像显示异常,plt采用RGB模式,而cv2采用BGR模式
plt.title('raw_img')

plt.subplot(122)
plt.imshow(lap,cmap='gray')
plt.title('Laplacian')


3. Хитрый оператор

Цель Кэнни — найти оптимальный алгоритм обнаружения краев.Наиболее важным значением определения краев является:

1. Хорошее обнаружение: алгоритм может идентифицировать как можно больше фактических краев изображения.

2. Хорошая локализация: идентифицированный край должен быть как можно ближе к фактическому краю на реальном изображении.

3. Минимальный отклик: край на изображении может быть идентифицирован только один раз, и возможный шум изображения не должен быть идентифицирован как край.

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

Шаги алгоритма Кэнни можно разделить на: уменьшение шума, поиск градиентов и отслеживание краев. Шумоподавление заключается в свертывании исходного изображения с шаблоном сглаживания по Гауссу, а результирующее изображение слегка размыто по сравнению с исходным изображением.Цель этого состоит в том, что после сглаживания по Гауссу шум отдельных пикселей становится практически незначительным.

Поиск градиентов: оператор Canny использует 4 маски для обнаружения горизонтальных, вертикальных и диагональных краев, и свертка исходного изображения с каждой маской сохраняется. Для каждой точки мы определяем максимальное значение в этой точке и результирующее направление края. Таким образом, мы создаем карту градиента яркости для каждой точки изображения и направление градиента яркости исходного изображения.

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

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

# Canny算子
canny = cv2.Canny(image, 50, 240)
plt.figure(12,figsize=(10,30))

plt.subplot(121)
plt.imshow(image,cmap='gray') # 彩色图像显示异常,plt采用RGB模式,而cv2采用BGR模式
plt.title('raw_img')

plt.subplot(122)
plt.imshow(canny,cmap='gray')
plt.title('Canny')

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

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

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

1. Описанные здесь три оператора обнаружения краев относительно просты в использовании, но понять их внутренний смысл сложнее.

2. С точки зрения эффекта лично я предпочитаю оператор Кэнни, т.к. по картинке видно, что у него наименьший шум и лучший краевой эффект.

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


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

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

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