2017年11月30日 更新

Pythonを使ったずれ補正

プログラミング言語,pythonを用いて画像のずれ補正を行いました.

21,888 view お気に入り 0
ズレ補正を行う画像

ズレ補正を行う画像

今回は,a.png を基準とした際,b.png および c.png のズレを求め,補正するという操作を行います.処理の内容を説明すると,

①OpenCVで画像をグレースケールにて取得,
②cv2.phaseCorrelate を用いて,位相限定相関を計算し,ズレを計算する,
③cv2.warpAffine を用いて,ズレの分だけ画像を移動する,

となります.実装は以下に記載しています.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import cv2

filename_li = ["a.png", "b.png", "c.png"]
img_li = []
for i in filename_li:
    img = cv2.imread(i, 0)    # 第二引数を 0 にすることでグレースケールで読み込む
    img_float = np.float32(img)    # cv2.phaseCorrelate で指定されている型に変換
    img_li.append(img_float)
    

dxdy_li = []
for img in img_li[1:]:
    d, etc = cv2.phaseCorrelate(img, img_li[0])    # d にx方向およびy方向のズレが格納されている
    dx, dy = d
    dxdy_li.append([dx, dy])
    
rows, cols = img_li[0].shape
img_after_li = [img_li[0]]
for dxdy, img in zip(dxdy_li, img_li[1:]):
    dx, dy = dxdy
    M = np.float32([[1, 0, dx],[0, 1, dy]])
    img = cv2.warpAffine(img, M, (cols,rows))
    img_after_li.append(img)
    
fig = plt.figure(figsize = (6, 6))    

subplot_li = [321, 323, 325]
for subplot, img in zip(subplot_li, img_li):
    ax = fig.add_subplot(subplot)
    ax.imshow(img)

subplot_after_li = [322, 324, 326]
for subplot_after, img_after in zip(subplot_after_li, img_after_li):
    ax = fig.add_subplot(subplot_after)
    ax.imshow(img_after)

plt.savefig('test.png', format = 'png', dpi=300)
plt.show()
Pythonによる実装.py
処理前後の画像

処理前後の画像

結果として,このような画像が得られます.円が画像の中心に移動していることが分かります.この手法は,今回のような簡単な図以外でも使用できるので,興味がある方はぜひ挑戦してみて下さい.
3 件

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

Pythonで画像処理② Data Augmentation (画像の水増し)

Pythonで画像処理② Data Augmentation (画像の水増し)

画像の水増し、Data Augmentationと呼ばれる方法になりますが、学習に使う画像に変形を加えたり、ノイズを加えたり、明るさを変えたりといった処理を行う方法を紹介します。学習画像に様々な処理を行うことで認識がロバストになるというメリットがあります。
Mochizuki | 93,715 view
LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第5位〜第1位までです。
LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第15位〜第11位までです。
医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

今回は、画像位置合わせに用いられるアフィン変換をご紹介します。
木田智士 | 19,177 view
Pythonで学ぶOpenCV③〜機械学習のk近傍法を使ってデータのクラス分けをしてみた〜

Pythonで学ぶOpenCV③〜機械学習のk近傍法を使ってデータのクラス分けをしてみた〜

今回はOpenCVを使って機械学習の一つであるk近傍法を実装し、irisデータの分類を行ってみたいと思います。

この記事のキーワード

この記事のキュレーター

井上 大輝 井上 大輝