FFT应用图像的带通滤波器。 (像ImageJ带通滤波器算法)

时间:2010-04-05 16:08:37

标签: image-processing filtering imagej

我需要一个很好的功能,它在Java程序中实现:ImageJ。 我需要了解那里使用的算法。 该函数有几个参数: link text

在使用FFT之前,它将图像转换为特殊图像: 带通滤波器使用特殊算法来减少边缘伪影(在傅里叶变换之前,通过在原始图像之外附加图像部分的镜像副本来扩展图像,因此边缘不会发生跳跃)

你能告诉我更多关于这种特殊变换的信息吗? 实际上是平铺镜像。

我正在编写C ++,并希望在C ++上重写该部分程序。

EDIT1: 我需要了解它是如何进行平铺镜像操作的,可能是特殊的操作。实际上,它首先将图像转换为新尺寸的图像,因此对于我的图像,它将是: 从600X480转换为1024X1024大小的图像。 如何在这里使用平铺?

EDIT2: 另外很难理解tileMirrored函数的这种描述:

将ImageProcessor(ROI)放入位置(x,y)的大小为宽x高y的新ImageProcessor中。图像围绕其边缘进行镜像,以避免FFT的环绕效应。 什么是“......大小宽度x高度y在位置(x,y)。”?

EDIT3: 我实现了带通滤波器,它提供了与原始程序相同的结果。 但是,原始程序(也在我的程序中)的算法本身非常慢 我想在我的程序中不使用该过滤器,但每次调用大约需要0.5到2秒(取决于参数值)。 有一个FHT变换(不是FFT),它比FFT快吗? 我认为过滤器本身没有优化,请参阅filterLargeSmall函数实现: source code

1 个答案:

答案 0 :(得分:1)

我不确切知道该功能是如何工作的,但这是类似功能的基本算法:

  1. 确定两个(称为newSize)的最小功率大于图像两个维度中较大的一个(称为xSize& ySize)。

  2. 通过newSize创建大小为newSize的新方形图像,并将图像的内容复制到新图像的中心(即图像的左上角应从(newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)开始)。

  3. 对于(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行的像素。
  4. 有些库可以使这更容易(即翻转和复制图像数据),但我不熟悉C ++,只要性能不是一个大问题,这应该很容易编码。小心对于具有奇怪维度的图像的舍入问题:确保它们是一致的。

相关问题