OpenCV-Python:OpenCVでのIV画像処理
20画像ピラミッド
目標
•画像ピラミッドを学習する
•画像を使用して新しい果物を作成する:「オレンジアップル」
•学習する関数は次のとおりです:cv2.pyrUp()、cv2.pyrDown()。
20.1原則
通常の状況では、固定解像度の画像を処理する必要があります。ただし、場合によっては、同じ画像の異なる解像度のサブ画像を処理する必要があります。たとえば、顔など、画像内の特定のターゲットを検索する場合、画像内のターゲットのサイズはわかりません。この場合、解像度の異なる元の画像である画像のセットを作成する必要があります。この画像グループを画像ピラミッドと呼びます(つまり、同じ画像の異なる解像度のサブ画像のコレクションです)。最大の画像を下に、最小の画像を上に配置すると、ピラミッドのように見えるため、画像ピラミッドという名前が付けられます。
画像ピラミッドには、ガウスピラミッドとラプラスピラミッドの2種類があります。
ガウスピラミッドの上部は、下部の画像の連続する行と列を削除することで取得されます。上の画像の各ピクセルの値は、画像の次のレイヤーの5ピクセルのガウス加重平均に等しくなります。このようにして、一度にMxN画像がM / 2xN / 2画像になります。したがって、この画像の面積は元の画像の面積の4分の1になります。これはオクターブと呼ばれます。このような操作を継続的に実行すると、解像度が低下する画像ピラミッドが生成されます。関数cv2.pyrDown()およびcv2.pyrUp()を使用して、画像ピラミッドを構築できます。
関数cv2.pyrDown()は、高解像度の大きなサイズの画像から金の塔を構築します(サイズが小さくなり、解像度が低下します)。
img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)
下の写真は4層の画像ピラミッドです。
関数cv2.pyrUp()は、低解像度で小さいサイズの画像から金の塔を構築します(サイズは大きくなりますが、解像度は上がりません)。
higher_reso2 = cv2.pyrUp(lower_reso)
覚えておかなければならないのは、higher_reso2とhigher_resoは異なるということです。cv2.pyrDown()が使用されると、画像の解像度が低下し、情報が失われるためです。以下の画像は、関数cv2.pyrUp()を使用してcv2.pyrDown()から生成された画像ピラミッドの第3層(下から上)の画像です。解像度は元の画像よりもはるかに劣っています。
ラプラシアンピラミッドはガウスピラミッドで計算でき、式は次のとおりです。
Lapla Pyramidの画像は、多くのピクセルが0である境界マップのように見えます。それらはしばしば画像圧縮で使用されます。下の写真は、3階建てのラプラスピラミッドです。
20.2画像融合のためのピラミッドの使用
画像ピラミッドの1つのアプリケーションは、画像融合です。たとえば、画像のステッチでは、2つの画像を積み重ねる必要がありますが、接続された領域の画像ピクセルが不連続であるため、画像全体の効果が低く見えます。このとき、イメージピラミッドを使用でき、シームレスな接続を実現できます。ここでの典型的なケースは、2つの果物を1つにマージすることです。下の写真を見ると、私が話していることを理解できるかもしれません。
以下のその他のリソースを読むことで、画像融合とLaplacePyramidの詳細について詳しく知ることができます。
上記の効果を達成するための手順は次のとおりです。
- リンゴと文章の2つの画像で読む
- リンゴとオレンジのガウスピラミッドを構築する(6レベル)
- ガウスピラミッドに基づいてラプラシアンピラミッドを計算します
- ラプラスの各レイヤーで画像融合を実行します(リンゴの左側とオレンジの右側が融合されます)
- 元の画像は、マージされた画像ピラミッドに従って再構成されます。
import cv2
import numpy as np,sys
A = cv2.imread('apple.jpg')
B = cv2.imread('orange.jpg')
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpA[i])
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpB[i])
L = cv2.subtract(gpB[i-1],GE)
lpB.append(L)
# Now add left and right halves of images in each level
LS = []
for la,lb in zip(lpA,lpB):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]))
LS.append(ls)
# now reconstruct
ls_ = LS[0]
for i in xrange(1,6):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_, LS[i])
# image with direct connecting each half
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)
詳細については、公式アカウントに注意してください。