つれづれなる備忘録

日々の発見をあるがままに綴る

OpenCVの使い方20 ~ 画像ピラミッド1

 今回はOpenCVを用いた画像ピラミッドの生成方法にについて紹介する。

1. ガウシアンピラミッドによる低解像化

今回は以下のりんごの画像を用いる。

labs.eecs.tottori-u.ac.jp

まずりんごの画像を読み込み変数srcとして画像ピラミッドの効果を確認する。

import cv2
import numpy as np
from matplotlib import pyplot as plt
from google.colab import files
uploaded_file = files.upload()
uploaded_file_name = next(iter(uploaded_file))
print(uploaded_file_name)

orig = cv2.imread(uploaded_file_name)
src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
plt.imshow(src)
plt.title('Original')

"Apple"
Apple

ガウシアンピラミッドは、画像の画素数を縦横半分(全体では1/4)にする際に、周辺(5画素)画素値にガウシアンで重みづけして低解像度画像を作成する。 低解像度画像を作成するにはcv2.pyrDown()を用いる。

lower_reso = cv2.pyrDown(src)
plt.imshow(lower_reso)
plt.title('Lower Resolutions')

512x512のりんごの画像から256x256の低解像度のりんごの画像が生成される。

"Apple(低解像度)"
Apple(低解像度)

繰り返しガウシアンピラミッドを適用することでさらに低解像度の画像が得られる。 256x256の画像に再びcv2.pyrDown()を適用することで128x128の画像が得られる。

lower_reso2 = cv2.pyrDown(lower_reso)
plt.figure(figsize=(12,15))
plt.subplot(1,3,1)
plt.imshow(src)
plt.title('Original')
plt.subplot(1,3,2)
plt.imshow(lower_reso)
plt.title('1st pyramid')
plt.subplot(1,3,3)
plt.imshow(lower_reso2)
plt.title('2nd pyramid')

"ガウシアンピラミッド画像比較"
ガウシアンピラミッド画像比較

2. ガウシアンピラミッドによるアップサンプリング

 低解像化した画像をアップサンプリングする場合はcv2.pyrUp()を使用する。

higher_reso = cv2.pyrUp(lower_reso)
plt.imshow(higher_reso)
np.shape(higher_reso)
>(512, 512, 3)

256x256の低解像画像をアップサンプリングすると元の512x512の画素数に戻っていることが確認できる。 ただし、cv2.pyrDown()で低解像化する際にガウシアンで重みづけによるぼけが発生するため、低解像化した画像をcv2.pyrUp()で元の画素数に戻してもぼけた画像になっている。

higher_reso2 = cv2.pyrUp(cv2.pyrUp(lower_reso2))
plt.figure(figsize=(8,12))
plt.subplot(1,2,1)
plt.imshow(src)
plt.title('Original')
plt.subplot(1,2,2)
plt.imshow(higher_reso2)
plt.title('Upsampling x 2')

cv2.pyrDown()を2回適用したlower_reso2に対して2回アップサンプリングして128x128から512x512に戻したhigher_reso2を比較すると若干ぼけていることが確認できる。

"アップサンプリング"
アップサンプリング

3. ラプラシアンピラミッド

ラプラシアンピラミッドはガウシアンピラミッドにより1段階低解像化された画像をcv2.pyrUp()によりアップサンプリングした画像と元の画像との差分をとった画像で、輪郭をとったような画像になる。

2段階低解像化した128x128のラプラシアンピラミッドは3段階低解像化した64x64画像をcv2/pyrUp()で128x128にした画像との差分により得られる。

lower_reso3=cv2.pyrDown(lower_reso2)
lap_pyr=cv2.subtract(lower_reso2,cv2.pyrUp(lower_reso3))
plt.imshow(lap_pyr)

"ラプラシアンピラミッド"
ラプラシアンピラミッド

4. まとめ

 今回はガウシアンピラミッドとラプラシアンピラミッドの画像の生成方法について紹介した。次回はこれらピラミッド画像を応用した画像ブレンディングについて紹介する。