资讯详情

计算机视觉-图像的傅里叶变换

?????? ????? ?????网络爬虫和机器学习的相关知识已经更新,计算机视觉正在更新-OpenCV相关内容。 ??????

文章目录

    • ??傅里叶基础
    • ??傅里叶基础numpy实现
    • ??逆傅里叶numpy实现
    • ??高通滤波器的频域
    • ??傅里叶OpenCV实现
    • ??傅里叶OpenCV逆变换实现
    • ??低通滤波的频域
    • ??傅里叶变换的应用场景是什么?
    • ??傅里叶变换matlab实现
在这里插入图片描述

??傅里叶基础

法国数学家吉恩·巴普提斯特·约瑟夫·傅里叶被世界铭记的最大贡献是:他指出,任何周期函数都可以表示为不同频率的正弦和/或余弦之和,每个正弦项和/或余弦项乘以不同的系数(现在称为傅里叶级数)。不管函数有多复杂,只要是周期性的,满足一些适度的数学条件,都可以用这种和谐来表示。也就是说,复杂的函数可以表示为简单的正弦和余弦之和。即使是非周期函数(单曲线下的面积有限)也可以使用正弦和/或许·以加权函数的积分表示余弦。在这种情况下,公式是傅里叶公式。

例如,从制作饮料的过程来看,从时域的角度来看: 这是什么意思?也就是说,一种饮料的生产需要在18:00将一个单位的冰糖、三个单位的红豆、两个单位的绿豆、四个单位的西红柿和一个单位的纯水放在一起。然后18:01只需要一个单位的纯水。后面也一样。 频域是如何描述这件事的? 具体来说,他发现了一个规则,就是在这个生产过程中,每分钟加冰糖,每两分钟加红豆,每三分钟加绿豆一次…。 我们这样描述时域角度。 我们从频域的角度这样描述这件事,用直方图来表示: 如果要考虑更准确的时间精度,就要介绍相位的概念。它是一种与时差有关的表达。 在这里,我们解释说,时域和频域的表达是相反的。对于时域,我们的时间是横坐标,振幅是纵坐标。对于频域,我们以频率为横坐标,振幅为纵坐标。但可以看出,频域的表达更简单,但更抽象,更难理解。 傅里叶说: 请注意,这是一组而不是一组。例如,这样的图像: 它看起来不规则,但它也可以由一组正弦函数组成。 他们是可逆的。出乎意料的是,乱七八糟的东西是有规律的。但它们是这样组合的吗?这是不可能的,所以这是一组余弦函数同时开始的吗?叠加时应反映开始时间。换句话说,组合函数的开始时间不同。它对应0、2和3。看公式。 这里多说一嘴就是说傅里叶变换从时域角度来看,这个世界是动态的!从频域角度来看这个世界是静止的。 从数学角度来看,傅里叶转换将任何周期函数分解为无限正弦函数的和。 从物理角度来看,傅里叶转换实现了从空间域到频率域的信号转换。

??傅里叶基础numpy实现

python傅里叶的变换是可以实现的,这里就来说说三剑客的numpy对应的函数是:numpy.fft.fft2返回复数数组(complex ndarray)。numpy.fft.fftshift该函数表示将零频率分量转移到频谱中心。 还应设置频谱范围20*np.log(np.abs(fshift)),图像是255。

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('image\\lena.bmp',0) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) result = 20*np.log(np.abs(fshift)) plt.subplot(121) plt.imshow(img, cmap = 'gray')
plt.title('original')
plt.axis('off')
plt.subplot(122)
plt.imshow(result, cmap = 'gray')
plt.title('result')
plt.axis('off')
plt.show()

结果是: 原图和频谱图像。

🌟逆傅里叶numpy实现

对于傅里叶的逆操作这里没有什么可说的,就是把频域图像转回原图像。 函数是:numpy.fft.ifft2,那么还有一个操作就是把中间移动回去对啊。numpy.fft.ifftshiftiimg = np.abs(逆傅里叶变换结果)而第二个图就表示低频部分,边缘就表示为高频部分。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\boat.bmp',0)
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(121),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(iimg, cmap = 'gray')
plt.title('iimg'),plt.axis('off')
plt.show()

首先我们要进行傅里叶变换吧,才可以进行逆操作。结果是: 完全一致!!!

🌟频域的高通滤波

首先我们来看看到底什么是高频,什么是低频在图像中如何理解。 对于滤波我们之前也了解过了,就是说过滤掉不需要的部分呗。 修改傅里叶变换以达到特殊目的,然后计算IDFT返回到图像域。比如我们可以利用傅里叶变换进行,图像增强、图像去噪、边缘检测、特征提取、图像压缩、图像加密等。 那么我们只需要再滤波中来一个掩膜操作,具体看下面: 对于这个掩膜我们这样做:

rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

具体代码是:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\boat.bmp',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(iimg, cmap = 'gray')
plt.title('iimg'),plt.axis('off')
plt.show()

得到后的图象是这样的: 可以出来把边缘描绘的非常完整,但是图像的对比度降低了。

🌟傅里叶OpenCV实现

对于OpenCV中的傅里叶变换函数是:返回结果=cv2.dft(原始图像,转换标识) 返回结果是双通道的,第一个是实数部分,第二个通道是虚数部分。 移动频谱部分和numpy一致,是这样的,numpy.fft.fftshift,然后进行返回值=cv2.magnitude(参数1,参数2)这里参数1就是实数部分,参数2就是虚数部分,并且进行𝑑𝑠𝑡 𝐼 = 根号𝑥(𝐼)2 + 𝑦(𝐼)2操作。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image\\lena.bmp',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(result, cmap = 'gray')
plt.title('result'), plt.axis('off')
plt.show()

得到的图像和numpy一致。

🌟傅里叶OpenCV逆变换实现

对于傅里叶变换的逆操作,使用OpenCV的函数就是返回结果=cv2.idft(原始数据),然后计算幅度函数仍然是返回值=cv2.magnitude(参数1,参数2)numpy.fft.ifftshift

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image\\lena.bmp',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
ishift = np.fft.ifftshift(dftShift)
iImg = cv2.idft(ishift)
iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'), plt.axis('off')
plt.subplot(122),plt.imshow(iImg, cmap = 'gray')
plt.title('inverse'), plt.axis('off')
plt.show()

🌟频域的低通滤波

我们这里的想法就是: 自己构建一个低通滤波器,把中间位置设置成255,其余部分为0.那么我们做一个与操作,就可以把高频过滤了。

rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

低通滤波器构建代码。 然后我们完整代码就是:

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image\\lena.bmp',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
fShift = dftShift*mask
ishift = np.fft.ifftshift(fShift)
iImg = cv2.idft(ishift)
iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'), plt.axis('off')
plt.subplot(122),plt.imshow(iImg, cmap = 'gray')
plt.title('inverse'), plt.axis('off')
plt.show()

结果是:

🌟傅里叶变换有什么应用场景

傅里叶变换可以将一个时域信号转换成在不同频率下对应的振幅及相位,其频谱就是时域信号在频域下的表现,而反傅里叶变换可以将频谱再转换回时域的信号。最简单最直接的应用就是时频域转换,比如在移动通信的LTE系统中,要把接收的信号从时域变成频域,就需要使用FFT(快速傅里叶变换)。又例如对一个采集到的声音做傅立叶变化就能分出好几个频率的信号。比如南非世界杯时,南非人吹的呜呜主拉的声音太吵了,那么对现场的音频做傅立叶变化(当然是对声音的数据做),会得到一个展开式,然后找出呜呜主拉的特征频率,去掉展开式中的那个频率的sin函数,再还原数据,就得到了没有呜呜主拉的嗡嗡声的现场声音。而对图片的数据做傅立叶,然后增大高频信号的系数就可以提高图像的对比度。同样,相机自动对焦就是通过找图像的高频分量最大的时候,就是对好了。

🌟傅里叶变换matlab实现

[i,lcmp]=imread('F:/123.jpg');%=======读取图像 显示图像
subplot(2,2,1),imshow(i,lcmp);
title('original');
ii=im2double(i); %=====将图像矩阵类型转换为double(图像计算很多是不能用整型的),没有这个会报错!! ,如果不用这个就必须转化为灰度图!
i1 = fft2(ii); %======傅里叶变换
i2 =fftshift(i1); %======将变换的频率图像四角移动到中心(原来良的部分在四角 现在移动中心,便于后面的处理)
i3=log(abs(i2)); %=====显示中心低频部分,加对数是为了更好的显示
subplot(2,2,2),imshow(i3,[]);
title('Fourier');
map=colormap(lcmp); %===取色谱
imwrite(i3,map,'f:/ffttank.bmp'); %===将上面i3输入到ffttank文件中
i5 = real(ifft2(ifftshift(i2))); %===频域的图反变换到空域 并取实部
i6 = im2uint8(mat2gray(i5)); %===取其灰度图
imwrite(i6,map,'f:/tank2.bmp','bmp'); %===利用灰度图和原来取得颜色模板 还原图像
subplot(2,2,3),imshow(i6);
title('anti-Fourier');
i7=rgb2gray(i);
i8=fft2(i7);%===对灰色图才能归一化。因为那是2维矩阵,彩色图是3维矩阵,需要转化为2维灰图
m=fftshift(i8); %直流分量移到频谱中心
%RR=real(m); %取傅立叶变换的实部
%II=imag(m); %取傅立叶变换的虚部
A=abs(m);%计算频谱幅值
%A=sqrt(RR.^2+II.^2);
A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225; %归一化
subplot(2,2,4),imshow(A); %显示原图像
colorbar; %显示图像的颜色条
title('FFT spectrum'); %图像命名

结果是:

🔎🎁🎁🎁

标签: 法国coudoint电阻器法国vishay位移传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台