Une transformée de Fourier l'image opencv

Nous vivons dans un monde de temps, jusqu'à à 7h00 le matin pour prendre le petit déjeuner, 8h00 pour aller métro bondé, 9:00 commencer à travailler. . . analyse dans le domaine temporel est la référence temporelle. Mais tout est encore dans le domaine de fréquence!

Fréquence: changements drastiques dans la composante de gris, par exemple, la frontière

Min: changements lents de la composante de gris, par exemple une mer

Filtre passe-bas: ne conservant qu'une faible fréquence, de sorte que l'image sera brouillée

Filtre passe-haut: ne conservant qu'une fréquence élevée, de telle sorte que l'image détaillée amélioration volonté

En OpenCV principalement cv2.dft () et cv2.idft (), l'image d'entrée doivent être convertis en un np.float32 format.
Les résultats obtenus dans la fréquence sera de 0 dans la partie supérieure gauche, typiquement convertir à la position centrale, il peut être réalisé par conversion de changement de vitesse.
cv2.dft () renvoie le résultat des deux canaux (partie réelle, partie imaginaire), vous devez généralement être converti en format d' affichage d'image (0255).

Fonction de corrélation suit comme

1. cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 进行傅里叶变化

参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法

2. np.fft.fftshift(img)  将图像中的低频部分移动到图像的中心

参数说明:img表示输入的图片

3. cv2.magnitude(x, y) 将sqrt(x^2 + y^2) 计算矩阵维度的平方根

参数说明:需要进行x和y平方的数

4.np.fft.ifftshift(img) # 进图像的低频和高频部分移动到图像原来的位置

参数说明:img表示输入的图片

5.cv2.idft(img) # 进行傅里叶的逆变化

参数说明:img表示经过傅里叶变化后的图片

Tout d'abord, le domaine fréquentiel dessin d'image de l'information

Première étape: Charger les images

Étape 2: Utiliser la conversion de format np.float32

La troisième étape: Utiliser des changements de Fourier cv2.dft

La quatrième étape: en utilisant la np.fft.shiftfft basse fréquence transféré dans une position intermédiaire

Etape 5: cv2.magnitude les parties réelles et imaginaires d'un projecteur à un domaine spatial

Sixième étape: opération tracée

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


# 第一步读取图片
img = cv2.imread('lena.jpg', 0)

# 第二步:进行float32形式转换
float32_img = np.float32(img)

# 第三步: 使用cv2.dft进行傅里叶变化
dft_img = cv2.dft(float32_img, flags=cv2.DFT_COMPLEX_OUTPUT)

# 第四步:使用np.fft.shiftfft()将变化后的图像的低频转移到中心位置
dft_img_ce = np.fft.fftshift(dft_img)

# 第五步:使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
img_dft = 20 * np.log(cv2.magnitude(dft_img_ce[:, :, 0], dft_img_ce[:, :, 1]))

# 第六步:进行画图操作
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(img_dft, cmap='gray')
plt.show()

Insérer ici l'image Description

Deuxièmement, filtrage passe-bas

La première étape: lire l'image

Deuxième étape: conversion de type np.float32

La troisième étape: Utiliser des changements de Fourier cv2.dft

Quatrième étape: Utilisation np.fft.fftshift convertir la partie basse fréquence vers le centre de l'image

Cinquième étape: La structure de masque, de sorte que la position centrale du masque est 1, la position de bord de 0

Sixième étape: l'image associée à la transformée de Fourier du masque, en laissant seulement la partie centrale de la position à basse fréquence

Etape 7: Utilisation np.fft.ifftshift la partie basse fréquence du dos de transfert à la position initiale de l'image

Huitième étape: Utilisation de Fourier inverse cv2.idft conversion

Etape 9: Utilisation de l'image cv2.magnitude convertir des parties réelle et imaginaire du domaine spatial

Etape 10: Opération tracé

# 第一步读入图片
img = cv2.imread('lena.jpg', 0)
# 第二步:进行数据类型转换
img_float = np.float32(img)
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_center = np.fft.fftshift(dft)
# 第五步:定义掩模:生成的掩模中间为1周围为0
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
mask_img = dft_center * mask

# 第七步:使用np.fft.ifftshift()将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)

# 第八步:使用cv2.idft进行傅里叶的反变化
img_idf = cv2.idft(img_idf)

# 第九步:使用cv2.magnitude转化为空间域内
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])

# 第十步:进行绘图操作
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(img_idf, cmap='gray')
plt.show()

Insérer ici l'image Description

En troisième lieu, le filtrage passe-haut

Procédé comme ci-dessus, à l'exception de la configuration du masque intermédiaire est égal à 0, 1 bords, puis combiné avec l'image de transformée de Fourier, pour retenir la partie haute fréquence, retirez partie à basse fréquence

# 第一步读入图片
img = cv2.imread('lena.jpg', 0)
# 第二步:进行数据类型转换
img_float = np.float32(img)
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_center = np.fft.fftshift(dft)
# 第五步:定义掩模:生成的掩模中间为0周围为1
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0

# 第六步:将掩模与傅里叶变化后图像相乘,去除中心部分,保留周围部分
mask_img = dft_center * mask

# 第七步:使用np.fft.ifftshift()将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)

# 第八步:使用cv2.idft进行傅里叶的反变化
img_idf = cv2.idft(img_idf)

# 第九步:使用cv2.magnitude转化为空间域内
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])

# 第十步:进行绘图操作
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(img_idf, cmap='gray')
plt.show()

Insérer ici l'image Description

Publié 27 articles originaux · louange gagné 20 · vues 1546

Je suppose que tu aimes

Origine blog.csdn.net/qq_39507748/article/details/104551726
conseillé
Classement