Python+OpenCV图像处理(第10课---傅里叶变换)

在这里插入图片描述
在这里插入图片描述
正弦曲线又是由振幅和相位决定的,最终归结到连续周期信号可由振幅和相位确定。时间域和频率域两个角度之间是可以互相转换的,可逆的。
傅里叶变换就是得到高频(像素值变化快的那些像素,比如大草原上有一个狮子,狮子和大草原的接触边界)和低频(像素值变换慢的那些像素,比如大草原所有草都是绿色)信息,对低频和高频处理,还可以逆回去(比如高通滤波允许高频通过,低频衰减,然后再逆回图像,边缘保留,细节丢失)。

傅里叶变换

# -*- coding: utf-8 -*-

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

img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
f = np.fft.fft2(img)            # 傅里叶变换
fshift = np.fft.fftshift(f)     # 低频挪到频谱图中心
res = 20*np.log(np.abs(fshift)) # 映射到[0, 255]

plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off')     # 不显示坐标轴

plt.subplot(1, 2, 2)
plt.imshow(res, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')


在这里插入图片描述

逆傅里叶变换

# -*- coding: utf-8 -*-

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

img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
f = np.fft.fft2(img)                # 傅里叶变换
fshift = np.fft.fftshift(f)         # 低频挪到频谱图中心
ishift = np.fft.ifftshift(fshift)   # 挪回去
iimg = np.fft.ifft2(ishift)         # 逆变换
iimg = np.abs(iimg)

plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off')     # 不显示坐标轴

plt.subplot(1, 2, 2)
plt.imshow(iimg, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')


在这里插入图片描述

高通滤波

# -*- coding: utf-8 -*-

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

img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
f = np.fft.fft2(img)                # 傅里叶变换
fshift = np.fft.fftshift(f)         # 低频挪到频谱图中心

row, col = img.shape
crow, ccol = int(row/2), int(col/2) # 中心点
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 # 中心区域变为0,去除低频

ishift = np.fft.ifftshift(fshift)   # 挪回去
iimg = np.fft.ifft2(ishift)         # 逆变换
iimg = np.abs(iimg)

plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off')     # 不显示坐标轴

plt.subplot(1, 2, 2)
plt.imshow(iimg, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')


在这里插入图片描述

低通滤波

# -*- coding: utf-8 -*-

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

img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dshift = np.fft.fftshift(dft)
row, col = img.shape
crow, ccol = int(row/2), int(col/2)

mask = np.zeros((row, col, 2), np.int8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1  # 这块区域代表低频部分保留多少
md = dshift*mask
imd = np.fft.ifftshift(md)
iimg = cv2.idft(imd)
iimg = cv2.magnitude(iimg[:,:,0], iimg[:, :, 1])

plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off')     # 不显示坐标轴

plt.subplot(1, 2, 2)
plt.imshow(iimg, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')

在这里插入图片描述

特别说明

本文参考网易云课堂《Python+OpenCV图像处理》

发布了323 篇原创文章 · 获赞 193 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/103851133