OpenCVに習熟した3時間(6)-画像のスタック

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番目のセクションの内容は非常にシンプルで興味深いものであり、人生で多くの用途があります。一度手を通り抜けて、一度手でノックするよりも、千回目を通したほうがいいですよ〜

おすすめ

転載: blog.csdn.net/qq_42257666/article/details/122921829