使用OpenCV实现深度图黑色焦点区域的平滑过渡
问题
我有一段Python代码用于处理深度图,模拟纯黑色的焦点区域,目前功能已实现,但需实现白色到黑色的平滑过渡以弱化生硬效果。
代码如下:
import cv2 import numpy as np # Load the depth map image img = cv2.imread("./image-outputs/PXL_20231229_013919393-dpt_beit_large_512.png", cv2.IMREAD_GRAYSCALE) # Create a copy of the image to preserve the original result_img = img.copy() copy = img.copy() # Choose a scaling factor (experiment with values above 1) min_value = img.min() scale_factor = (255 - min_value) / min_value if scale_factor > 255: scale_factor = 255 # Apply the scale_factor to all pixels for i in range(img.shape[0]): for j in range(img.shape[1]): pixel_value = img[i, j] if pixel_value < 127: flipped_value = int(pixel_value * scale_factor) img[i, j] = flipped_value pixel_value = copy[i, j] if 50 <= pixel_value <= 80: img[i, j] = 0 # Set to black else: result_img[i, j] = abs(pixel_value) # Get absolute value cv2.imwrite("focus-map-flipped-darkest-to-brightest.png", img)
我尝试使用腐蚀操作平滑图像(但结果要么模糊要么全黑),尝试-10的膨胀操作则报错,恳请帮助!
示例图片:
解决方案
要实现自然的黑白平滑过渡,核心是避免硬阈值赋值,通过软掩码加权混合的方式让焦点区域从边缘到中心逐步过渡为黑色,具体实现如下:
修改后的代码
import cv2 import numpy as np # 加载深度图 img = cv2.imread("./image-outputs/PXL_20231229_013919393-dpt_beit_large_512.png", cv2.IMREAD_GRAYSCALE) copy = img.copy() # 完成原有的像素缩放操作(改用向量化操作提升效率) min_value = img.min() scale_factor = min((255 - min_value) / min_value, 255) # 限制最大缩放值 mask_scale = img < 127 img[mask_scale] = (img[mask_scale] * scale_factor).astype(np.uint8) # 生成平滑过渡的焦点掩码 # 1. 创建硬掩码:50-80区间标记为焦点区域 focus_mask = np.zeros_like(img) focus_mask[(copy >= 50) & (copy <= 80)] = 255 # 2. 对硬掩码做高斯模糊,生成边缘渐变的软掩码 # 核大小和标准差可调整:核越大、标准差越高,过渡越平滑 blurred_mask = cv2.GaussianBlur(focus_mask, (21, 21), sigmaX=10) blurred_mask_normalized = blurred_mask / 255.0 # 归一化到0-1范围 # 3. 加权混合原图与全黑图,实现平滑过渡 black_img = np.zeros_like(img) result_img = (img * (1 - blurred_mask_normalized) + black_img * blurred_mask_normalized).astype(np.uint8) # 保存结果 cv2.imwrite("focus-map-smooth-transition.png", result_img)
关键说明
- 替换循环为向量化操作:用numpy的布尔索引替代双重循环,大幅提升处理速度,代码更简洁。
- 高斯模糊生成软掩码:硬掩码经过高斯模糊后,边缘会产生从0到255的灰度渐变,避免了生硬的黑白边界。
- 加权混合逻辑:掩码值越高的区域(焦点中心),越接近全黑;掩码值越低的区域(焦点边缘),越接近原图,自然实现平滑过渡。
调整建议
- 若过渡效果不符合预期,可修改高斯核大小(比如
(11,11)、(31,31))或sigmaX参数(比如5、15)。 - 如需调整焦点范围,直接修改掩码的区间阈值
50 <= pixel_value <= 80即可。
内容的提问来源于stack exchange,提问作者cardcraft
相关产品推荐
相关产品推荐

