2

「FFT」を処理する前に、画像にハニング ウィンドウを適用したいと考えています。Ruben Bjorge によって書かれたスクリプトを見つけました。

number size, sizeX, sizeY, top, left, bottom, right, ii, posX, posY  
image front, hannX, hannY, hann, avg, hannout

front := GetFrontImage();
GetSize(front, sizeX, sizeY);
GetSelection(front, top, left, bottom, right);      

// Create Hanning window.
ii = 1;
hannX := CreateFloatImage("", (right-left), (bottom-top));
hannX = 0;
hannX[0, 0, 1, (right-left)] = 1 - cos( 2 * Pi() * icol / (right-left));
while( ii < (bottom-top) )
{
hannX[ii, 0, 2*ii, (right-left)] = hannX[0, 0, ii, (right-left)];
ii = ii * 2;
}

ii = 1;
hannY := CreateFloatImage("", (right-left), (bottom-top));
hannY = 0;
hannY[0, 0, (bottom-top), 1] = 1 - cos( 2 * Pi() * irow / (bottom-top));
while( ii < (right-left) )
{
hannY[0, ii, (bottom-top), 2*ii] = hannY[0, 0, (bottom-top), ii];
ii = ii * 2;
}

hann = hannX * hannY;

// Subtract average from image.
avg = front - Average(front);

// Multiply with Hanning window.
hannout = avg[top, left, bottom, right] * hann;

// Do fast Fourier transform and display image.
fft = RealFFT(hannout);

このスクリプトを使用すると、FFT のキャリブレーション スケールが 1 に変更されます。ただし、下の図に示されているように、0.11948 である必要があります。

ここに画像の説明を入力 ここに画像の説明を入力

私の質問は: 画像のキャリブレーション スケールを変更せずにハニング ウィンドウを適用する方法はありますか?

または、元の画像のスケールに関してFFT画像のスケールを計算する方法は?

私のスクリプトの残りの部分では、fft 画像の正しい縮尺が必要なので、誰かがこの長い質問に答えてくれれば幸いです。ありがとう。

4

2 に答える 2

3

DM 画像表現でキャリブレーション情報を保持するための鍵は、画像参照と、画像オブジェクトのクローンに対するインプレース操作を可能な限り使用することです。次のように、このような手法を使用するようにスクリプトを変換すると、サンプル スクリプトがはるかに単純で効率的になります。

Image frontImage := GetFrontImage();

// Step 1 - extract and get info about the front image selection
Image frontSelection := frontImage[];
Number selW = ImageGetDimensionSize(frontSelection, 0);
Number selH = ImageGetDimensionSize(frontSelection, 1);

// Step 2 - subtract average value from selection and apply Hanning window
Image filteredSelection := ImageClone(frontSelection);
filteredSelection -= Average(frontSelection);
filteredSelection *= (1 - cos(2 * Pi() * icol / selW));
filteredSelection *= (1 - cos(2 * Pi() * irow / selH));
String selectionName = ImageGetName(frontImage) + " filtered selection";
ImageSetName(filteredSelection, selectionName);

// Step 3 - take FFT of filtered selection and display result
Image filteredFFT := RealFFT(filteredSelection);
ShowImage(filteredFFT);

ここでの主な違いは、ステップ 1 とステップ 2 とマークされた 2 つのセクションにあります。

ステップ 1 では、このスクリプトは、選択演算子 '[ ]' を使用して正面の画像選択に直接アクセスします。このオペレーターは、元の画像のキャリブレーション (およびタグ) 情報を保持します。

ステップ 2 では、ImageClone 関数は、選択した画像オブジェクトの完全なコピーを、そのキャリブレーション (およびタグ) データを含めて作成します。次の 3 行は、複製された選択範囲に対して直接、数学的な処理を行います。特に、ハニング ウィンドウ係数は、結果イメージのすべてのピクセルに自動的に適用される 1 つのイメージ式で非常に簡単に適用されることに注意してください。サンプル スクリプトで使用されている while ループは必要ありません。コードが複雑になるだけでなく、これらは 1 行の画像式によって行われる暗黙のループよりも大幅に遅くなります。実際、ハニング ウィンドウは、次のように、x 依存因子と y 依存因子の両方を含む 1 行で適用できます。

filteredSelection *= (1-cos(2*Pi() * icol/selW)) * (1-cos(2*Pi() * irow/selH));
于 2016-08-19T19:45:28.120 に答える
1

あなたの主な質問は、DM 画像オブジェクトに対して数学演算を実行するときのキャリブレーション情報の伝播についてです。簡単に言うと、等号を使用した単純な割り当てを使用した場合、そのような情報と、画像に添付されたすべてのタグ データは結果の画像に転送されません。このような各イメージ式は、新しい実イメージ (キャリブレーション、タグ、または名前なし) を効果的に割り当て、そのピクセル値のみが結果イメージ (デフォルトでは、キャリブレーションされていない名前のない実イメージでもあります) に転送されます。

このスクリプトで必要なことをより簡単かつ効率的に実行する方法はいくつかあります (これを示すために 2 番目の回答を投稿します) が、目的の結果を得るために最小限の変更は、最後の行を次の 3 行に置き換えることです。

ImageCopyCalibrationFrom(hannout, front);
Image fft := RealFFT(hannout);
ShowImage(fft);

最初の行は、元の正面画像から、実際にキャリブレーションされたフーリエ変換が必要なフィルター処理された画像にキャリブレーションを転送します。2 行目では、':=' 演算子を使用して、イメージ変数 'fft' が RealFFT 関数の出力を直接指すようにします。これにより、そのキャリブレーション情報が保持されます。つまり、これはイメージ式ではなく、参照による代入であり、中間および最終結果に対するデフォルトの (キャリブレーションされていない) 実イメージの割り当てをバイパスします。3 行目に実際に結果が表示されます (サンプル コードには含まれていないようです)。

于 2016-08-19T19:01:17.513 に答える