带通滤波器的FFT应用的图像。(像ImageJ带通滤算法)
-
24-09-2019 - |
题
有一个功能良好,我需要,这是实现在Java程序:ImageJ.我需要了解所使用的算法。函中有几个参数:链接文本
和以前使用FFT它转换成图像为一个特殊的一:带通滤波器使用一种特殊的算法,以减少边缘项目(前的傅里叶变换,像是扩大小通过附加的镜像副本的图像部以外的原始图像,因而没有跳出现在边缘)
你能告诉我更多关于这个特别的变换?实际上镜切片图像。
我写在C++,并希望重写程序的一部分在C++。
EDIT1:我需要了解它是如何做的切片中的镜像的图像操作,也可以是特殊的一个。实际上在第一个转换图像到一个新型的图像,使用我的照片,它将:皈依从600X480到1024X1024大小的图像。怎么切片是用在这里?
EDIT2:也很难理解这说明tileMirrored功能:
把ImageProcessor(ROI)进入一个新的ImageProcessor的尺寸宽x高度y position(x,y)。像是镜像其周围的边缘,以避免绕影响的FFT。"是什么意思...的尺寸宽x高度y position(x,y)。"?
EDIT3:我实现的,带通滤波器,它提供了同样的结果作为原始程序。但是,算法本身在原来的程序(还在我的节目)是非常缓慢 我要用于过滤器的不只一次在我的程序,但计算约为0.5至2秒每个电话(这取决于参数值)。有用的一个FHT变换(不FFT),这是更加迅速比FFT?我认为,该过滤器本身不是最优化,请参阅filterLargeSmall功能的执行情况:源代码
解决方案
我不知道究竟如何,这一职能的工作,但这基本的算法对一个类似的功能:
确定最小的力量的两个(称它newSize)是较大的比较大的两个方面的图像(电话他们xSize&ySize).
创建一个新场图像的大小newSize通过newSize和复制的内容图像的中心,新的图像(ie。左上的图像应该开始在
(newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)
).填补剩余的像素,如下所示,每一像素at(x,y):
- 如果
x < (newSize / 2 - xSize / 2)
, 复制素在列(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x
和行y。 - 如果
y < (newSize / 2 - ySize / 2)
, 复制素在行(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
和列x。 - 如果上述两个是真实的复制素在列
(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x
, 排(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
. - 如果
x > (newSize / 2 + xSize / 2)
, 复制素在列(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x
和行y。 - 如果
y > (newSize / 2 + ySize / 2)
, 复制素在行(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y
和列x。 - 如果上述两个是真实的复制素在列
(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x
和行(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y
.
- 如果
有可能是库,这将使这个更容易(即。翻阅和复印象数据),但是我不熟悉C++,这应该是很容易代码自己作为长期业绩不是一个巨大的问题。小心四舍五入问题的图像奇怪的尺寸:确定他们是一致的。