傅里叶变换去除背景纹理

*此案例可以去除背景纹理
*利用傅里叶变换,并且构造合适的滤波器,消除图像中特定的频率,这些特定的频率代表着特定的纹理特征
dev_update_off ()
dev_close_window ()
Scale := 0.3
MinGray := 50

read_image (Image, ‘E:/Image_20220418154921287.bmp’)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width * Scale, Height * Scale, ‘black’, WindowHandle)
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (Image)
disp_message (WindowHandle, ‘Original image’, ‘window’, 12, 12, ‘black’, ‘true’)
*

  • 优化傅里叶变换速度
  • optimize_fft_speed (Width, Height, ‘standard’)

*我们主要使用’fft_generic’ ‘sqrt’和’dc_center’
*用于可视化目的。
*为了加速程序,应该使用rft_generic;
*但当然,峰值检测算法必须是
*在这种情况下调整。
fft_generic (Image, ImageFFT, ‘to_freq’, -1, ‘sqrt’, ‘dc_center’, ‘complex’)
dev_open_window (0, Width * Scale + 7, Width * Scale, Height * Scale, ‘black’, WindowHandle1)
dev_set_color (‘red’)
dev_set_draw (‘margin’)
set_display_font (WindowHandle1, 14, ‘mono’, ‘true’, ‘false’)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (ImageFFT)
disp_message (WindowHandle1, ‘Fourier spectrum’, ‘window’, 12, 12, ‘black’, ‘true’)
disp_cont_message (WindowHandle1, ‘black’, ‘true’)
stop ()
*

  • 检测光谱中最显著的八个峰,这些波峰代表着图像中背景纹理的频率
    *把这些波峰找出来,抑制掉,就可以实现消除背景纹理的目的
    power_real (ImageFFT, PowerSpectrum)
    binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
    threshold (ImageSmooth, Region, 100, 100000)
    connection (Region, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 49.11, 1058.04)
    union1 (SelectedRegions, RegionUnion)
    reduce_domain (ImageSmooth, RegionUnion, ImageReduced)
    local_max (ImageReduced, LocalMaxima)

*下一步,检测一个八度高的峰值,即,在两倍
*最显著峰值的频率
shape_trans (LocalMaxima, RegionTrans, ‘convex’)
*以两倍频率构建ROI波段,利用缩放2.1-1.9,得到2倍波峰
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_scale (HomMat2DIdentity, 2.1, 2.1, Height / 2, Width / 2, HomMat2DScale)
affine_trans_region (RegionTrans, RegionTrans1, HomMat2DScale, ‘nearest_neighbor’)
hom_mat2d_scale (HomMat2DIdentity, 1.9, 1.9, Height / 2, Width / 2, HomMat2DScale)
affine_trans_region (RegionTrans, RegionTrans2, HomMat2DScale, ‘nearest_neighbor’)
difference (RegionTrans1, RegionTrans2, RegionDifference)
*提取两倍频率的峰值
reduce_domain (ImageSmooth, RegionDifference, ImageReduced)
threshold (ImageReduced, Region, 15, 100000)
reduce_domain (ImageSmooth, Region, ImageReduced)
local_max (ImageReduced, LocalMaxima2)
*
*合并两个八度的峰,并扩大他们
*将相关频率整合到滤波器中
union2 (LocalMaxima, LocalMaxima2, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 15.5)
*把找到的波峰抑制,在频域内把这些区域灰度Paint为0
paint_region (RegionDilation, ImageFFT, ImageFFTFiltered, 0, ‘fill’)
dev_display (ImageFFT)
dev_display (RegionDilation)
disp_message (WindowHandle1, ‘Frequencies of the\nbackground texture’, ‘window’, 12, 12, ‘black’, ‘true’)
disp_cont_message (WindowHandle1, ‘black’, ‘true’)
stop ()
*
*应用过滤器并显示结果,反傅里叶变换,显示抑制背景后的空间域图像
fft_generic (ImageFFTFiltered, ImageFiltered, ‘from_freq’, 1, ‘sqrt’, ‘dc_center’, ‘byte’)
dev_display (ImageFiltered)
disp_message (WindowHandle1, ‘Filtered image’, ‘window’, 12, 12, ‘black’, ‘true’)
*
dev_open_window (0, 2 * (Width * Scale) + 14, Width * Scale, Height * Scale, ‘black’, WindowHandle2)
set_display_font (WindowHandle2, 14, ‘mono’, ‘true’, ‘false’)
dev_set_part (0, 0, Height - 1, Width - 1)
*原图减去经过傅里叶变换和滤波处理后的图,得到背景纹理图像
sub_image (Image, ImageFiltered, ImageTexture, 1, 128)
dev_display (ImageTexture)
disp_message (WindowHandle2, ‘Removed texture’, ‘window’, 12, 12, ‘black’, ‘true’)

disp_cont_message (WindowHandle2, ‘black’, ‘true’)
stop ()
效果图如下:
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值