You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV和Numpy创建带平滑圆角边框的蒙版图像问题求助

使用OpenCV和Numpy创建带平滑圆角边框的蒙版图像问题求助

嗨,我来帮你看看这个问题~你想要的是带10像素平滑圆角的蒙版,现在你的代码没达到预期,问题主要出在这两个关键地方:

  1. 初始蒙版的选择完全错了方向:你一开始创建的是全白图像,而cv2.erode腐蚀操作的作用是侵蚀前景(白色)的边缘——但全白图像根本没有“背景(黑色)”作为边界,所以腐蚀操作完全起不到作用,eroded_mask还是和原蒙版一样全白,后续的高斯模糊当然也不会有任何变化。
  2. 实现思路不符合圆角需求:用矩形核腐蚀的方式,就算有边界,得到的也是直角边缘,之后模糊也没法得到自然的圆角效果,这和你想要的Photoshop风格的圆角蒙版逻辑完全不搭。

给你两种可行的实现方法,都能精准得到你要的平滑圆角蒙版,你可以按需选择:

方法一:先画硬边缘圆角蒙版,再模糊平滑

这种方法逻辑直观,先手动画出带硬圆角的蒙版,再通过高斯模糊让边缘过渡更自然:

import cv2
import numpy as np

# 设定参数
img_size = (128, 128)  # 蒙版尺寸
corner_radius = 10      # 圆角半径
blur_kernel = (21, 21)  # 模糊核大小,控制平滑程度

# 1. 创建全黑的基础蒙版
mask = np.zeros(img_size, dtype=np.uint8)

# 2. 计算圆角矩形的坐标(上下左右各留10px的过渡空间)
x1, y1 = corner_radius, corner_radius
x2, y2 = img_size[1] - corner_radius, img_size[0] - corner_radius

# 3. 画出四个圆角(填充白色)
cv2.ellipse(mask, (x1, y1), (corner_radius, corner_radius), 0, 180, 270, 255, -1)
cv2.ellipse(mask, (x2, y1), (corner_radius, corner_radius), 0, 270, 360, 255, -1)
cv2.ellipse(mask, (x1, y2), (corner_radius, corner_radius), 0, 90, 180, 255, -1)
cv2.ellipse(mask, (x2, y2), (corner_radius, corner_radius), 0, 0, 90, 255, -1)

# 4. 填充圆角之间的矩形区域
cv2.rectangle(mask, (x1, 0), (x2, img_size[0]), 255, -1)
cv2.rectangle(mask, (0, y1), (img_size[1], y2), 255, -1)

# 5. 高斯模糊实现平滑过渡的边缘
smooth_mask = cv2.GaussianBlur(mask, blur_kernel, sigmaX=3, sigmaY=3)

# 展示结果
cv2.imshow('Smooth Rounded Mask', smooth_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

方法二:用距离变换生成自然渐变边缘

这种方法通过距离变换计算像素到边界的距离,生成更自然的平滑过渡,适合需要精确控制边缘柔化程度的场景:

import cv2
import numpy as np

# 设定参数
img_size = (128, 128)
border_width = 10  # 边框过渡的宽度
blur_sigma = 3     # 模糊程度

# 1. 创建全白图像
full_white = np.ones(img_size, dtype=np.uint8) * 255

# 2. 创建中间的白色矩形蒙版(周围是黑色)
inner_rect = np.zeros(img_size, dtype=np.uint8)
x1, y1 = border_width, border_width
x2, y2 = img_size[1]-border_width, img_size[0]-border_width
cv2.rectangle(inner_rect, (x1, y1), (x2, y2), 255, -1)

# 3. 距离变换:计算每个像素到最近黑色区域的距离
dist_transform = cv2.distanceTransform(255 - inner_rect, cv2.DIST_L2, 5)

# 4. 生成平滑过渡的蒙版:中间全白,边缘随距离渐变
smooth_mask = np.where(
    dist_transform <= border_width,
    255 * (1 - dist_transform / border_width),  # 边缘区域从白到黑渐变
    255  # 中间区域保持全白
).astype(np.uint8)

# 5. 高斯模糊让过渡更自然
smooth_mask = cv2.GaussianBlur(smooth_mask, (21,21), sigmaX=blur_sigma)

# 展示结果
cv2.imshow('Smooth Mask', smooth_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

你可以调整参数(比如圆角半径、模糊核大小)来微调效果,完全能达到和Photoshop里一样的平滑圆角蒙版~

备注:内容来源于stack exchange,提问作者Prashant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:29:49