Модуль 2 — Сверточные фильтры и обнаружение границ

Глава 1. Преобразование Фурье

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

Цели обучения:

  1. Что такое преобразование Фурье?
  2. Как использовать преобразование Фурье с библиотекой numpy?
  3. Применение преобразования Фурье к изображениям.

Предварительные условия: предыдущие руководства

Что такое преобразование Фурье?

Чтобы понять это, давайте идти шаг за шагом.

  1. Изображение, которое мы регулярно используем, считается находящимся в пространственной области.
  2. Чтобы понять изменения цвета в изображении, нам нужно понять изменения частоты, которые происходят на границе изменения цвета.
  3. Преобразование Фурье — важный инструмент обработки изображений, который при применении к исходному изображению разлагает его на составляющие синуса и косинуса.

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

Преобразование Фурье с помощью numpy

Сначала мы увидим, как найти преобразование Фурье с помощью Numpy. У Numpy есть пакет FFT для этого. np.fft.fft2() предоставляет нам частотное преобразование, которое будет сложным массивом. Его первым аргументом является входное изображение в градациях серого. Второй аргумент является необязательным и определяет размер выходного массива. Если он больше, чем размер входного изображения, входное изображение дополняется нулями перед вычислением БПФ. Если оно меньше входного изображения, входное изображение будет обрезано. Если аргументы не переданы, размер выходного массива будет таким же, как и входной.

Теперь, когда вы получили результат, компонент нулевой частоты (компонент постоянного тока) будет в верхнем левом углу. Если вы хотите привести его к центру, вам нужно сместить результат на N/2 в обе стороны. Это просто делается функцией np.fft.fftshift(). (Легче анализировать). Как только вы нашли преобразование частоты, вы можете найти спектр амплитуды.

  1. Импорт
import matplotlib.pyplot as plt
import numpy as np
import cv2
%matplotlib inline

2. Загрузите изображение в цветовом пространстве RGB и GRAY. Для этой статьи я выбрал два изображения разных типов.

а. Один с полосками

б. Изображение со сплошным фоном

так что мы можем видеть изменения частоты должным образом.

stripes_image = cv2.imread('image 1')
stripes_image = cv2.cvtColor(stripes_image,cv2.COLOR_BGR2RGB)

solid_image = cv2.imread('image 2')
solid_image = cv2.cvtColor(solid_image,cv2.COLOR_BGR2RGB)

f,(ax1,ax2) = plt.subplots(1,2,figsize=(10,5))
ax1.imshow(stripes_image)
ax2.imshow(solid_image)
plt.show()

ПРИМЕЧАНИЕ. Область изображения с краями считается областью высоких частот, а для сплошного цвета — областью низких частот.

3. Преобразование в СЕРОЕ цветовое пространство и нормализация изображения.

# convert it to gray scale
gray_stripes = cv2.cvtColor(stripes_image, cv2.COLOR_RGB2GRAY)
gray_solid = cv2.cvtColor(solid_image, cv2.COLOR_RGB2GRAY)
# Normalize image from 0-255 to 0-1
norm_stripes = gray_stripes/255.0
norm_solid = gray_solid/255.0

4. Примените преобразование Фурье

# convert it to gray scale
gray_stripes = cv2.cvtColor(stripes_image, cv2.COLOR_RGB2GRAY)
gray_solid = cv2.cvtColor(solid_image, cv2.COLOR_RGB2GRAY)
# Normalize image from 0-255 to 0-1
norm_stripes = gray_stripes/255.0
norm_solid = gray_solid/255.0

Почему20*np.log(np.abs(fshift))?

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

20 * log(abs(f)) = 10 * log(abs(f)²)

Множитель 10 произвольный, но множитель 2 (2*10) эквивалентен возведению спектра в квадрат перед логарифмированием. Если вы хотите только визуализировать БПФ, этот фактор не имеет значения — важен только логарифм.

4. Примените преобразование Фурье и начертите изображения.

f_stripes = Fourier_transform(norm_stripes)
f_solid = Fourier_transform(norm_solid)

f,(ax1,ax2,ax3,ax4) = plt.subplots(1,4,figsize = (30,5))
ax1.imshow(stripes_image)
ax1.set_title('Original Stripes Image')
ax2.imshow(f_stripes)
ax2.set_title('Transformed Stripes Image')
ax3.imshow(solid_image)
ax3.set_title('Original Solid Image')
ax4.imshow(f_solid)
ax4.set_title('Transformed Solid Image')

Заключение:

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

ДОПОЛНИТЕЛЬНО: если вы хотите узнать, как преобразование Фурье выглядит на обычном изображении, дочитайте эту блокнотную тетрадь jupyter до конца.

Заворачивать

На этом мы выполнили наши учебные задачи для этого урока.

После этого вы знаете, что такое преобразование Фурье и как его использовать на уровне новичка. Чтобы понять это больше

См.: Материалы для чтения

  1. Документация OpenCV для преобразования Фурье
  2. Важность преобразования Фурье

Ссылка на GitHub.

Ссылки Каталог здесь

Предстоящие

Это все, что касается преобразования Фурье, в следующем блокноте мы узнаем, что такое фильтры и как их создавать.

Это для этой статьи. Увидимся на следующем

А пока подписывайтесь, чтобы узнать больше, и не забудьте связаться со мной в LinkedIn.❤❤❤