2

私が必要としている優れた関数があり、これは Java プログラムで実装されています: ImageJ. そこで使われているアルゴリズムを理解する必要があります。この関数にはいくつかのパラメーターがあります: リンク テキスト

また、FFT を使用する前に、画像を特別な画像に変換します。バンドパス フィルターは、特別なアルゴリズムを使用してエッジ アーティファクトを減らします (フーリエ変換の前に、元の画像の外側にある画像部分のミラーリングされたコピーを添付することで画像のサイズが拡張されるため、ジャンプはありません)。エッジで発生します)

この特別な変換について詳しく教えてください。実際に鏡像をタイリング。

私は C++ で書いていますが、プログラムのその部分を C++ で書き直したいと思っています。

EDIT1:ミラーリングされたイメージ操作をどのように行うかを理解する必要があります。それは特別なものかもしれません。実際には、最初は画像を新しいサイズの画像に変換するので、私の画像では、600X480 から 1024X1024 サイズの画像に変換します。ここでタイルはどのように使用されますか?

EDIT2:また、この tileMirrored 関数の説明を理解するのは難しいです:

ImageProcessor (ROI) を、サイズが幅 x 高さ y の新しい ImageProcessor の位置 (x,y) に配置します。画像は、FFT の影響を回避するために、そのエッジの周りがミラーリングされます。「... 位置 (x,y) で幅 x 高さ y のサイズ」とはどういう意味ですか?

EDIT3: そのバンドパス フィルターを実装したところ、元のプログラムと同じ結果が得られました。しかし、元のプログラム (私のプログラムでも) のアルゴリズム自体は非常に遅いです。プログラムでそのフィルターを一度も使用したくないのですが、呼び出しごとに約 0.5 から 2 秒を計算します (パラメーター値によって異なります)。FHT 変換 (FFT ではない) が使用されていますが、FFT よりも高速ですか? フィルタ自体が最適化されていないと思います。filterLargeSmall 関数の実装: ソース コードを参照してください。

4

1 に答える 1

1

その関数がどのように機能するかは正確にはわかりませんが、同様の関数の基本的なアルゴリズムは次のとおりです。

  1. 画像の2つの次元の大きい方(xSizeとySizeと呼びます)よりも大きい2の最小の累乗(newSizeと呼びます)を決定します。

  2. newSizeでサイズnewSizeの新しい正方形の画像を作成し、画像の内容を新しい画像の中央にコピーします(つまり、画像の左上はで始まる必要があります(newSize / 2 - xSize / 2, newSize / 2 - ySize / 2))。

  3. (x、y)の各ピクセルについて、残りのピクセルを次のように入力します。

    • の場合、列と行のyx < (newSize / 2 - xSize / 2)のピクセルをコピーします。(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x
    • の場合、行と列のxy < (newSize / 2 - ySize / 2)のピクセルをコピーします。(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
    • 上記の両方が当てはまる場合は、列(newSize / 2 - xSize / 2) + (newSize / 2 - xSize / 2) - x、行のピクセルをコピーします(newSize / 2 - ySize / 2) + (newSize / 2 - ySize / 2) - y
    • の場合、列と行のyx > (newSize / 2 + xSize / 2)のピクセルをコピーします。(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - x
    • の場合、行と列のxy > (newSize / 2 + ySize / 2)のピクセルをコピーします。(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y
    • 上記の両方が当てはまる場合は、列(newSize / 2 + xSize / 2) + (newSize / 2 + xSize / 2) - xと行のピクセルをコピーします(newSize / 2 + ySize / 2) + (newSize / 2 + ySize / 2) - y

これを簡単にするライブラリ(つまり、画像データの反転とコピー)はおそらくありますが、私はC ++に精通しておらず、パフォーマンスが大きな問題でない限り、これは自分でコーディングするのはかなり簡単です。奇数の画像の丸めの問題に注意してください。一貫性があることを確認してください。

于 2010-04-05T17:08:56.497 に答える