OpenCV-Python画像のオーバーレイと融合、cv2.addとcv2.addWeightedの違い



Opencv Python Image Overlay



Python画像のオーバーレイと融合、cv2.addとcv2.addWeightedの違い

目的
画像の加算、減算、ビット演算
学習関数cv2.add()、cv2.addWeighted()

添加:
cv2.add()を使用して2つの画像を追加するには、numpyで行列の追加を使用します。ただし、opencvでの加算は飽和演算です。つまり、上限があり、numpyは結果を変調します。



#画像への追加
#大まかに2つのタイプがあります:
#cv2.add():これは飽和操作です
#+:これはNumpyでの操作、モード操作、res = img1 + img2
#2つの画像のサイズが同じであるか、2番目の画像がスカラーであることに注意してください
#2つの違いにより、通常はcv2.add(src1、src2)を使用します。


要約すると、opencvを使用する効果はより優れています



img1=cv2.imread('1.jpg') img2=cv2.imread('2.jpg') res = cv2.add(img1,img2)

元の画像
画像
画像
追加後の結果
画像

画像ブレンディング(フュージョン、画像の透明度を設定できます)
実際には追加であり、異なる重量のプロポーションの混合物であり、混合または透明な感触を与えます
式は次のとおりです
g(x)=(1 −α)f0(x)+αf1(x)#a→(0,1)異なる値は異なる効果を達成できます

これで、最初の画像の重みは0.7、2番目の画像の重みは0.3になり、cv2.addWeighted()関数を使用して混合されます。



img1=cv2.imread('1.jpg') img2=cv2.imread('2.jpg') dst=cv2.addWeighted(img1,0.7,img2,0.3,0)

混合結果
画像

ビット演算(質問:グラフを別のグラフに配置する方法、追加すると色が変わり、ブレンドは透明になります)

ビット演算にはxorがあり、またはありません。ビット演算は、部分的な画像を抽出して非保持領域の投資収益率を選択する場合に非常に便利です。次の例は、画像の特定の領域を変更することです。
opencvのロゴを別の画像に配置します。足し算を使うと色が変わります。ブレンディングを使用すると透明になりますが、透明は必要ありません。保持エリアの場合roi方式は使用できますが、保持されません。以下はビット演算を使用しています。

import cv2 import numpy as np # img1 = cv2.imread('2.jpg') img2 = cv2.imread('1.jpg') rows,cols,channels = img2.shape roi = img1[0:rows, 0:cols ] Img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) # Grayscale the image Ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)#ret is the threshold (175)mask is the binarized image Mask_inv = cv2.bitwise_not(mask)#Get the area of ​​the logo in reverse. Bitwise operation Img1_bg = cv2.bitwise_and(roi,roi,mask = mask)#On img1, set the logo area and mask to 0. # Take the value of the pixel in roi that corresponds to the value that is not zero in mask_inv. The other value is 0. # put the logo in the picture Img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)#Get the pixel information of the logo Dst = cv2.add(img1_bg,img2_fg)#Additional img1[0:rows, 0:cols ] = dst cv2.imshow('res',img2_fg) cv2.waitKey(0) cv2.destroyAllWindows()

サンプルのアイデアは巧妙で、ロゴの背景は黒で、簡単に抽出できます。
最初にしきい値を設定し、ロゴを2値化して、ロゴ領域の範囲を取得します。
背景画像のロゴ領域のピクセル情報を0に設定します。
ロゴのピクセル情報を背景画像のピクセルに追加します
最後にこの効果
画像

運動
スライドのような写真を作成し、別の写真にスムーズに移行します(奉節が劉亦菲になるのと同様)

import cv2 import numpy as np def nothing(x): pass img1 = cv2.imread('1.jpg') img2 = cv2.imread('2.jpg') # Create a black background window img = np.zeros((500,500,3), np.uint8) cv2.namedWindow('image') cv2.createTrackbar('a','image',0,100,nothing) while(1): cv2.imshow('image',img) k = cv2.waitKey(1) & 0xFF if k == 27: break r = cv2.getTrackbarPos('a','image') r=float(r)/100.0 img=cv2.addWeighted(img1,r,img2,1.0-r,0) cv2.destroyAllWindows()

画像

import cv2 import numpy as np import time step_list = [0.02 * x for x in range(0, 51)] img1 = cv2.imread('1.jpg') img2 = cv2.imread('2.jpg') cv2.imshow('show', img1) for i in step_list: res = cv2.addWeighted(img1, i, img2, (1-i), 0) cv2.imshow('show', res) cv2.waitKey(60) if cv2.waitKey(0) ==27: # Press 'Esc' to exit cv2.destroyAllWindows()