0.準備 |
---|
新しく作成したプロジェクトを右クリックし、[Pythonファイル]を選択して新しいPythonファイルを作成import cv2
し、最初にcv2ライブラリをインポートして、import numpy
名前をに変更しnp
ます。
import cv2
import numpy as np
また、OpenCVでは、座標軸の方向が右にx軸、下にy軸、座標原点が左上隅にあることも知っておく必要があります。たとえば、次の図は640ピクセルです。長さと幅480ピクセル。では、このセクションの調査を始めましょう。
1.水平スタッキング |
---|
npのhstack()水平スタックメソッドを呼び出します。パラメーターはスタックする画像であり、パラメーターの数はスタックする数です。
img=cv2.imread("Resources/lena.png")
imgHor=np.hstack((img,img))
cv2.imshow("Horizontal",imgHor)
cv2.waitKey(0)
入力したパラメータは(img、img)であるため、実行して効果を確認します。これにより、2つの元の画像が水平方向にステッチされます。
水平3に変更しました。imgHor=np.hstack((img,img,img))
2.垂直スタッキング |
---|
npのvstack()垂直スタックメソッドを呼び出します。パラメーターはスタックする画像であり、パラメーターの数はスタックする数です。
img=cv2.imread("Resources/lena.png")
imgVer=np.vstack((img,img))
cv2.imshow("Vertical",imgVer)
cv2.waitKey(0)
入力したパラメータは(img、img)であるため、実行して効果を確認します。これにより、2つの元の画像が垂直方向にスプライスされます。
同様に、3つの垂直方向に変更できます。imgVer=np.vstack((img,img,img))
3.画像スタックスタッキング |
---|
単にnumpy関数をスタックに使用する場合、異なるサイズや異なるチャネルの画像をスタックすることは不可能であるため、自分でスタック方法を実装する必要があります。以下は、目的の効果を実現できるテンプレートです。このコードを理解する必要はありません。私はそれを理解しているので、有用な情報を得ることができず、使用方法を知っているだけです。
def stackImages(scale,imgArray):
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range ( 0, rows):
for y in range(0, cols):
if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
else:
imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank]*rows
hor_con = [imageBlank]*rows
for x in range(0, rows):
hor[x] = np.hstack(imgArray[x])
ver = np.vstack(hor)
else:
for x in range(0, rows):
if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
else:
imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
hor= np.hstack(imgArray)
ver = hor
return ver
水平および垂直スタッキング
- この方法には、合計2つのパラメーターがあります。1つは元の画像のスケーリング比、0.5は1倍小さく、2は1倍大きいため、わかりやすくなっています。
- 2番目のパラメーターは、任意の行と任意の列に書き込むことができるイメージスタックのマトリックスであり、列の数は同じである必要があります。同じでない場合、マトリックスを形成できません。
- 以下のコードでは、2行の1次元行列を作成し、各行は3つの画像です。
img=cv2.imread("Resources/lena.png")
imgStcak=stackImages(0.5,([img,img,img],[img,img,img]))
cv2.imshow("ImgStack",imgStcak)
cv2.waitKey(0)
実行して効果を見てみましょう。
この方法では、異なるチャネルの画像を組み合わせることができると言われているため、つまり、グレースケール画像とカラー画像を積み重ねることができます。では、試してみましょう。
img=cv2.imread("Resources/lena.png")
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgStcak=stackImages(0.5,([img,imgGray,img],[img,img,img]))
cv2.imshow("ImgStack",imgStcak)
cv2.waitKey(0)
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
元のカラー画像を3チャンネルから1チャンネルのグレースケール画像に変換することです。次に、パラメータマトリックスのimgの1つを交換します。効果を確認するために実行してみましょう:
6番目のセクションの内容は非常にシンプルで興味深いものであり、人生で多くの用途があります。一度手を通り抜けて、一度手でノックするよりも、千回目を通したほうがいいですよ〜