2017年7月5日 更新

現役JDと学ぶ画像処理入門①〜openCV入門〜

openCV入門(画像の読み込み、表示、保存、線形変換、拡大縮小)

50,392 view お気に入り 1
続いて回転移動です。
#回転の中心を決定 ここでは画像の中心に合わせている
center = (int(width/2),int(height/2))

#変換行列の決定 (回転の中心、回転角度、拡大率)
rotMat = cv2.getRotationMatrix2D(center, 15, 1)

#画像を回転 (入力画像の配列、変換行列、出力画像サイズ)
rotated_image = cv2.warpAffine(rgb_image, rotMat, (width,height))
plt.imshow(rotated_image)
rotate.py
rotated_image

rotated_image

ここで試しにrotMatの中身を見てみると、2行3列の行列が表示されるはずです。これがwarpAffineメソッドに代入された変換行列の正体です!
つまり、このメソッドは元のimageの行列にいいかんじの行列をかけあわせて、目的の行列を出力していた、ということになります。この変換をアフィン変換と呼び、これからその中身について少し詳しく見ていきたいと思います。
 (4055)

(x,y)を原点中心にθ回転させた点を(x',y')とします。
求めたいのは二点の関係式です
 (4056)

(x',y')と(x,y)の間には左の関係式が成り立ちます。
 (4057)

 (4058)

 (4063)

上の関係式より、[x,y,1]に掛け合わせるべき行列は左のようになります。
ここで3行目は[0,0,1]で固定なので上の二行だけを指定すればよく、warpAffineメソッドの2つ目の引数にはこの行列を渡せば良いということになります。
平行移動の時にM =[[1,0,100],[0,1,50]]としたのは、上の式にθ=0,a=100,b=50を代入したわけです。
すっきりしていただけたでしょうか??

③resizeメソッドを用いた画像の拡大&縮小

では最後に画像の拡大と縮小をさらっとやって終わりにしましょう!
まずは画像の拡大から!
#画像を拡大 (入力画像の配列、出力サイズ、fx =横軸方向拡大率、fy=縦軸方向拡大率、interpolation =補間方法の指定)
zoomed_image = cv2.resize(rgb_image, None, fx=2.0, fy=2.0, interpolation = cv2.INTER_LINEAR )
plt.imshow(zoomed_image)
zoom!.py
zoomed_image

zoomed_image

はい、簡単ですね!ちなみに最後の引数のinterpolationは、私もよくわからないのですが公式サイトによると
・INTER_NEAREST:最近傍補間
・INTER_LINEAR:バイリニア補間(デフォルト)
・INTER_AREA:ピクセル領域の関係を利用したリサンプリング.画像を大幅に縮小する場合は,モアレを避けることができる良い手法です.しかし,画像を拡大する場合は, INTER_NEAREST メソッドと同様になります
・INTER_CUBIC:4x4 の近傍領域を利用するバイキュービック補間
・INTER_LANCZOS4:8x8 の近傍領域を利用する Lanczos法の補間
だそうです!デフォはINTER_LINEARなそうなので特に気にしないで良いと思います.
詳しくは以下の記事をご覧ください.
53 件

関連する記事 こんな記事も人気です♪

Pythonで画像処理 マスク処理

Pythonで画像処理 マスク処理

Pythonで画像を操作する方法を簡単に解説しています。
望月 優輝 | 24,604 view
Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

画像処理の一つ,モルフォロジー変換をPython と OpenCVのライブラリを用いて実装し,それを2値画像に対して適用します.
等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

前回の記事「等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 1」の続きです. 実際に実装をして,写像を確かめてみます.
画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -

画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -

画像処理のセグメンテーションの分野で用いられるLevel set 法を用いて画像のセグメンテーションを行います.
画像の一部を消すInpainting という技術とその実装 (python)

画像の一部を消すInpainting という技術とその実装 (python)

Python + OpenCVにより,画像の修復の技術,「Inpainting 」の実装を行います.

この記事のキーワード

この記事のキュレーター

広部ゆりか 広部ゆりか