[OpenCV-Python]画像に対する10の算術演算

OpenCV-Python:コアオペレーション

10画像の算術演算

目的
  •画像の算術演算、加算、減算、ビット演算などを学習します。
  •学習する関数は、cv2.add()、cv2.addWeighted()などです。

10.1画像の追加

関数cv2.add()を使用して2つの画像を追加できます。もちろん、numpyを直接使用することもできます(res = img1 + img)。2つの画像のサイズとタイプは同じである必要があります。そうでない場合、2番目の画像は単純なスカラー値にすることができます。
注:OpenCVでの追加は、Numpyでの追加とは異なります。OpenCVの追加は飽和操作ですが、Numpyの追加はモジュロ操作です。
たとえば、次の2つの例:

x = np.uint8([250])
y = np.uint8([10])
print cv2.add(x,y) # 250+10 = 260 => 255
[[255]]
print x+y # 250+10 = 260 % 256 = 4
[4]

この違いは、2つの画像を追加するとより明白になります。OpenCVの結果はより良くなります。そこで、OpenCVの関数を使おうとしています。

10.2画像のミキシング

これは実際には追加ですが、違いは2つの画像の重みが異なるため、人々にブレンドまたは透明感を与えることです。画像ブレンディングの計算式は次のとおりです
    。g(x)=(1 −α)f0(x)+αf1(x)
  α(0→1)の値を変更することにより、非常にクールなブレンディングを実現できます。 。
  次に、2つの画像を混ぜ合わせます。最初の画像の重みは0.7で、2番目の画像の重みは0.3です。関数cv2.addWeighted()は、次の式に従って画像を混合できます。
    dst =α・img1 +β・img2 +γ
  ここで、γの値は0です。

import cv2
import numpy as np

img1=cv2.imread('ml.png') img2=cv2.imread('opencv_logo.jpg')

dst=cv2.addWeighted(img1,0.7,img2,0.3,0)

cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindow()

img

10.3ビット演算

ここに含まれるビット演算は、AND、OR、NOT、XORなどです。これらの操作は、画像の一部を抽出し、長方形以外のROIを選択するときに役立ちます(次の章で理解します)。次の例は、画像の特定の領域を変更する方法を教えてくれます。OpenCVのロゴを別の画像に配置したい。足し算を使うと色が変わり、ブレンドを使うと透明感が出ますが、透明感は必要ありません。長方形の場合は、前の章と同じようにROIを使用できます。しかし、彼は長方形ではありません。ただし、次のビット演算を使用して実行できます。

import cv2
import numpy as np

# 加载图像
img1 = cv2.imread('roi.jpg')
img2 = cv2.imread('opencv_logo.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 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask)

# Now black-out the area of logo in ROI
# 取 roi 中与 mask 中不为零的值对应的像素的值,其他值为 0
# 注意这里必须有 mask=mask 或者 mask=mask_inv, 其中的 mask= 不能忽略
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
# 取 roi 中与 mask_inv 中不为零的值对应的像素的值,其他值为 0。# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)

# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg) img1[0:rows, 0:cols ] = dst

cv2.imshow('res',img1) cv2.waitKey(0) cv2.destroyAllWindows()

結果は以下のとおりです。左の画像は私たちが作成したマスクです。右側が最終結果です。理解しやすいように、上記のプログラムの中間結果、特にimg1_bgとimg2_fgも示しました。

ここに画像の説明を挿入しますimg

詳細については、公式アカウントに注意してください。
img

おすすめ

転載: blog.csdn.net/yegeli/article/details/113405861