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