14

2D 画像配列をスケーリングする最良の方法は何ですか? たとえば、1024 x 2048 バイトの画像があり、各バイトがピクセルであるとします。各ピクセルは 0 から 255 までのグレースケール レベルです。この画像を任意の倍率でスケーリングして、新しい画像を取得できるようにしたいと考えています。したがって、画像を 0.68 倍に拡大すると、サイズが 0.68*1024 x 0.68*2048 の新しい画像が得られるはずです。一部のピクセルは互いに折りたたまれます。そして、たとえば 3.15 倍に拡大すると、ピクセルが複製された大きな画像が得られます。それで、これを達成するための最良の方法は何ですか?

次に、0 から 360 度 (0 - 2Pi) の範囲で任意の角度で画像を回転できるようにしたいと考えています。回転後の画像のトリミングは問題ではありません。これを行う最良の方法は何ですか?

4

10 に答える 10

16

画像の拡大縮小と回転には多くの方法があります。スケーリングする最も簡単な方法は次のとおりです。

dest[dx,dy] = src[dx*src_width/dest_width,dy*src_height/dest_height]

ただし、これにより、サイズを大きくするとブロック状の効果が生じ、サイズを小さくすると詳細が失われます。バイリニア フィルタリングなど、見栄えの良い結果を生成する方法があります。

回転の場合、回転行列を使用して src ピクセル位置を計算できます。

sx,sy = M(dx,dy)

ここで、M は宛先ピクセルをソース イメージにマップする行列です。繰り返しますが、ブロックのない結果を生成するには、補間を行う必要があります。

ただし、画像処理の数学に取り組みたくない場合は、利用可能なライブラリがたくさんあります。

于 2008-11-18T16:40:10.597 に答える
11

あなたがしているのは、入力ポイントのセットを出力ポイントのセットにマッピングすることです。問題の最初の部分は、サイズ変更または回転のマッピングを決定することです。2番目の部分は、ピクセル境界上に正確に存在しないポイントを処理することです。

サイズ変更のマッピングは簡単です。

x' = x * (width' / width)
y' = y * (height' / height)

回転のマッピングは少し難しいだけです。

x' = x * cos(a) + y * sin(a)
y' = y * cos(a) - x * sin(a)

グリッドから外れたピクセルの値を決定する手法は、補間と呼ばれます。そのようなアルゴリズムは数多くあり、速度と最終的な画質の範囲が広くなっています。品質/時間の昇順でそれらのいくつかは、最近傍、双一次、双三次、およびSincフィルターです。

于 2008-11-18T17:00:46.500 に答える
9

これを実現する簡単な方法はありません。スケーリングも回転も簡単なプロセスではありません。

したがって、2D イメージング ライブラリを使用することをお勧めします。マジック ++は、divideandconquer.se が指摘するようにアイデアになる可能性がありますが、他にもあります。

于 2008-11-18T16:38:19.620 に答える
8

自分で汚い仕事をしたいですか、それともImageMagickが代わりにやってくれますか?

于 2008-11-18T16:34:56.943 に答える
4

ピクセルの複製または破棄は、結果にピクセル化とギザギザが表示されるため、最良の方法または画像のサイズ変更ではありません。最良の結果を得るには、画像をリサンプリングする必要があります。これにより、結果の画像がより滑らかに見えます。バイリニア、バイキュービック、ランツォなど、リサンプリングの方法はたくさんあります。

wxWidgetsのResampleBicubic関数を見てください。グレースケールだけでなく、あらゆる種類の画像で機能しますが、ニーズに合わせて調整できるはずです。次に、VirtualDubからのリサンプリングコードもあります。Google Codesearchは、より関連性の高いコードを明らかにする可能性があります。

編集:リンクはプレビューでは問題なく表示されますが、投稿すると壊れます。これは奇妙です。google codesearchにアクセスし、「wxwidgetsresamplebicubic」と「virtualdubresample」をそれぞれクエリして、同じ結果を取得します。

于 2008-11-18T16:56:40.923 に答える
2

CxImageは、画像を処理するための無料のライブラリであり、必要な処理を実行できます。些細なこと以外は個人的に使ったことはありませんが、何度もお勧めしているのを見てきました。

于 2008-11-18T17:08:37.017 に答える
0

CxImageのサイズ変更メソッドは、奇妙な結果を生成します。Resample関数とResample2関数を使用し、利用可能なすべての内挿法のバリエーションで同じ結果が得られました。たとえば、白い色で塗りつぶされた1024x768の画像のサイズを802x582に変更してみてください。画像には、白とは異なる色のピクセルがあることがわかります。これを確認できます。サイズ変更された画像をWindowsペイントで開き、黒色で塗りつぶしてみます。結果はきっとあなたを楽しませるでしょう。

于 2010-08-19T14:21:29.163 に答える
0

Intel Performance Primitivesを確認してください。以前に使用したことがあり、x86 でほぼ最適なパフォーマンスが得られます。さまざまなアルゴリズムを試すことができるテスト プログラムもあります。

于 2012-02-15T17:48:20.617 に答える
-1
point scaling(point p,float sx,float sy) {
    point s;

    int c[1][3];
    int a[1][3]={p.x,p.y,1};
    int b[3][3]={sx,0,0,0,sy,0,0,0,1};

    multmat(a,b,c);

    s.x=c[0][0];
    s.y=c[0][1];

    return s;
}
于 2009-08-04T15:19:59.863 に答える