2010-04-05 244 views
2

我需要一個很好的函數,它在Java程序中實現:ImageJ。 我需要了解那裏使用的算法。 該函數具有幾個參數: link textFFT應用圖像的帶通濾波器。 (像ImageJ帶通濾波器算法)

並且使用FFT之前將它轉換圖像以一個特殊的一個: 帶通濾波器使用一種特殊的算法,以減少邊緣僞影(傅立葉變換之前,將圖像的大小由擴展將圖像部分的鏡像副本附加在原始圖像之外,因此在邊緣處不會發生跳躍)

您能告訴我更多關於這種特殊轉換的信息嗎? 其實平鋪鏡像的圖像。

我正在寫C++,並希望在C++上重寫程序的這一部分。

EDIT1: 我需要了解它是如何做到平鋪鏡像的操作,可能是特殊的。實際上,首先它會將圖像轉換爲新尺寸的圖像,因此對於我的圖像來說,它將是:從600X480轉換爲1024X1024尺寸圖像的 。 這裏如何使用瓷磚?

EDIT2: 此外,它是很難理解tileMirrored功能的這樣的描述:

提出ImageProcessor(ROI)成大小爲寬度x高度y的新ImageProcessor在位置(x,y)的。圖像在其邊緣被鏡像以避免包圍FFT的效果。 什麼是「位置(x,y)處尺寸寬度x高度y」的意思。「?

編輯3: 我實現了這個帶通濾波器,它給出了與原始程序相同的結果。 但是,算法本身在原始程序(也在我的程序中)非常慢 我想在程序中不使用該過濾器,但每次調用大約需要0.5到2秒(取決於參數值)。 有一個FHT變換(不是FFT),它比FFT快嗎? 我覺得自己不是最優化的過濾器,請參閱filterLargeSmall功能實現: source code

+0

你想知道如何實現整個帶通功能,或者只是位於邊緣的鏡像和瓦片? – tloflin 2010-04-05 16:17:18

+0

我需要了解兩者,但平鋪與鏡像更重要,因爲其他事情我認爲更明顯的那一個。 我需要了解它是如何平鋪鏡像的圖像操作,可能是特殊的。實際上,首先它會將圖像轉換爲新尺寸的圖像,因此對於我的圖像來說,它將是:從600X480轉換爲1024X1024尺寸圖像的 。 這裏如何使用瓷磚? – maximus 2010-04-05 16:24:21

回答

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 < (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++,這應該是很容易,只要自己編寫的性能ISN這不是一個大問題。注意奇數維圖像的四捨五入問題:確保它們一致。

+0

看起來太正確了,至少它確定了將圖像放置到新尺寸圖像中間的座標。 謝謝!我仍然會看看來源,也許他們會做一些不同的事情。 – maximus 2010-04-06 00:13:42