web-dev-qa-db-ja.com

res = cv2.bitwise_and(img、img、mask = mask)で引数の意味を説明します

入力画像の青色を抽出しようとしています。そのために、次のコマンドを使用して、青いHSVカラー境界としきい値HSVイメージを作成します

mask_img = cv2.inRange(hsv, lower_blue, upper_blue)

その後、入力画像としきい値画像でbitwise_andを使用して

res = cv2.bitwise_and(img,img,mask = mask_img)

ここで、「img」は入力画像です。私がopencvから取得したこのコード。しかし、なぜbitwise_で3つの引数が使用されているのか、そして実際には各引数が何を意味しているのか理解できませんでした。 src1とsrc2で同じイメージが使用されるのはなぜですか?

そして、ここでマスクキーワードの使用は何ですか?答えを見つけるのを手伝ってください

14
SACHIN

これの背後にある基本的な概念は、黒の値です。OPEN_CVでは、その値は0です。したがって、黒の値は0なので、黒+ anycolor = anycolorです。

ここで、2つのイメージがあり、1つはimg1という名前で、もう1つはimg2という名前だとします。 img2には、img1に配置するロゴが含まれています。 thresholdを作成してから、img2のmaskおよびmask_invを作成し、img1のroiも作成します。次に、img2のロゴをimg1に追加するには、2つのことを行う必要があります。 roiの背景をimg1_bgとして作成します:mask_inv、mask_invには2つの領域があり、1つは黒、もう1つは白です。白い領域にimg1の部分を配置し、黒のままにします。

img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

あなたの質問では、作成されたimgのマスクを直接使用しました

res = cv2.bitwise_and(img,img,mask = mask_img)

img2では、roiの前景としてロゴを作成する必要があります。

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

ここでは、マスクレイヤーを使用しました。img2のロゴ部分がマスクの白い部分で塗りつぶされます。両方を追加すると、完全な組み合わせのroiが得られます。完全な説明と理解については、 OPEN CV CODEをご覧ください。ファイルと完全な説明

8

「And」の演算は、mask [i]がゼロに等しくない場合にのみ実行されます。そうでない場合、演算の結果はゼロになります。マスクは、単一チャネルの白または黒のイメージである必要があります。あなたはこのリンクを見ることができます http://docs.opencv.org/2.4.13.2/modules/core/doc/operations_on_arrays.html?highlight=bitwise#bitwise-and

6
Mohammed Awney

上記の答えから、bitwise_and()のパラメーターの定義を知っているかもしれませんが、それらはすべて他の質問に答えていません

Src1とsrc2で同じイメージが使用されるのはなぜですか?

この質問は、OpenCVのドキュメントの関数定義が単純化しすぎていることが原因である必要があります。一部の人々にはあいまいな場合があります。ドキュメントでは、bitwise_and()は次のように定義されています。

dst(I)= sur1(I)^ sur2(I)、ただしmask(I)!= 0の場合、^は「and」演算子を表す

この定義から一目見ただけでは、マスク(I)が0の場合にdst(I)を処理する方法を理解できません。

テスト結果から、次のように、より明確な関数定義が得られると思います。

dst(I)= sur1(I)^ sur2(I)、マスク(I)!= 0の場合、

それ以外の場合、dst(I)は元の値を保持し、dst配列のすべての要素のデフォルト値は0です。

これで、sur1とsur2に同じ画像を使用すると、元の画像部分がマスク(I)!= 0の領域にのみ保持され、他の領域にはdst画像の一部が(マスク形状として)表示されることがわかります。

さらに、他のビット単位の操作の場合、定義は上記と同じである必要があります。また、そうでなければ、条件とdst配列のデフォルト値の説明を追加する必要があります。

4
phchen2

実際に各引数はどういう意味ですか? res = cv2.bitwise_and(img,img,mask = mask_img)

src1:最初の画像(マージするための最初のオブジェクト)src2:2番目の画像(マージするための2番目のオブジェクト)マスク:マージするルールとして理解されます。画像の領域(グレースケールでマスクされている)が黒色(値は0)の場合、それは結合されません(最初の画像の領域と2番目の画像の領域をマージします)。逆もまた同様です。コードでは、参照される画像は「mask_img」です。私の場合、私のコードは白+ anycolor = anycolorになったときに正しいです。 import cv2 import numpy as np

# Load two images
img1 = cv2.imread('bongSung.jpg')
img2 = cv2.imread('opencv.jpg')

# 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 we need to create a mask of the logo, mask is conversion to grayscale of an image
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('mask', mask)

mask_inv = cv2.bitwise_not(mask)
#cv2.imshow("mask_inv", mask_inv)

#When using bitwise_and() in opencv with python then white + anycolor = anycolor; black + anycolor = black 
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
#cv2.imshow("img1_bg", img1_bg)

cv2.imshow("img2", img2)

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
cv2.imshow('img2_fg', img2_fg)

dst = cv2.add(img1_bg,img2_fg)

img1[0:rows, 0:cols] = dst

#cv2.imshow("Image", img1)
cv2.waitKey(0)

cv2.destroyAllWindows()
3
Huynh Nguyen

以下のリンクは、ビットごとの操作と各パラメーターの重要性を明確に説明しています。 http://opencvexamples.blogspot.com/2013/10/bitwise-and-or-xor-and-not.html

void bitwise_and(InputArray src1、InputArray src2、OutputArray dst、InputArray mask = noArray())

2つの配列または配列とスカラーの要素ごとのビット単位の結合を計算します。パラメータ:src1 –最初の入力配列またはスカラー。

src2 – 2番目の入力配列またはスカラー。

src –単一の入力配列。

value –スカラー値。

dst –入力配列と同じサイズとタイプの出力配列。 mask –オプションの操作マスク、8ビットの単一チャネル配列。変更する出力配列の要素を指定します

2
shri

Imgを2回使用することに関しては、私はimg [i]とimg [i]が何であるかを気にしていません。重要なのは、Mohammed Awneyが述べたように、マスクが0の場合はimg [i]を0にし、それ以外の場合はピクセルをそのままにします。これは、マスクに従って、特定のピクセルをimgで黒くする方法です。

1