Aフーリエ変換画像OpenCVの変換します

私たちは朝食を食べるために朝の午前7時00時までは、混雑した地下鉄に仕事9:00スタートを行くために8時00分、時間の世界に住んでいます。時間領域解析は、時間基準です。しかし、すべてはの周波数領域ではまだです!

周波数:劇的な灰色成分の変化、例えば、境界

低:遅い変化グレー成分、例えば海

ロー・パス・フィルター:だけ低い周波数を維持し、画像が不鮮明になりますので、

ハイパスフィルタ:だけ高い周波数を維持、その結果、画像ディテールエンハンスメント意志

OpenCVのに主にcv2.dft()とcv2.idft()、入力画像必要がフォーマットnp.float32に変換されます。
左上部分における0であろう周波数で得られた結果は、典型的には、シフト変換で実現することができる、中心位置に変換します。
cv2.dftは()通常は、表示画像のフォーマット(0255)に変換する必要があり、2チャネル(実数部、虚数部)の結果を返します。

相関関数は次のように

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表示经过傅里叶变化后的图片

まず、周波数領域情報の画像の描画

ステップ1:ロード・イメージ

ステップ2:使用np.float32フォーマット変換

第三段階:使用cv2.dftフーリエ変更

第四段階:中間位置に移しnp.fft.shiftfft低い周波数を使用

ステップ5:cv2.magnitude空間領域にプロジェクターの実部と虚部

ステップ6:プロット操作

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()

ここに画像を挿入説明

第二に、ローパスフィルタ

最初のステップ:画像を読み取ります

ステップ2:np.float32型変換

第三段階:使用cv2.dftフーリエ変更

ステップ4:画像の中心に低周波数変換部使用np.fft.fftshift

ステップ5:マスク構造ので、マスクの中心位置が0のエッジ位置、1であること

ステップ6:フーリエ変換と合成画像は、低周波数位置の中央部分のみを残して、マスクの変換

ステップ7:使用して画像の元の位置に転送バックの低周波部分をnp.fft.ifftshift

ステップ8:使用cv2.idftフーリエ逆変換

ステップ9:空間領域の実部と虚部を変換する使用cv2.magnitude画像

ステップ10:操作をプロット

# 第一步读入图片
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()

ここに画像を挿入説明

第三に、ハイパスフィルタ

プロセスは、上記のように、高周波数部分を保持するために、画像を変換0,1の縁は、フーリエ変換と組み合わされた中間マスクの構成を除いて、低周波部分を除去します

# 第一步读入图片
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()

ここに画像を挿入説明

公開された27元の記事 ウォン称賛20 ビュー1546

おすすめ

転載: blog.csdn.net/qq_39507748/article/details/104551726