【发布时间】:2017-07-24 12:21:12
【问题描述】:
我有一个图像和圆形区域。我需要模糊所有,除了圆形区域。我还需要使圆的边界平滑。
输入:
输出(在带有掩码的图像编辑器中制作,但我认为 opencv 仅使用位图掩码):
现在我在 python 中有代码,它不会模糊圆圈的边界。
def blur_image(cv_image, radius, center, gaussian_core, sigma_x):
blurred = cv.GaussianBlur(cv_image, gaussian_core, sigma_x)
h, w, d = cv_image.shape
# masks
circle_mask = np.ones((h, w), cv_image.dtype)
cv.circle(circle_mask, center, radius, (0, 0, 0), -1)
circle_not_mask = np.zeros((h, w), cv_image.dtype)
cv.circle(circle_not_mask, center, radius, (2, 2, 2), -1)
# Computing
blur_around = cv.bitwise_and(blurred, blurred, mask=circle_mask)
image_in_circle = cv.bitwise_and(cv_image, cv_image, mask=circle_not_mask)
res = cv.bitwise_or(blur_around, image_in_circle)
return res
当前版本:
我怎样才能模糊圆圈的边界?在输出示例中,我在程序中使用了渐变蒙版。 opencv 中有类似的东西吗?
UPDATE 04.03
所以,我尝试了this answered topic 的公式以及我所拥有的:
代码:
def blend_with_mask_matrix(src1, src2, mask):
res = src2 * (1 - cv.divide(mask, 255.0)) + src1 * cv.divide(mask, 255.0)
return res
此代码应该与最近的代码类似,但事实并非如此。圆圈中的图像略有不同。颜色有一些问题。 问题仍未解决。
【问题讨论】:
-
@Jeru 我已经找到了一个合适的公式,但是在将它集成到 python 中时遇到了一些问题。
(mask/255) * blur + (1-mask/255)*another img。我试图在没有循环的情况下工作,只使用内置的 numpy 矩阵运算 -
你的公式效果如何?
-
@Jeru 我是从link 得到的。主要问题是我不能在 255 上用掩码划分矩阵,因为我收到断言错误
OpenCV Error: Assertion failed (depth == CV_8U || depth == CV_16U || depth == CV_32F)
标签: python opencv image-processing mask