元の画像:
(含まれている画像は.png画像であるため、表示用の保存/アップロードに追加の歪みは追加されていません)
私は「数学の波紋」の 20ページからD4変換を使用しました。これは基本的に次の5つのステップです。
フォワードd4:
c1 = √3 / 4.0 ;
c2 = (√3 - 2) / 4.0 ;
s[ IEVEN ] += √3 * s[ IODD ] ;
s[ IODD ] -= c1*s[ IEVEN ] + c2*s[ IPREVEVEN ] ;
s[ IEVEN ] -= s[ INEXTODD ] ;
s[ IEVEN ] *= ( √3 - 1 ) / √2 ;
s[ IODD ] *= ( √3 + 1 ) / √2 ;
逆:
c1 = √3 / 4.0 ;
c2 = (√3 - 2) / 4.0 ;
s[ IODD ] *= ( √3 - 1 ) / √2 ;
s[ IEVEN ] *= ( √3 + 1 ) / √2 ;
s[ IEVEN ] += s[INEXTODD] ;
s[ IODD ] += c1*s[ IEVEN ] + c2*s[IPREVEVEN] ;
s[ IEVEN ] -= √3 * s[ IODD ] ;
double
C ++の精度値を使用して、これをコンパイルして実行しています。これを画像の行で実行し、次に列で実行します。粗いフィルターアルゴリズムを使用して、画像の差分係数の最低90%を削除します。
フィルタリングアルゴリズムは次のとおりです。
- 変換された画像全体を(一連の数値として)実行します
- 最大の差分係数(
maxVal
)を見つける(2D画像全体で) - の
minValToSurvive
1%として選択しmaxVal
ます。 - 差分係数の大きさが未満の場合は
minValToSurvive
、ゼロになります。
これが私の問題です。最も低い差分係数の83%のみを画像から削除すると(minValToSurvive = 0.01 * maxVal)、次のようになります。
正規化された
正規化手順を削除した場合:
s[ IEVEN ] *= ( √3 - 1 ) / √2 ; // REMOVE
s[ IODD ] *= ( √3 + 1 ) / √2 ;
(fwd変換とreverse変換の両方で)、コンポーネントの90%を削除した後の結果ははるかに優れています(はるかに少ないノイズ)
だから私は2つの問題の1つを考えることができます:
- (√3-1)/√2の係数で画像を正規化すると精度が落ちる
- 正しくフィルタリングしていません
それとも私は間違っていますか?フィルタリング(重要でないコンポーネントの削除)を誤って行っている場合、フィルタリングするためのより良い方法は何ですか?浮動小数点精度の場合、すべてのステップで変換を正規化しないでください。