一連のムービーフレームから正弦波アーティファクトを削除する


7

非常に周期的なアーチファクトによって汚染された一連のムービーフレームで構成されるデータセットの事後分析を行っています。このアーティファクトをフレームから削除したいと思います。

プロットを簡単にするためにM、ピクセル値の配列をに再形成し、[nframes, npixels]すべてのピクセル値を平均して1Dベクトルを作成しましたm。以下は、この信号が時間領域でどのように見えるかです。拡大されたインセットでは、振動がはっきりとわかります。

ここに画像の説明を入力してください

次に、を使用してピリオドグラムを作成し、周波数に対してFm = rfft(m)プロットabs(Fm)**2しました。約1.5 Hzに非常に鋭いピークが見られます。

ここに画像の説明を入力してください

時間の周期性だけでなく、このアーチファクトの空間成分も弱いようです。正確なピーク周波数値では、フレームのx軸全体で位相が滑らかに変化するように見えるため、右は左のピクセルより遅れる傾向があります:

ここに画像の説明を入力してください

力ずくのアプローチとして、1.5Hzを中心とするノッチフィルターを使用して、時間領域の各ピクセルをフィルターに掛けてみました。臨界周波数1.46および1.52Hzの4次バターワースフィルターを使用しました(フィルターの設計に精通していないため、より適切な選択肢があると確信しています)。

フィルタリング後の平均ピクセル信号は次のようになります。 ここに画像の説明を入力してください

そして対応するピリオドグラム: ここに画像の説明を入力してください

ノッチフィルターは、アーティファクトを減らすのにかなり良い仕事をしますが、基本的には純粋な定常正弦波のように見えるので、周波数空間のその部分を単に減衰させるよりも上手く行けると思います。

私の最初の(非常に素朴な)アイデアは次のようなことをすることでした:

  1. ムービーの各ピクセルのフーリエスペクトルから振動の周波数、位相、振幅を取得します
  2. 時間領域で振動を再構築する
  3. 映画のフレームからそれを引く

干渉は通常スペクトル的に純粋ではなく、一時的に静止していないため、これは通常人々が行うことではないことを理解していますが、私の場合はそれが理にかなっているのではないでしょうか。

データ

フル16ビットTIFFスタック(非圧縮2GB以下)

空間的に間引かれた8ビットバージョン(約35MB非圧縮)


一連のムービーフレームから始めて、PSDを正確に生成する方法をより明確に説明できますか?
Tarin Ziyaee 2013

@ user4619は非常に大雑把です-各フレームについて、平均ピクセル値を計算してベクトルを生成しましたx。次にFx = rfft(x)、を取得し、次のように出力を取得しますabs(Fx)**2
ali_m

2次元フレームがあり、平均の1次元ベクトルを生成します。Xに沿って?yに沿って?
Tarin Ziyaee 2013

@ user4619 xとyの両方に沿って-ムービーをnframes x npixels配列に再形成し、すべてのピクセルで平均化します
ali_m

わかりました、その詳細をありがとう-それは分析で重要です。この情報を投稿に追加してください。
Tarin Ziyaee 2013

回答:


1

提案された解決策-FFTのピークに基づいて時間領域で正弦波を計算し、それを引く-は機能するはずですが、基本的に同じことを行う簡単な方法があります。変身。

したがって、ラスタライズされたビデオのM[nframes, npixels]場合、アーティファクトを保持する周波数ビンを見つけ、それを体系的にフラット化します(たとえば、その大きさを隣接ピクセルの平均に設定します)。

import numpy as np
nframes, npixels = np.shape(M)
# Identify the bin containing the sinusoidal artifact
# Use the average intensity for each image
m = np.mean(M, axis=1)
# Calculate the FFT
Fm = np.fft.rfft(m)
# Find the largest bin away from the low-frequency region
lowfreq = 100  # or something
badbin = lowfreq + np.argmax(Fm[lowfreq:]**2)

# Now adjust the amplitude of that bin in the FFT of each pixel
for pixel in range(npixels):
   Fpix = np.fft.rfft(M[:, pixel])
   # Scale magnitude of artifact bin to be the mean of its neighbors
   Fpix[badbin] *= np.mean(np.absolute(Fpix[[badbin-1, badbin+1]]))/np.absolute(Fpix[badbin])
   # Rewrite the time sequence of that pixel
   M[:,pixel] = np.fft.irfft(Fpix)

これは、アーティファクトが正確に一定の振幅と周波数であり、その周波数がシーケンス長の約数(つまり、FFTで表される正弦波)に該当する場合に機能します。一般に、badbin少し広いナローバンド破損のセットに対処するために、1つまたは2つのビンを両側で平坦化することができます。

# ...

   # Scale magnitude of artifact binS to be the mean of neighbors
   spread = 3  # flatten bins from (badbin - (spread-1)) to (badbin + (spread-1))
   # target value for new bins
   targetmag = np.mean(np.absolute(Fpix[[badbin-spread, badbin+spread]]))
   bins = range(badbin - (spread-1), badbin + spread)
   Fpix[bins] *= targetmag/np.abs(Fpix[bins])
   # ...

各ピクセルから削除されたコンポーネントが、平均強度で検出されたアーチファクトの同じ周波数と位相を持つように制限したい場合badbin、その位相への大きさの投影だけを削除できます。たとえば、

badbinphase = np.angle(Fm[badbin])
# ...

   Ncomponent = np.abs(Fpix[badbin])*np.cos(np.angle(Fpix[badbin]) - badbinphase)
   Fpix[badbin] -= Ncomponent * np.exp(0+1j * badbinphase)
   # ...

結果のコンポーネントはbadbin常にbadbinphaseすべてのピクセルのグローバルから常に90 \ deg位相シフト(直交)することに注意してください。その周波数と位相の信号コンポーネントは、アーチファクトから分離できません。


それは本質的に私がすでにノッチフィルターでやっていることではないですか?ただし、このアプローチは、削除しようとしている振動の位相に関する情報を考慮に入れていないため、まだ理想的ではないと思います。同じ周波数帯域に入る「本物の」信号に影響を与えることなく、アーティファクトを選択的に削除することが可能であるように思えます。
ali_m 14年

それは正確にはあなたがしたことではありません。最初に、それははるかに狭いノッチです。次に、バターワースフィルターとは異なり、位相の歪みが発生しません。変更前後のFFTを差し引くと、ある振幅を持つ単一の非ゼロ成分と、元のスパイクの位相が得られます。これは、時間領域で削除する信号です。つまり、スペクトルピークの周波数と位相で振幅が一定の正弦波です。基礎となる信号にこの領域のエネルギーがある場合、推定ではノイズとして表示されますが、洗い流される必要があります。
dpwe 2014年

すべてのピクセルに同じフェーズを適用することを意図していたと思いますので、それを私の答えに追加しました。ただし、それは魔法ではありません。信号とノイズの同相成分を分離することはできないため、推定されるアーティファクトから90 \ degずれた残差が常に残ります。
dpwe 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.