快速傅里叶变换凸显图像中的模糊的黑点(时域与频率的变换)

在很多情况下,我们需要检查出规则背景纹理下的深色点状的物质。但是由于背景纹理的影响,或者图片亮度不均匀,导致用普通的形态学分析很难达到目的。
那么,采用时域与频域之间进行变换的傅里叶变换(很多时候都会采用不包括振幅的相位变换的快速版本,即快速傅里叶变换,简称FFT,全称Fast Fourier Transform), 可以快速的凸显出不易发现的黑色点状像素点集。很多成熟的视觉算法库都会提供稳定且多样的傅里叶变换函数,比如OPENCV的有

np.fft.fft2
np.fft.fftshift
np.fft.ifftshift
np.fft.ifft2
f2_A = np.abs(f2shift) #取振幅
f2_P = np.angle(f2shift) #取相位

Halcon 的会有

rft_generic
convol_fft
fft_image
fft_image_inv

关于时域频域转换的傅里叶变换,教科书上有详细的理论推导,本文不再赘述。
那么本篇文章会以一个实例来验证快速傅里叶变换技术的高效与精准。
本实例采用Halcon编写,至于为什么用Halcon,是因为快速开发,变量可视化,哈哈哈哈哈。其实是我时间不够用,忙里偷闲写出了这一篇博客。
本文提供的用例照片如下:
原图是高清图片,不能上传,这是我截屏下来的。如果你们要用这张照片进行验证,把代码里的宽与高改成上面图片的宽与高即可。
本实例采用的一种负向的高斯带通滤波器,负向处理频域是为了凸显小黑点瑕疵,使它变成亮点,带通是为了提取图像中的边缘。
如果要说它的曲线的形状,应该是下面这样的。
在这里插入图片描述

以下为本实例用到的源代码。

dev_close_window ()
read_image (Image, '32.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 10, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (1)
*dev_set_color ('red')
* 
* Optimize the fft speed for the specific image size
optimize_rft_speed (Width, Height, 'standard')
* 
* Construct a suitable filter by combining two gaussian
* filters
Sigma1 := 10.0
Sigma2 := 3.0
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
//生成负向高斯带通滤波器,用以傅里叶快速变换

//Read an image and convert it to gray values
read_image (Image, 32+'.bmp')
rgb1_to_gray (Image, Image)
//Perform the convolution in the frequency domain
//fft_image (Image, ImageFFT1)
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
//将时域中的原图转为频域中的形态
convol_fft (ImageFFT, Filter, ImageConvol)
//在频域中对原图的频域形态进行卷积。
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
//将处理后的,处于频域形态的结果图转为时域形态。此时的结果图的像素是实数real的,有正有负。
//下面我们需要将实数real类型的图片转为位深为8的byte类型的0~255像素下的黑白图片。
min_max_gray (ImageFiltered, ImageFiltered, 0, Min, Max, Range1)
//计算一张图片的最大最小像素。
scale_image (ImageFiltered, ImageFiltered, 1, -Min)
//因为结果图像素值有正有负,我们需要将图片像素值都转为正的,即都增加-Min。
min_max_gray (ImageFiltered, ImageFiltered, 0, Min, Max, Range)
//计算一张图片的最大最小像素。
scale_image (ImageFiltered, ImageFiltered, 255/Max, 0)
//计算映射关系,将像素值对应到0~255上去。
convert_image_type (ImageFiltered, ImageConverted, 'byte')
//转换图像类型

在这里插入图片描述
那么我们就可以在上面这张结果图中,清楚的看见这个亮点。而这个亮点就对应原图中的那个比较模糊不易发现的暗点。

猜你喜欢

转载自blog.csdn.net/m0_47472749/article/details/119645379