KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるaddWeightedとは?定義から活用法を徹底解説!?

OpenCVで使われるaddWeightedとは?定義から活用法を徹底解説!?

今回はOpenCVで使われるaddWeightedに関して、定義から活用法を徹底解説致します。addWeightedに関して詳しく知りたい、活用法を通してaddWeightedに関して学びを深めたい方へおすすめです。

目次
  1. OpenCVで使われるaddWeightedとは?
  2. addWeighted関数を利用して画像が合成される仕組み
  3. OpenCVで使われるaddWeighted関数の定義
  4. まとめ
  5. 参考文献

執筆者 - おすすめの記事3選

OpenCVで使われるaddWeightedとは?

OpenCVで使われるaddWeightedとは、2つの画像を、1つの画像へ合成するための関数です。難しい言葉で言うと、画像をアルファブレンドすると言います。

具体的なイメージとしては、以下の「addWeighted関数のイメージ画像」箇所を、イメージしてもらうと良いでしょう。

【サンプル画像1】

【サンプル画像2】

【addWeighted関数のイメージ画像】

addWeighted関数を利用して画像が合成される仕組み

早急にaddWeighted関数の定義から利用法を知りたい方は、次章で紹介する「OpenCVで使われるaddWeighted関数の定義」からご確認ください。

addWeighted関数では、以下の4ステップを経て、画像の合成を行います。

  1. 2枚の画像を用意します。(今回は画像1, 画像2とします。)
  2. 画像1, 画像2内の、同じ位置のある画素に注目します。(画素に関しては、以下の「画素に関する説明を行う画像」を参照ください。以下の「画像1, 画像2内の、同じ位置のある画素に注目」画像の赤色箇所を、ある画素とします。)
  3. 係数(alpha) x 画像1のある画素の値 + 係数(beta) x 画像2のある画素の値を演算して、画素の合成を行います。(係数(alpha)の値を0.3, 係数(beta)の値を0.5とすると、40 * 0.3 + 112 * 0.5 = 68が合成後のある画素の値になります。)
  4. 2~3を繰り返します。

【画素に関する説明を行う画像】

1枚の画像は、複数の画素の集まりで成り立っています。

【画像1, 画像2内の、同じ位置のある画素に注目画像】

OpenCVで使われるaddWeighted関数の定義

addWeighted関数は

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# addWeighted関数 : 2つの画像を、1つの画像へ合成するための関数。
5# addWeighted関数 - 公式ドキュメント : https://docs.opencv.org/3.4/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a19
6
7# ※ dstの値は引数の値に応じて以下のように計算される。
8# dst = img1 * alpha + img2 * beta + gamma
9
10# 第一引数(必須) : 多次元配列(画像情報1)
11
12# 第二引数(必須) : alpha。第一引数の画像へ掛け合わせる係数。
13# 係数とは? : http://kentiku-kouzou.jp/suugaku-keisuu.html
14
15# 第三引数(必須) : 多次元配列(画像情報2)
16
17# 第四引数(必須) : beta。第三引数の画像へ掛け合わせる係数。
18
19# 第五引数(必須) : gamma。画素の値を微調整するために利用する。
20
21# 戻り値 : 多次元配列(画像情報)
22
23################################## 
24# 注意事項 #######
25# ※ オーバーフローが発生した場合、誤った結果を得られることがあります。
26# オーバーフローとは? : https://e-words.jp/w/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC.html#:~:text=%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%81%AF%E3%80%81%E3%81%82%E3%81%B5%E3%82%8C%EF%BC%88%E3%82%8B,%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AA%E3%81%A9%EF%BC%89%E3%82%92%E6%8C%87%E3%81%99%E3%80%82
27# ※ 2つの画像サイズ + タイプが同じである必要があります。print(img1.shape, img2.shape), print(type(img1), type(img2))して、値が等しいことをご確認ください。
28# xxx.shape : 画像サイズを調べる。
29# type(xxx) : 画像タイプを調べる。
30# ※ resize(画像サイズを変更する)について : https://kuroro.blog/python/KznX7CJ9axPuNSYBQN6m/
31##################################
32dst = cv2.addWeighted(img1, alpha, img2, beta, gamma)

で定義されます。

例えば以下のようなコードを作成すると、

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img1 = cv2.imread("xxx.jpg")
9img2 = cv2.imread("xxx.jpg")
10
11# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
12if img1 is None:
13    sys.exit("Could not read the image.")
14
15# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
16if img2 is None:
17    sys.exit("Could not read the image.")
18
19# addWeighted関数 : 2つの画像を、1つの画像へ合成するための関数。
20
21# 第一引数(必須) : 多次元配列(numpy.ndarray)
22# 第二引数(必須) : alpha。第一引数の画像へ掛け合わせる係数。
23# 第三引数(必須) : 多次元配列(numpy.ndarray)
24# 第四引数(必須) : beta。第三引数の画像へ掛け合わせる係数。
25# 第五引数(必須) : gamma。画素の値を微調整するために利用する。
26output = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
27
28# imwrite : 画像の保存を行う関数
29# 第一引数 : 保存先の画像ファイル名
30# 第二引数 : 多次元配列(numpy.ndarray)
31# <第二引数の例>
32# [
33# [
34# [234 237 228]
35# ...
36# [202 209 194]
37# ]
38# [
39# [10 27 16]
40# ...
41# [36 67 46]
42# ]
43# [
44# [34 51 40]
45# ...
46# [50 81 60]
47# ]
48# ]
49# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
50cv2.imwrite('output.jpg', output)

以下の画像のように、画像が描画されます。

imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

まとめ

  • OpenCVで使われるaddWeightedとは、2つの画像を、1つの画像へ合成するための関数
  • 難しい言葉で言うと、画像をアルファブレンドすると言う。

参考文献

記事に関するお問い合わせ