2

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

在使用 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 更快吗?我觉得filter本身没有优化,请看filterLargeSmall函数实现: 源码

4

1 回答 1

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),则复制第 y 列(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x和第 y 行的像素。
    • 如果y < (newSize / 2 - ySize / 2),则复制第 x 行(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y和第 x 列的像素。
    • (newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x如果以上两个都为真,则复制 column , row处的像素(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
    • 如果x > (newSize / 2 + xSize / 2),则复制第 y 列(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x和第 y 行的像素。
    • 如果y > (newSize / 2 + ySize / 2),则复制第 x 行(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y和第 x 列的像素。
    • 如果以上都为真,则复制 column(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x和 row的像素(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y

There are probably libraries that will make this easier (ie. flipping and copying image data), but I am not familiar with C++, and this should be pretty easy to code yourself as long as performance isn't a huge issue. Be careful of rounding issues for images with odd dimensions: make sure they're consistent.

于 2010-04-05T17:08:56.497 回答