OpenCVで画像を縦、横に連結する

20200917_F-4-550.jpg

F-4 ファントム戦闘機 航空自衛隊Webページより。
日本の防空を長らくになってくれたF-4ファントム戦闘機です。
そろそろ退役か、すでにしてしまったという感じでしょうか。

さて、今回はPythonを使い、OpenCVで画像を横方向に連結、縦方向に連結ということをnumpyと
比較しつつ、試してみたいと思います。
numpyではおなじみのhstack, vstack機能です。


Pythonサンプルプログラム

import numpy as np
import cv2

# 画像読込
f2image =cv2.imread('f-2-320.jpg', cv2.IMREAD_COLOR)
f35image =cv2.imread('F-35-320.jpg', cv2.IMREAD_COLOR)
f15image =cv2.imread('F-15.jpg', cv2.IMREAD_COLOR)

# OpenCV

# OpenCVで画像を縦に結合
limg = cv2.vconcat((f35image, f2image))

# OpenCVで画像を横に結合
ocv_concatimage = cv2.hconcat((limg, f15image))

# 画像表示
cv2.imshow('opencv concat image', ocv_concatimage)
cv2.waitKey(0)

# numpy

# 画像を縦に結合
rimg = np.vstack((f35image, f2image))

# 画像を横に結合
tconcatimage = np.hstack((f15image, rimg))

# 画像表示
cv2.imshow('numpy concat image', tconcatimage)
cv2.waitKey(0)

前半部分が、OpenCVで後半がnumpyで処理をしています。

OpenCV 画像結合

  • vconcat() - 縦結合
  • hvoncat() - 横結合

引数で指定するとき、タプルで括ってあげないとうまく動きませんでした。
画像サイズが合っていなくても、うまく動かず、良く分からない動きをします。

numpy 画像結合

  • vstack() - 縦結合
  • hstack() - 横結合

引数で指定するとき、画像をタプルで括るのは定番です。


動作環境

Windows Anaconda
Python 3.8.5
OpenCV 4.0.1
numpy 1.19.1



試行

下記入力画像を縦、横に接続します。

入力画像① F-15
20200917_F-15.jpg

入力画像② F-35
20200917_F-35-320.jpg

入力画像③ F-2
20200917_f-2-320.jpg

(画像は、航空自衛隊Webページよりダウンロードして、縮小して使用しています。)

始めに入力画像② F-35入力画像③ F-2を縦連結します。


OpenCV 縦連結画像(vconcat)④
20200917_limg.jpg

OpenCV vconcat()の実行結果です。


次に縦連結画像④入力画像① F-15を横連結します。


OpenCV 横連結画像(hconcat)
20200917_OpenCV画像結合結果

こんな感じでよくできたかと思います。


numpy 連結結果画像(参考)
20200917_numpy画像結合結果

参考までにnumpy vstack(), hstack()の結合結果も掲載しておきます。
OpenCVと混じらないように、F-15が左側にくるように配置しています。


感想

特に難しいことも無いと思いますが、分からないといろいろ不便と思い書いて見ました。
分からないと事前に、最終形態の画像領域を取得して、そこに転記する形で作るかと思います。
実行速度などを考えるとそちらの方が速いと思いますが、手軽さや検討段階では
画像連結、結合を使った方がいいのかなとも思います。

ちなみにいうと画像だけではなく、データの行列などでも使えます。


修正・加筆

  • 2021/04/20 修正
    IntersectionObserver’s による画像のオフスクリーン遅延読み込み処理に変更。
    IE11未対応。



参考



写真引用

F-4 ,F-2,F-15,F-35戦闘機写真 航空自衛隊Webページより


#画像処理

関連記事
スポンサーサイト



コメント

非公開コメント