https://docs.opencv.org/4.2.0/d0/d86/tutorial_py_image_arithmetics.htmlから取得
画像追加
OpenCV関数cv.add()を使用するか、単純にnumpy演算res = img1 + img2を使用して、2つの画像を追加でき ます。両方の画像は同じ深度とタイプである必要があります。または、2番目の画像はスカラー値にすることもできます。
OpenCVの追加とNumpyの追加には違いがあります。OpenCV加算は飽和演算であり、Numpy加算はモジュロ演算です。
>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print( x+y ) # 250+10 = 260 % 256 = 4
[4]
2つの画像を追加すると、これがより見やすくなります。より良い結果を提供するため、OpenCV関数を使用します。
画像のブレンド
これも画像の追加ですが、ブレンド感や透明感を出すために画像に異なる重みをつけています。
g(x)=(1 −α)f0(x)+αf1(x)
αを0→1から変化させることにより、ある画像から別の画像へのクールな遷移を実行できます。
cv.addWeighted() は次の方程式を画像に適用します:
dst =α⋅img1+β⋅img2+γ
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
ビットごとの操作
これには、ビットごとのAND、OR、NOT、およびXOR演算が含まれます。これらは、画像の一部を抽出したり、長方形以外のROIを定義して操作したりする場合などに非常に役立ちます。
画像の上にOpenCVロゴを配置したい。画像を2枚追加すると色が変わります。ブレンドすれば透明感が出ます。しかし、私はそれが不透明であることを望みます。長方形の領域であれば、ROIを使用できます。しかし、OpenCVのロゴは長方形ではありません。
# Load two images
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
# Now create a mask of logo and create its inverse mask also
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# Now black-out the area of logo in ROI
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# Take only region of logo from logo image.
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()