因此,主要的问题
(mask/255) * blur + (1-mask/255)*anotherimg是运算符。他们只在一个频道上工作。下一个问题是使用浮点数来“平滑”。
我将与Alpha通道混合的代码更改为:
1)我将每个通道用于源图像和蒙版
2)执行公式
3)合并通道
def blend_with_mask_matrix(src1, src2, mask): res_channels = [] for c in range(0, src1.shape[2]): a = src1[:, :, c] b = src2[:, :, c] m = mask[:, :, c] res = cv.add( cv.multiply(b, cv.divide(np.full_like(m, 255) - m, 255.0, dtype=cv.CV_32F), dtype=cv.CV_32F), cv.multiply(a, cv.divide(m, 255.0, dtype=cv.CV_32F), dtype=cv.CV_32F),dtype=cv.CV_8U) res_channels += [res] res = cv.merge(res_channels) return res
作为渐变蒙版,我只是使用模糊的圆圈。
def blur_image(cv_image, radius, center, gaussian_core, sigma_x): blurred = cv.GaussianBlur(cv_image, gaussian_core, sigma_x) circle_not_mask = np.zeros_like(cv_image) cv.circle(circle_not_mask, center, radius, (255, 255, 255), -1)#Smoothing borders cv.GaussianBlur(circle_not_mask, (101, 101), 111, dst=circle_not_mask)# Computing res = blend_with_mask_matrix(cv_image, blurred, circle_not_mask) return res
结果:
它的工作比没有平滑边界的第一个版本慢一些,但是可以。
结束语。



