画像の拡大

例えば、下図のように2x2画素の画像を4x4の画像に拡大する場合、アフィン変換を使えばいいんでしょ!と、安易に考えていると、思わぬ落とし穴があったりもします。

画像の拡大

大事なポイントとして、

●画像の座標の原点は左上の画素の中心が原点(0.0、0.0)となる。(例外もあります)

画像の拡大

●アフィン変換の拡大縮小は原点を基準として拡大縮小される。

となります。

これを気にせず、ただ、アフィン変換で画像を2倍に拡大すると、左上の画素の中心を基点に画像が拡大されます。

画像の拡大

これで、一見良さそうにも感じるのですが、拡大後の画像において、画素の中心が原点であることから、4x4画素の領域は下図の四角で示した領域であり、画像全体が左上に0.5画素ズレた状態になっていまいます。

画像の拡大

アフィン変換で画像を拡大する時の変換前と変換後の状態は、以下のようになるのが正解です。

画像の拡大

この変換をアフィン変換で実現するには以下のように行います。

変換前の状態

画像の拡大

①画像全体を右下に(+0.5,+0.5)画素移動
画像の拡大 $$\begin{pmatrix} 1 & 0 & 0.5 \\ 0 & 1 & 0.5 \\ 0 & 0 & 1 \end{pmatrix}$$

②画像を2倍に拡大

画像の拡大 $$\begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{pmatrix}$$

③画像全体を左上に(-0.5,-0.5)画素移動

画像の拡大 $$\begin{pmatrix} 1 & 0 & -0.5 \\ 0 & 1 & -0.5 \\ 0 & 0 & 1 \end{pmatrix}$$

となります。

この一連の変換をアフィン変換行列であらわすと

$$\begin{pmatrix} { x }^{ ‘ } \\ { y }^{ ‘ } \\ 1 \end{pmatrix}=\begin{pmatrix} 1 & 0 & -0.5 \\ 0 & 1 & -0.5 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0.5 \\ 0 & 1 & 0.5 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix}\\ \\ $$

$$\begin{pmatrix} { x }^{ ‘ } \\ { y }^{ ‘ } \\ 1 \end{pmatrix}=\begin{pmatrix} 2 & 0 & 0.5 \\ 0 & 2 & 0.5 \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ 1 \end{pmatrix}\\ \\ $$

となり、単に拡大のアフィン変換行列だけを掛ければOKでは無いことが分かります。

ちなみに、C#で2x2画素の画像をPictureBoxのSizeModeプロパティをZoomにして、ImageプロパティにBitmapを設定すると、このようになります。

画像の拡大

なんとなく、画像が左上にズレているようで、なんか怪しい!!

【関連記事】

【C#】画像の座標系
画像を描画するにはDrawImageメソッドを用いますが、DrawImageメソッドはいくつものオバーロードが定義されていますが、画像の拡大...
アフィン変換
画像の拡大縮小、回転、平行移動などをまとめて3×3の行列を使って変換する事をアフィン変換と呼びます。 変換前の座標を(x, y...
画素の補間(Nearest neighbor,Bilinear,Bicubic)
画像を拡大や回転する場合など、画像の画素と画素の間の輝度値を参照する必要が出てきますが、その参照方法を紹介します。 この画素を画素の間を参...
画像の回転
画像を回転する場合、任意点周りの回転移動でも紹介したように回転行列を使って、例えば、画像の中心周りに画像を回転させると、下図のように回転後の...

画像処理のためのC#へ戻る

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

関連記事

関連記事

関連記事
スポンサーリンク

コメント

  1. poka より:

    間違っていると思います。
    拡大で、原点(0, 0) が (0.5, 0.5) になるはずがありません。
    原点は不動点であるはずです。これでは、座標計算ができません。

    そもそも、画素を「マス目」で考えていることが、間違いのもとだと思います。
    画素は「点」で考えるべきだと思います。