河南建设工程协会网站,太原深圳建设工程信息网站,广州seo服务公司,cms免费源码图像处理已经成为我们日常生活中不可或缺的一部分#xff0c;涉及到社交媒体和医学成像等各个领域。通过数码相机或卫星照片和医学扫描等其他来源获得的图像可能需要预处理以消除或增强噪声。频域滤波是一种可行的解决方案#xff0c;它可以在增强图像锐化的同时消除噪声。
…图像处理已经成为我们日常生活中不可或缺的一部分涉及到社交媒体和医学成像等各个领域。通过数码相机或卫星照片和医学扫描等其他来源获得的图像可能需要预处理以消除或增强噪声。频域滤波是一种可行的解决方案它可以在增强图像锐化的同时消除噪声。
快速傅里叶变换(FFT)是一种将图像从空间域变换到频率域的数学技术是图像处理中进行频率变换的关键工具。通过利用图像的频域表示我们可以根据图像的频率内容有效地分析图像从而简化滤波程序的应用以消除噪声。本文将讨论图像从FFT到逆FFT的频率变换所涉及的各个阶段并结合FFT位移和逆FFT位移的使用。
本文使用了三个Python库即openCV、Numpy和Matplotlib。 importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimgcv2.imread(sample.png,0) # Using 0 to read image in grayscale modeplt.imshow(img, cmapgray) #cmap is used to specify imshow that the image is in greyscaleplt.xticks([]), plt.yticks([]) # remove tick marksplt.show()1、快速傅里叶变换(FFT)
快速傅里叶变换(FFT)是一种广泛应用的数学技术它允许图像从空间域转换到频率域是频率变换的基本组成部分。利用FFT分析可以得到图像的周期性并将其划分为不同的频率分量生成图像频谱显示每个图像各自频率成分的振幅和相位。 fnp.fft.fft2(img) #the image img is passed to np.fft.fft2() to compute its 2D Discrete Fourier transform f mag20*np.log(np.abs(f))plt.imshow(mag, cmapgray) #cmapgray parameter to indicate that the image should be displayed in grayscale.plt.title(Magnitude Spectrum) plt.xticks([]), plt.yticks([])plt.show()上面代码使用np.abs()计算傅里叶变换f的幅度np.log()转换为对数刻度然后乘以20得到以分贝为单位的幅度。这样做是为了使幅度谱更容易可视化和解释。
2、FFT位移
为了使滤波算法应用于图像利用FFT移位将图像的零频率分量被移动到频谱的中心 fshift np.fft.fftshift(f)mag 20*np.log(np.abs(fshift)) plt.imshow(mag, cmap gray)plt.title(Centered Spectrum), plt.xticks([]), plt.yticks([])plt.show()3、过滤
频率变换的的一个目的是使用各种滤波算法来降低噪声和提高图像质量。两种最常用的图像锐化滤波器是Ideal high-pass filter 和Gaussian high-pass filter。这些滤波器都是使用的通过快速傅里叶变换(FFT)方法获得的图像的频域表示。
Ideal high-pass filter理想滤波器 是一种无限长的、具有无限频带宽和理想通带和阻带响应的滤波器。其通带内所有频率的信号都被完全传递而阻带内所有频率的信号则完全被抑制。
在频域上理想滤波器的幅频响应为
在通带内幅频响应为 1在阻带内幅频响应为 0
在时域上理想滤波器的冲激响应为
在通带内冲激响应为一个无限长的单位冲激函数序列在阻带内冲激响应为零
由于理想滤波器在频域上具有无限带宽因此它无法在实际应用中实现。实际中使用的数字滤波器通常是基于理想滤波器的逼近所以才被成为只是一个Ideal。
高斯高通滤波器Gaussian high-pass filter是一种在数字图像处理中常用的滤波器。它的作用是在图像中保留高频细节信息并抑制低频信号。该滤波器基于高斯函数具有光滑的频率响应可以适应各种图像细节。
高斯高通滤波器的频率响应可以表示为
H(u,v) 1 - L(u,v)
其中L(u,v)是一个低通滤波器它可以用高斯函数表示。通过将低通滤波器的响应从1中减去可以得到一个高通滤波器的响应。在实际中通常使用不同的参数设置来调整高斯函数以达到不同的滤波效果。
圆形掩膜disk-shaped images是用于定义在图像中进行傅里叶变换时要保留或抑制的频率分量。在这种情况下理想滤波器通常是指理想的低通或高通滤波器可以在频域上选择保留或抑制特定频率范围内的信号。将这个理想滤波器应用于图像的傅里叶变换后再进行逆变换可以得到经过滤波器处理后的图像。
具体的细节我们就不介绍了直接来看代码
下面函数是生成理想高通和低通滤波器的圆形掩膜 importmathdefdistance(point1,point2):returnmath.sqrt((point1[0]-point2[0])**2 (point1[1]-point2[1])**2)defidealFilterLP(D0,imgShape):basenp.zeros(imgShape[:2])rows, colsimgShape[:2]center (rows/2,cols/2)forxinrange(cols):foryinrange(rows):ifdistance((y,x),center) D0:base[y,x] 1returnbasedefidealFilterHP(D0,imgShape):basenp.ones(imgShape[:2])rows, colsimgShape[:2]center (rows/2,cols/2)forxinrange(cols):foryinrange(rows):ifdistance((y,x),center) D0:base[y,x] 0returnbase下面函数生成一个高斯高、低通滤波器与所需的圆形掩膜 importmathdefdistance(point1,point2):returnmath.sqrt((point1[0]-point2[0])**2 (point1[1]-point2[1])**2)defgaussianLP(D0,imgShape):basenp.zeros(imgShape[:2])rows, colsimgShape[:2]center (rows/2,cols/2)forxinrange(cols):foryinrange(rows):base[y,x] math.exp(((-distance((y,x),center)**2)/(2*(D0**2))))returnbasedefgaussianHP(D0,imgShape):basenp.zeros(imgShape[:2])rows, colsimgShape[:2]center (rows/2,cols/2)forxinrange(cols):foryinrange(rows):base[y,x] 1-math.exp(((-distance((y,x),center)**2)/(2*(D0**2))))returnbase过滤示例 fig, axplt.subplots(2, 2) # create a 2x2 grid of subplotsfig.suptitle(Filters) # set the title for the entire figure# plot the first image in the top-left subplotim1ax[0, 0].imshow(np.abs(idealFilterLP(50, img.shape)), cmapgray)ax[0, 0].set_title(Low Pass Filter of Diameter 50 px)ax[0, 0].set_xticks([])ax[0, 0].set_yticks([])# plot the second image in the top-right subplotim2ax[0, 1].imshow(np.abs(idealFilterHP(50, img.shape)), cmapgray)ax[0, 1].set_title(High Pass Filter of Diameter 50 px)ax[0, 1].set_xticks([])ax[0, 1].set_yticks([])# plot the third image in the bottom-left subplotim3ax[1, 0].imshow(np.abs(gaussianLP(50 ,img.shape)), cmapgray)ax[1, 0].set_title(Gaussian Filter of Diameter 50 px)ax[1, 0].set_xticks([])ax[1, 0].set_yticks([])# plot the fourth image in the bottom-right subplotim4ax[1, 1].imshow(np.abs(gaussianHP(50 ,img.shape)), cmapgray)ax[1, 1].set_title(Gaussian Filter of Diameter 50 px)ax[1, 1].set_xticks([])ax[1, 1].set_yticks([])# adjust the spacing between subplotsfig.subplots_adjust(wspace0.5, hspace0.5)# save the figure to a filefig.savefig(filters.png, bbox_inchestight)相乘过滤器和移位的图像得到过滤图像
为了获得具有所需频率响应的最终滤波图像关键是在频域中对移位后的图像与滤波器进行逐点乘法。
这个过程将两个图像元素的对应像素相乘。例如当应用低通滤波器时我们将对移位的傅里叶变换图像与低通滤波器逐点相乘。
此操作抑制高频并保留低频对于高通滤波器反之亦然。这个乘法过程对于去除不需要的频率和增强所需的频率是必不可少的从而产生更清晰和更清晰的图像。
它使我们能够获得期望的频率响应并在频域获得最终滤波图像。
4、乘法滤波器Multiplying Filter和平移后的图像Shifted Image
乘法滤波器是一种以像素值为权重的滤波器它通过将滤波器的权重与图像的像素值相乘来获得滤波后的像素值。具体地假设乘法滤波器的权重为h(i,j)图像的像素值为f(m,n)那么滤波后的像素值g(x,y)可以表示为
g(x,y) ∑∑ f(m,n)h(x-m,y-n)
其中∑∑表示对所有的(m,n)进行求和。
平移后的图像是指将图像进行平移操作后的结果。平移操作通常是指将图像的像素沿着x轴和y轴方向进行平移。平移后的图像与原始图像具有相同的大小和分辨率但它们的像素位置发生了变化。在滤波操作中平移后的图像可以用于与滤波器进行卷积运算以实现滤波操作。
此操作抑制高频并保留低频对于高通滤波器反之亦然。这个乘法过程对于去除不需要的频率和增强所需的频率是必不可少的从而产生更清晰和更清晰的图像。
它使我们能够获得期望的频率响应并在频域获得最终滤波图像。 fig, axplt.subplots()imax.imshow(np.log(1np.abs(fftshifted_image*idealFilterLP(50,img.shape))), cmapgray)ax.set_title(Filtered Image in Frequency Domain)ax.set_xticks([])ax.set_yticks([])fig.savefig(filtered image in freq domain.png, bbox_inchestight)在可视化傅里叶频谱时使用np.log(1np.abs(x))和20*np.log(np.abs(x))之间的选择是个人喜好的问题可以取决于具体的应用程序。
一般情况下会使用Np.log (1np.abs(x))因为它通过压缩数据的动态范围来帮助更清晰地可视化频谱。这是通过取数据绝对值的对数来实现的并加上1以避免取零的对数。
而20*np.log(np.abs(x))将数据按20倍缩放并对数据的绝对值取对数这可以更容易地看到不同频率之间较小的幅度差异。但是它不会像np.log(1np.abs(x))那样压缩数据的动态范围。
这两种方法都有各自的优点和缺点最终取决于具体的应用程序和个人偏好。
5、逆FFT位移
在频域滤波后我们需要将图像移回原始位置然后应用逆FFT。为了实现这一点需要使用逆FFT移位它反转了前面执行的移位过程。 fig, axplt.subplots()imax.imshow(np.log(1np.abs(np.fft.ifftshift(fftshifted_image*idealFilterLP(50,img.shape)))), cmapgray)ax.set_title(Filtered Image inverse fft shifted)ax.set_xticks([])ax.set_yticks([])fig.savefig(filtered image inverse fft shifted.png, bbox_inchestight)6、快速傅里叶逆变换(IFFT)
快速傅里叶逆变换(IFFT)是图像频率变换的最后一步。它用于将图像从频域传输回空间域。这一步的结果是在空间域中与原始图像相比图像减少了噪声并提高了清晰度。 fig, axplt.subplots()imax.imshow(np.log(1np.abs(np.fft.ifft2(np.fft.ifftshift(fftshifted_image*idealFilterLP(50,img.shape))))), cmapgray)ax.set_title(Final Filtered Image In Spatial Domain)ax.set_xticks([])ax.set_yticks([])fig.savefig(final filtered image.png, bbox_inchestight)总结
我们再把所有的操作串在一起显示
函数绘制所有图像 defFreq_Trans(image, filter_used):img_in_freq_domainnp.fft.fft2(image)# Shift the zero-frequency component to the center of the frequency spectrumcenterednp.fft.fftshift(img_in_freq_domain)# Multiply the filter with the centered spectrumfiltered_image_in_freq_domaincentered*filter_used# Shift the zero-frequency component back to the top-left corner of the frequency spectruminverse_fftshift_on_filtered_imagenp.fft.ifftshift(filtered_image_in_freq_domain)# Apply the inverse Fourier transform to obtain the final filtered imagefinal_filtered_imagenp.fft.ifft2(inverse_fftshift_on_filtered_image)returnimg_in_freq_domain,centered,filter_used,filtered_image_in_freq_domain,inverse_fftshift_on_filtered_image,final_filtered_image使用高通、低通理想滤波器和高斯滤波器的直径分别为50、100和150像素展示它们对增强图像清晰度的影响。 fig, axsplt.subplots(12, 7, figsize(30, 60))filters [(f, d) forfin [idealFilterLP, idealFilterHP, gaussianLP, gaussianHP] fordin [50, 100, 150]]forrow, (filter_name, filter_diameter) inenumerate(filters):# Plot each filter output on a separate subplotresultFreq_Trans(img, filter_name(filter_diameter, img.shape))forcol, title, img_arrayinzip(range(7), [Original Image, Spectrum, Centered Spectrum, f{filter_name.__name__} of Diameter {filter_diameter} px,fCentered Spectrum multiplied by {filter_name.__name__}, Decentralize, Processed Image],[img, np.log(1np.abs(result[0])), np.log(1np.abs(result[1])), np.abs(result[2]), np.log(1np.abs(result[3])), np.log(1np.abs(result[4])), np.abs(result[5])]):axs[row, col].imshow(img_array, cmapgray)axs[row, col].set_title(title)plt.tight_layout()plt.savefig(all_processess.png, bbox_inchestight)plt.show()可以看到当改变圆形掩膜的直径时对图像清晰度的影响会有所不同。随着直径的增加更多的频率被抑制从而产生更平滑的图像和更少的细节。减小直径允许更多的频率通过从而产生更清晰的图像和更多的细节。为了达到理想的效果选择合适的直径是很重要的因为使用太小的直径会导致过滤器不够有效而使用太大的直径会导致丢失太多的细节。
一般来说高斯滤波器由于其平滑性和鲁棒性更常用于图像处理任务。在某些应用中需要更尖锐的截止理想滤波器可能更适合。
利用FFT修改图像频率是一种有效的降低噪声和提高图像锐度的方法。这包括使用FFT将图像转换到频域使用适当的技术过滤噪声并使用反FFT将修改后的图像转换回空间域。通过理解和实现这些技术我们可以提高各种应用程序的图像质量。
https://avoid.overfit.cn/post/8768ec2a60a0456eab327abc33146508
作者Muhammad Ahmed