OpenCV (31) --- Принцип преобразования Фурье

OpenCV
OpenCV (31) --- Принцип преобразования Фурье

предисловие

Чтобы понять преобразование Фурье, нам сначала нужно понять обработку изображений. В процессе обработки изображений он обычно делится на обработку в пространственной области и обработку в частотной области.

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

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

преобразование Фурье

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

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

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

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

Функция преобразования Фурье состоит в том, чтобы преобразовать изображение из пространственной области в частотную область и обработать определенные объекты на изображении в частотной области, а затем выполнить обратное преобразование Фурье на обработанном изображении в частотной области для получения пространственного изображения. образ домена. . Его основные области применения включают: улучшение изображения, шумоподавление изображения, обнаружение краев, извлечение признаков, сжатие изображения, шифрование изображения и т. д.

Реализуйте преобразование Фурье

В пакете Numpy он предоставляет нам функцию numpy.fft.fft2() для реализации преобразования Фурье. Его полное определение выглядит следующим образом:

def fft2(原始图像):

Следует отметить, что исходное изображение должно быть изображением в градациях серого, а возвращаемое значение имеет тип ndarray.

Далее реализуем преобразование Фурье и наблюдаем полученное спектральное изображение:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("4.jpg", 0)#1
f = np.fft.fft2(img)#2
fshift = np.fft.fftshift(f)#3
spectrum = 20 * np.log(np.abs(fshift))#4
#5
plt.subplot(121)
plt.imshow(img)
plt.axis('off')
#6
plt.subplot(122)
plt.imshow(spectrum)
plt.axis('off')
#7
plt.show()

Смысл приведенного выше кода следующий:

1. Считайте изображение в градациях серого с помощью OpenCV

2. Реализовать преобразование Фурье

3. После обработки функцией 2 преобразования Фурье. В это время нулевая составляющая в спектре изображения расположена в верхнем левом углу изображения спектра, для удобства наблюдения нулевая составляющая перемещается в центр изображения частотной области функцией np .fft.fftshift.

4. После преобразования Фурье изображения получается массив комплексных чисел. Для отображения в виде изображений их значения необходимо скорректировать в соответствии с пространством оттенков серого [0,255], что достигается с помощью 20 * np.log(np.abs(fshift)).

5. Нарисуйте исходное изображение как изображение в градациях серого.

6. Постройте частотную область как изображение в градациях серого.

7. Показать 2 графика

После запуска эффект следующий:

图像

Реализуйте обратное преобразование Фурье

Так как мы переместили нулевой спектр в середину изображения, когда реализовали преобразование Фурье. Затем в обратном преобразовании нам нужно переместить его назад, а обратная функция для возврата — np.fft.ifftshift(). После перемещения назад можно выполнить обратное преобразование Фурье.

Функция обратного преобразования Фурье — np.fft.ifft2(). Он возвращает сложный массив пространственной информации, что также требует от нас настройки информации на [0,255]. Используемая формула: np.abs (результат обратного преобразования Фурье).

Затем мы реализуем преобразование Фурье, а также обратное преобразование Фурье. Код выглядит следующим образом:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("4.jpg", 0)
#傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)

ishift=np.fft.ifftshift(fshift)
iimg=np.fft.ifft2(ishift)
iimg=np.abs(iimg)
print(iimg)
print(img)

plt.subplot(121)
plt.imshow(img,cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(iimg,cmap="gray")
plt.axis('off')
plt.show()

фильтр верхних частот и фильтр нижних частот

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

Мы разделяем фильтры на фильтры нижних частот и фильтры высоких частот по принципу их работы. (Отступление, этот Qualcomm не другой Qualcomm, давайте посмотрим)

Фильтр нижних частот: пропускает низкочастотные сигналы. Фильтры нижних частот ослабляют высокочастотные сигналы и пропускают низкочастотные сигналы, размывая изображение

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

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

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

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("4.jpg", 0)
# 傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)

#屏蔽低频信号
rows, cols = img.shape
row_half, col_half = int(rows / 2), int(cols / 2)
fshift[row_half-20:row_half+20,col_half-20:col_half+20]=0

#逆傅里叶变换
ishift=np.fft.ifftshift(fshift)
iimg=np.fft.ifft2(ishift)
iimg=np.abs(iimg)

plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(iimg, cmap="gray")
plt.axis('off')
plt.show()

В приведенном выше коде низкочастотный сигнал в основном экранирован 3 строками кода, код выглядит следующим образом:

rows, cols = img.shape
row_half, col_half = int(rows / 2), int(cols / 2)
fshift[row_half-20:row_half+20,col_half-20:col_half+20]=0

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

Здесь мы выбираем распространение от центра с радиусом 30 и назначаем всем низкочастотным сигналам внутри него значение 0. После запуска мы получаем изображение с фильтром высоких частот, при этом информация о краях изображения сохраняется.

高通滤波图像