0

Numpy 配列として、すべて同じ次元の 2 つの画像とマスクがあります。

ここに画像の説明を入力
ここに画像の説明を入力
ここに画像の説明を入力

望ましい出力

出力が次のようになるようにそれらをマージしたいと思います。

ここに画像の説明を入力

現在のコード

def merge(lena, rocket, mask):
    '''Mask init and cropping'''
    mask = np.zeros(lena.shape[:2], dtype='uint8')
    cv2.fillConvexPoly(mask, circle, 255) # might be polygon
    '''Bitwise operations'''
    lena = cv2.bitwise_or(lena, lena, mask=mask)
    mask_inv = cv2.bitwise_not(mask) # mask inverting
    rocket = cv2.bitwise_or(rocket, rocket, mask=mask_inv)
    output = cv2.bitwise_or(rocket, lena)

    return output

現在の結果

このコードにより、次の結果が得られます。

ここに画像の説明を入力

適用するとcv2.GaussianBlur(mask, (51,51), 0)、オーバーレイされた画像の色がさまざまな方法で歪められます。
他のSOの質問は同様の問題に関連していますが、このタイプのぼやけた合成を正確に解決していません。

更新:これにより、現在の結果と同じ結果が得られます

mask = np.zeros(lena.shape[:2], dtype='uint8')
mask = cv2.GaussianBlur(mask, (51,51), 0)
mask = mask[..., np.newaxis]
cv2.fillConvexPoly(mask, circle, 1)
output = mask * lena + (1 - mask) * rocket

一時的な解決策

変換が多いため、これは最適ではない可能性があります。アドバイスをお願いします

mask = np.zeros(generated.shape[:2])
polygon = np.array(polygon, np.int32) # 2d array of x,y coords
cv2.fillConvexPoly(mask, polygon, 1)
mask = cv2.GaussianBlur(mask, (51, 51), 0)
mask = mask.astype('float32')
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
foreground = cv2.multiply(lena, mask, dtype=cv2.CV_8U)
background = cv2.multiply(rocket, (1 - mask), dtype=cv2.CV_8U)
output = cv2.add(foreground, background)

マスクをぼかし、前景と適切にマージしてから背景画像にオーバーレイする方法を教えてください。

4

2 に答える 2

2

ブレンドする前にマスクを再正規化する必要があります。

def blend_merge(lena, rocket, mask):
    mask = cv2.GaussianBlur(mask, (51, 51), 0)
    mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
    mask = mask.astype('float32') / 255
    foreground = cv2.multiply(lena, mask, dtype=cv2.CV_8U)
    background = cv2.multiply(rocket, (1 - mask), dtype=cv2.CV_8U)
    output = cv2.add(foreground, background)
    return output

完全な動作例はこちらです。

于 2020-06-09T03:27:28.307 に答える