読者です 読者をやめる 読者になる 読者になる

Pythonの学習の過程とか

学習の記録をつけておきましょう。すぐ忘れるんだから。

Python OpenCVの基礎 addWeightedで画像の合成

2つの画像を読み込んで、それぞれの合成の割合を指定して1つの画像として表示することができます。

こんな感じの結果になります

f:id:PeaceAndHiLight:20160115235751j:plain

参考にしたのはこちら

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

f:id:PeaceAndHiLight:20160115235728j:plain

B.jpg

f:id:PeaceAndHiLight:20160111145317j:plain

重みと出力画像

Aに0.3 Bに0.7

f:id:PeaceAndHiLight:20160115235745j:plain

Aに0.5 Bに0.5

f:id:PeaceAndHiLight:20160115235751j:plain

Aに0.7 Bに0.3

f:id:PeaceAndHiLight:20160115235756j:plain

2016.1.17追記

Aに0.1 Bに0.1

f:id:PeaceAndHiLight:20160117215630j:plain

Aに1.0 Bに1.5

f:id:PeaceAndHiLight:20160117215635j:plain

Bの背景が白に近い部分は殆ど飛んでしまっていますね。 ということは、このaddWeightedの割合は輝度に対してかけてあるのかも知れないですね。