【问题标题】:Bandpass filter of FFT applied image. (Like ImageJ bandpass filter algorithm)FFT 应用图像的带通滤波器。 (像 ImageJ 带通滤波器算法)
【发布时间】:2010-04-05 16:08:36
【问题描述】:

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

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

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

我正在编写 C++,并希望用 C++ 重写程序的那部分。

编辑1: 我需要了解它是如何进行平铺镜像操作的,可能是特殊的。实际上,起初它将图像转换为新大小的图像,所以对于我的图像,它将是: 从 600X480 转换为 1024X1024 大小的图像。 这里如何使用平铺?

编辑2: tileMirrored 函数的描述也很难理解:

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

编辑3: 我实现了那个带通滤波器,它给出了与原始程序相同的结果。 但是,原始程序中的算法本身(也在我的程序中)非常慢 我不想在我的程序中使用该过滤器一次,但每次调用它会计算大约 0.5 到 2 秒(取决于参数值)。 使用了 FHT 变换(不是 FFT),它比 FFT 更快吗? 我觉得filter本身没有优化,请看filterLargeSmall函数实现: source code

【问题讨论】:

  • 您想知道如何实现整个 Bandpass 功能,还是只是在边缘镜像和平铺的位?
  • 我需要了解这两个,但使用镜像平铺更重要,因为我认为其他事情更明显。我需要了解它是如何进行平铺镜像操作的,可能是特殊的。实际上,起初它将图像转换为新大小的图像,所以对于我的图像,它将是:从 600X480 转换为 1024X1024 大小的图像。这里如何使用平铺?

标签: image-processing filtering imagej


【解决方案1】:

我不知道该函数是如何工作的,但这是类似函数的基本算法:

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

  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行的像素。

可能有一些库可以使这更容易(即翻转和复制图像数据),但我不熟悉 C++,只要性能不是一个大问题,这应该很容易自己编写代码。小心尺寸奇数的图片的舍入问题:确保它们一致。

【讨论】:

  • 这似乎太正确了,至少它确定了将图像放在新尺寸图像中间的坐标。谢谢!我仍然会查看源代码,可能他们会做一些不同的事情。
猜你喜欢
  • 2015-11-04
  • 2013-10-07
  • 2015-10-22
  • 2015-05-09
  • 2023-04-10
  • 2015-07-10
  • 2015-03-05
  • 2019-04-09
  • 2017-01-05
相关资源
最近更新 更多