数字图像处理3 频率域滤波过程小结 python+opencv2

数字图像处理3 频率域滤波过程小结 python+opencv2


任务

编程实现频率域滤波步骤,效果参考冈萨雷斯《数字图像处理》图4.35

1.介绍

频率域滤波是对图像进行傅里叶变换,将图像由图像空间转换到频域空间,然后在频率域中对图像的频谱作分析处理,以改变图像的频率特征。
频率域滤波描述

2.原理

频率域滤波步骤小结
‘’’
1.使用零填充、镜像填充或复制填充,形成大小2M2N的图像
注:
零填充会在滤波结果中引入黑框
镜像(对称)填充,图像边界包含细节时使用
复置填充,图像边界附近为常数时使用
2.DFT及中心化
3.构建一个实对称滤波器传递函数,大小为2M
2N,中心在(M,N)
4.对应像素相乘
5.IDFT
6.提取左上角M*N大小的区域得到结果
‘’’

3.实现结果

这里使用理想低通滤波器进行操作,结果如下
在这里插入图片描述

4.源代码

#频率域滤波步骤小结
'''
1.使用零填充、镜像填充或复制填充,形成大小2M*2N的图像
注:
零填充会在滤波结果中引入黑框
镜像(对称)填充,图像边界包含细节时使用
复置填充,图像边界附近为常数时使用
2.DFT及中心化
3.构建一个实对称滤波器传递函数,大小为2M*2N,中心在(M,N)
4.对应像素相乘
5.IDFT
6.提取左上角M*N大小的区域得到结果
'''
import cv2
import numpy as np
import matplotlib.pyplot as plt

src = cv2.imread('1.png')
img = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
cv2.imshow('0',img)

#零填充
M,N = img.shape
print(img.shape)
dst = np.zeros((2*M,2*N),np.uint8)
print(dst.shape)
for i in range(0,M):
    for j in range(0,N):
        dst[i,j] = img[i,j]
cv2.imshow('1',dst)

#DFT及中心化
dft = cv2.dft(np.float32(dst),flags = cv2.DFT_COMPLEX_OUTPUT)
fshift = np.fft.fftshift(dft)
fshift_magnitude = 10 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))#复数转化为实数,和平方根,对数缩小
print(fshift_magnitude)
cv2.imshow('2',fshift_magnitude.astype(np.uint8))

#构建滤波器传递函数
mask = np.zeros((2*M, 2*N, 2), np.uint8)  #双通道,一个通道装实部,一个通道装虚部
mask[M - 50:M + 50, N - 50:N + 50] = 1

#反傅里叶变换及去中心化
G = fshift * mask  # 低通
G_magnitude = 10 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))#复数转化为实数,和平方根
cv2.imshow('3',G_magnitude.astype(np.uint8))
print(G_magnitude)
f_ishift = np.fft.ifftshift(G)  # 去中心化,,二通道
img_back = cv2.idft(f_ishift)  # 反傅里叶变换,,二通道
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])  # 取幅度,1通道
img_back = np.abs(img_back)
img_back = (img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back))
cv2.imshow('g',(img_back))

#取左上角
gg = img_back[0:M,0:N]
cv2.waitKey(0)

#plt展示
plt.subplot(321),plt.imshow(img, cmap = 'gray')
plt.subplot(322),plt.imshow(dst, cmap = 'gray')
plt.subplot(323),plt.imshow(fshift_magnitude, cmap = 'gray')
plt.subplot(324),plt.imshow(G_magnitude, cmap = 'gray')
plt.subplot(325),plt.imshow(img_back, cmap = 'gray')
plt.subplot(326),plt.imshow(gg, cmap = 'gray')
plt.show()

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值