如何使用AddBandPassMaskToImage()方法?

问题描述 投票:0回答:1

我正在尝试使用 dm 脚本将带通滤波器应用于图像,以滤除噪声像素。我可以使用

AddBandPassMaskToImage()
方法来完成此任务吗?它仅适用于
RealImage
数据类型,并且它返回的过滤图像中间有一个大的黑色圆形带。如何正确使用?

AddBandPassMaskToImage( ImageReference mask, Number x_center, Number y_center, Number
band_radius_1, Number band_radius_2, Number filter_length, Boolean do_inverse )

我的代码和结果图像如下。我没想到过滤后的图像中会出现任何黑带。我怀疑我错误地使用了该方法,但由于掩码适用于

RealImage
数据类型而不是
ComplexImage
数据类型,我认为我不需要对 FFT 执行任何操作。

image front = GetFrontImage()
number xsize, ysize, zsize
get3dsize(front, xsize, ysize, zsize)
image frontCopy := front
AddBandPassMaskToImage(frontCopy, xsize/2, ysize/2, 5, 154, 1, 0)
showImage(frontCopy)

我没有发布图片的声誉,但链接如下:

应用该方法之前

FFT 之前

应用该方法后

FFT 后

image-processing fft dm-script bandpass-filter
1个回答
0
投票

一般来说,我建议使用过滤器面板来设置(命名)过滤器,然后将它们与

IFMApplyFilter
命令一起使用,正如 F1 帮助文档中脚本示例的 Filtering 部分中所述:

F1 help on filtering

命令

AddBandPassMaskToImage
只是向图像添加平滑的环形零到一值部分,以帮助在傅立叶空间中创建带通掩模。然后需要应用(乘以)掩模来减弱强度,然后再将图像反向转换到真实空间。

realimage img := RealImage( "Test Image 2D", 4, 512, 512 )
img = abs( itheta*2*icol/(iwidth+1)* sin(iTheta*20)  ) 
img = PoissonRandom(100*img)
img.ShowImage()

// Transform
compleximage img_FFT := FFT(img)

// Modify in F-Space
// Build mask
image mask:=RealImage("Mask in F-Space",4,512,512)
mask.AddBandPassMaskToImage( 256, 256, 200, 40, 10, 0 )
mask.ShowImage()

//Apply mask
img_FFT *= mask
img_FFT.SetName( "Masked FFT" )
img_FFT.ShowImage()

// Transform back
image img_filter := modulus(iFFT(img_FFT))
img_filter.SetName("Filtered")
img_filter.ShowImage() 

EGUPerformActionWithAllShownImages("arrange")

Example of Fourier-filtered image

© www.soinside.com 2019 - 2024. All rights reserved.