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

Главы этой серии

  1. День 1: Знакомство с OpenCV
  2. День 2: Работа с изображениями
  3. День 3: Фильтрация и улучшение изображений
  4. День 4: Пороговое определение изображения и сегментация
  5. День 5: Фильтрация изображений и определение признаков

1. Размытие по Гауссу

Размытие по Гауссу — это широко используемый метод фильтрации изображений, который помогает уменьшить шум и сгладить изображение за счет применения ядра Гаусса.

Шаг 1: Импортируйте модуль OpenCV

Начните с импорта модуля cv2 в ваш скрипт.

import cv2

Шаг 2: Загрузите изображение

Загрузите изображение с помощью функции imread().

image = cv2.imread('path_to_your_image.jpg')

Шаг 3: Примените размытие по Гауссу

Чтобы применить размытие по Гауссу, мы используем функцию GaussianBlur() из OpenCV. Эта функция принимает изображение, размер ядра и стандартное отклонение в качестве входных данных.

ksize = (5, 5)
sigma = 0
blurred_image = cv2.GaussianBlur(image, ksize, sigma)

ksize относится к размеру ядра, используемому в размытии по Гауссу. Размер ядра определяет степень размытия или сглаживания, применяемого к изображению. Он указывается как кортеж (ksize_x, ksize_y), представляющий ширину и высоту ядра.

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

Важно выбрать подходящий размер ядра на основе вашего конкретного изображения и желаемого эффекта. Экспериментирование с различными размерами ядра может помочь вам найти оптимальный баланс между шумоподавлением и сохранением деталей.

sigma представляет стандартное отклонение распределения Гаусса, используемого для размытия. Во фрагменте кода для sigma установлено значение 0, что указывает на то, что стандартное отклонение вычисляется автоматически на основе размера ядра.

  • Большее значение sigma приводит к более широкому распределению Гаусса и более плавному эффекту размытия.
  • Меньшее значение sigma приводит к более узкому распределению, что приводит к более резкому, но менее интенсивному эффекту размытия.

Установив для sigma значение 0, OpenCV автоматически вычисляет стандартное отклонение на основе размера ядра, гарантируя неизменность эффекта размытия.

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

Шаг 4: Отобразите размытое изображение

Отобразите размытое изображение с помощью функции imshow().

cv2.imshow('Blurred Image', blurred_image)

Шаг 5. Дождитесь ввода данных пользователем и выполните очистку.

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

cv2.waitKey(0)
cv2.destroyAllWindows()

Вот полный код размытия по Гауссу:

import cv2

image = cv2.imread('path_to_your_image.jpg')
ksize = (5, 5)
sigma = 0
blurred_image = cv2.GaussianBlur(image, ksize, sigma)

cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. Обнаружение хитрых краев

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

Шаг 1: Импортируйте модуль OpenCV

Импортируйте модуль cv2 в свой скрипт.

import cv2

Шаг 2: Загрузите изображение в оттенках серого

Загрузите изображение с помощью функции imread() и преобразуйте его в оттенки серого.

image = cv2.imread('path_to_your_image.jpg', 0)

Шаг 3: Примените обнаружение края Canny

Чтобы применить обнаружение границ Canny, мы используем функцию Canny() из OpenCV. Эта функция принимает изображение, минимальное и максимальное пороговые значения и необязательный размер апертуры в качестве входных данных.

threshold1 = 100
threshold2 = 200
edges = cv2.Canny(image, threshold1, threshold2)

threshold1 и threshold2 — это минимальное и максимальное пороговые значения, используемые при обнаружении границ Canny. Эти пороги определяют диапазон интенсивности для классификации пикселей как краев.

  • Любой пиксель с градиентом интенсивности выше threshold2 считается пикселем с сильными краями.
  • Любой пиксель с градиентом интенсивности ниже threshold1 считается некраевым пикселем.
  • Пиксели с градиентом интенсивности между threshold1 и threshold2 считаются пикселями со слабыми краями, если только они не соединены с пикселями с сильными краями.

Алгоритм обнаружения краев Кэнни использует эти пороговые значения для определения силы и непрерывности краев в изображении. Регулируя пороговые значения, вы можете контролировать чувствительность и качество обнаруженных краев.

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

Во фрагменте кода threshold1 установлено значение 100, а threshold2 установлено значение 200 в качестве примера значений. Однако эти значения, возможно, потребуется отрегулировать в зависимости от конкретных требований вашего приложения к изображению и обнаружению краев.

Шаг 4: Отобразите края

Отобразите ребра, используя функцию imshow().

cv2.imshow('Edges', edges)

Шаг 5. Дождитесь ввода данных пользователем и выполните очистку.

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

cv2.waitKey(0)
cv2.destroyAllWindows()

Вот полный код для обнаружения границ Canny:

import cv2

image = cv2.imread('path_to_your_image.jpg', 0)
threshold1 = 100
threshold2 = 200
edges = cv2.Canny(image, threshold1, threshold2)

cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. Резюме

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

Если вы нашли этот курс полезным и хотели бы изучить больше бесплатных курсов, я приглашаю вас подписаться на мою учетную запись на Medium и связаться со мной в LinkedIn. Я регулярно делюсь ценным контентом на этих платформах.