python实现图像的频域滤波_(十)OpenCV-Python学习—频率域滤波

本文介绍了图像处理中的频率域滤波,通过在傅里叶谱上操作来处理图像。详细讲解了低通、高通、带通和带阻滤波器的概念和实现,利用OpenCV库展示了Python代码示例,以滤波器类型和半径为参数,实现实时调整滤波效果。滤波器类型包括理想滤波器、巴特沃斯滤波器和高斯滤波器,对图像进行模糊、锐化等处理。
摘要由CSDN通过智能技术生成

之前的图像处理,都是再原图上进行;而频率域滤波,是在图像的傅里叶谱上进行处理,最后再通过傅里叶逆变换得到处理后的图像,则是因为图片的傅里叶谱包含图片的频率信息,方便对其频率进行处理。对于图像,低频信息表示图像中灰度值缓慢变化的区域,如背景信息等;而高频信息则表示灰度值迅速变化的区域,如边缘处等细节信息。

在经过中心化后的傅立叶谱(幅度谱),其中心位置的幅度值最大,频率最低,随着离中心位置的距离增加频率会越来越大,所以,中心化后的傅里叶谱,中心位置为低频区域,四个角落处为高频区域。频率域滤波通常的处理步骤如下:

常用的滤波器有四种:低通滤波器,高通滤波器,带通滤波器,带阻滤波器

低通滤波器

低通滤波器,即保留傅里叶变换的低频信息,过滤掉高频信息,会使图片变得更模糊。常用的低通滤波器包括理想低通滤波器,巴特沃斯低通滤波器,高斯低通滤波器。假设图像傅里叶变换的高,宽为H、W,傅里叶谱的最大值在中心点位置(maxR, maxC), D(r, c)代表点(r, c)到中心点的距离:

那么三种滤波器可以表示为:

理想低通滤波器:

巴特沃斯低通滤波器:

高斯低通滤波器:

低通滤波器的使用代码及结果如下:

#coding:utf-8import cv2

import numpyasnp

def createLPFilter(shape, center, radius, lpType=2, n=2):

rows, cols= shape[:2]

r, c= np.mgrid[0:rows:1, 0:cols:1]

c-= center[0]

r-= center[1]

d= np.power(c, 2.0) + np.power(r, 2.0)

lpFilter_matrix=np.zeros(shape, np.float32)if lpType == 0: # 理想低通滤波器

lpFilter=np.copy(d)

lpFilter[lpFilter< pow(radius, 2.0)] = 1lpFilter[lpFilter>= pow(radius, 2.0)] = 0elif lpType== 1: #巴特沃斯低通滤波器

lpFilter= 1.0 / (1 + np.power(np.sqrt(d)/radius, 2*n))

elif lpType== 2: # 高斯低通滤波器

lpFilter= np.exp(-d/(2*pow(radius, 2.0)))

lpFilter_matrix[:, :,0] =lpFilter

lpFilter_matrix[:, :,1] =lpFilterreturnlpFilter_matrix

def stdFftImage(img_gray, rows, cols):

fimg=np.copy(img_gray)

fimg=fimg.astype(np.float32) #注意这里的类型转换

#1.图像矩阵乘以(-1)^(r+c), 中心化for r inrange(rows):for c inrange(cols):if (r+c) % 2:

fimg[r][c]= -1 *img_gray[r][c]

img_fft=fftImage(fimg, rows, cols)returnimg_fft

def fftImage(img_gray, rows, cols):

rPadded=cv2.getOptimalDFTSize(rows)

cPadded=cv2.getOptimalDFTSize(cols)

imgPadded= np.zeros((rPadded, cPadded), dtype=np.float32)

imgPadded[:rows, :cols]=img_gray

img_fft= cv2.dft(imgPadded, flags=cv2.DFT_COMPLEX_OUTPUT)returnimg_fft

def graySpectrum(fft_img):

real= np.power(fft_img[:, :, 0], 2.0)

imaginary= np.power(fft_img[:, :, 1], 2.0)

amplitude= np.sqrt(real+imaginary)

spectrum= np.log(amplitude+1.0)

spectrum= cv2.normalize(spectrum, 0, 1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

spectrum*= 255

returnamplitude, spectrum

def nothing(args):

passif __name__ == "__main__":

img_file= r"C:\Users\silence_cho\Desktop\Messi.jpg"# img_file= r"D:\data\receipt_rotate.jpg"img_gray= cv2.imread(img_file, 0)

#1.快速傅里叶变换

rows, cols= img_gray.shape[:2]

img_fft=stdFftImage(img_gray, rows, cols)

amplitude, _=graySpectrum(img_fft)

minValue, maxValue, minLoc, maxLoc=cv2.minMaxLoc(amplitude) #中心化后频谱的最大值在图片中心位置处

cv2.namedWindow("tracks")

max_radius= np.sqrt(pow(rows, 2) + pow(cols, 2))/2cv2.createTrackbar("Radius", "tracks", 0, int(max_radius), nothing)

cv2.createTrackbar("Filter type", "tracks", 0, 2, nothing)whileTrue:

#2.构建低通滤波器

radius= cv2.getTrackbarPos("Radius", "tracks")

Python中可以使用numpy和opencv库进行图像频域滤波。 1.使用numpy库实现图像频域滤波 频域滤波的步骤是: (1)读入图像 (2)将图像转换为灰度图 (3)进行傅里叶变换,得到频域图像 (4)设计滤波器 (5)对频域图像进行滤波操作 (6)进行傅里叶逆变换,得到滤波后的图像 代码示例: ```python import cv2 import numpy as np # 读入图像 img = cv2.imread('img.jpg') # 将图像转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 进行傅里叶变换,得到频域图像 f = np.fft.fft2(gray) fshift = np.fft.fftshift(f) # 构建高通滤波器 rows, cols = gray.shape crow, ccol = rows // 2, cols // 2 mask = np.ones((rows, cols), np.uint8) mask[crow - 30: crow + 30, ccol - 30: ccol + 30] = 0 # 对频域图像进行滤波操作 fshift = fshift * mask # 进行傅里叶逆变换,得到滤波后的图像 ishift = np.fft.ifftshift(fshift) i = np.fft.ifft2(ishift) result = np.abs(i) # 显示原图和滤波后的图像 cv2.imshow('Original', gray) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 2.使用opencv实现图像频域滤波 OpenCV提供了cv2.dft()和cv2.idft()函数,可以方便地实现图像的傅里叶变换和逆变换。与numpy库相比,opencv库的实现更加简单。频域滤波的步骤与上面的步骤相同。 代码示例: ```python import cv2 import numpy as np # 读入图像 img = cv2.imread('img.jpg') # 将图像转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 进行傅里叶变换,得到频域图像 dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) # 构建高通滤波器 rows, cols = gray.shape crow, ccol = rows // 2, cols // 2 mask = np.ones((rows, cols, 2), np.uint8) mask[crow - 30: crow + 30, ccol - 30: ccol + 30] = 0 # 对频域图像进行滤波操作 fshift = dft_shift * mask # 进行傅里叶逆变换,得到滤波后的图像 ishift = np.fft.ifftshift(fshift) i = cv2.idft(ishift) result = cv2.magnitude(i[:, :, 0], i[:, :, 1]) # 显示原图和滤波后的图像 cv2.imshow('Original', gray) cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值