我需要一个很好的功能,它在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
答案 0 :(得分:1)
我不确切知道该功能是如何工作的,但这是类似功能的基本算法:
确定两个(称为newSize)的最小功率大于图像两个维度中较大的一个(称为xSize& ySize)。
通过newSize创建大小为newSize的新方形图像,并将图像的内容复制到新图像的中心(即图像的左上角应从(newSize / 2 - xSize / 2, newSize / 2 - ySize / 2)
开始)。
对于(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 ++,只要性能不是一个大问题,这应该很容易编码。小心对于具有奇怪维度的图像的舍入问题:确保它们是一致的。