Python OpenCVの基礎 addWeightedで画像の合成
2つの画像を読み込んで、それぞれの合成の割合を指定して1つの画像として表示することができます。
こんな感じの結果になります
参考にしたのはこちら
Operations on Arrays — OpenCV 2.4.12.0 documentation
Calculates the weighted sum of two arrays. 2つの画像(配列)に対し、それぞれに重みを付けて合計するということですね。
addWeighted
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
Parameters(パラメータ)
src1 – first input array.
alpha – weight of the first array elements.
src2 – second input array of the same size and channel number as src1.
beta – weight of the second array elements.
dst – output array that has the same size and number of channels as the input arrays.
gamma – scalar added to each sum.
dtype – optional depth of the output array; when both input arrays have the same depth, dtype can be set to -1, which will be equivalent to src1.depth().
src1とそれに対する割合のalpha、src2とそれに対する割合のbetaを指定し、全体のgammaを指定すればいいみたいですね。
cv2.addWeighted(src1, alpha, src2, beta, gamma)がいちばんシンプルな書き方です。
2つの画像は同じ大きさにすること
画像サイズ(配列サイズ)が異なっていた場合にはエラーになります。気をつけましょう。
shapeを使って画像の大きさが同じことを確認しておく
(459, 710, 3)
(459, 710, 3)
なんとも中途半端な数字で申し訳ありませんが、両者の画像サイズは同じで、3色カラーだという確認ができました。
ではaddWeightedを使って画像をミックスしていきます。
ここも非常に簡単ですね。画像配列を指定し、それに対して重みをかけています。
0.3, 0.5, 0.7を使って合計が1.0になるように2つの画像の重みを変えています。
あれ?たとえばこれが合計で1.0にならなかったり、1.0を超えてしまったらどうなるのだろうか?
あとで調べておきます、すみません。
2016.1.17追記
調べました。
そもそも2つを合成する割合ではなく、あくまでも重みなので、合計が1.0である必要はありません。 合計が0.2だろうが2.5だろうが、それぞれに指定された重みをかけているだけですね。
ちなみに小さすぎても画像は真っ暗になるし、大きすぎると色が飛んだ感じになります。
結果を見てみよう
非常にわかりやすいサンプルになっていると思います。
入力画像
A.jpg
B.jpg
重みと出力画像
Aに0.3 Bに0.7
Aに0.5 Bに0.5
Aに0.7 Bに0.3
2016.1.17追記
Aに0.1 Bに0.1
Aに1.0 Bに1.5
Bの背景が白に近い部分は殆ど飛んでしまっていますね。 ということは、このaddWeightedの割合は輝度に対してかけてあるのかも知れないですね。