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

如何使用CV2为图像添加bloom(泛光)特效

基于OpenCV(CV2)实现Bloom泛光特效的方案

完全可以通过CV2实现Bloom泛光特效,实现逻辑简单且性能足够满足简易照片编辑器的需求。
泛光特效的核心逻辑是提取图像高亮区域、对高亮区域做模糊处理模拟光线扩散,最后将发光层与原图混合,所有步骤都可以通过CV2原生API完成。

具体实现步骤

  • 输入图像归一化:将图像从0-255的uint8格式转为0-1的float32格式,避免运算过程中像素值溢出
  • 高亮区域提取:设置亮度阈值,仅保留亮度高于阈值的像素作为发光源层,其余区域置为0
  • 发光层模糊:对发光源层做高斯模糊,模糊半径决定泛光的扩散范围
  • 图层混合:将模糊后的发光层按指定权重与原图像叠加,转回uint8格式后即为最终效果

可直接运行的代码示例

import cv2
import numpy as np

def add_bloom_effect(img, threshold=0.8, blur_radius=21, bloom_intensity=0.3):
    # 图像归一化到0-1范围
    img_float = img.astype(np.float32) / 255.0
    # 提取亮度通道判断高亮区域,也可替换为HSV色彩空间的V通道做判断
    gray = cv2.cvtColor(img_float, cv2.COLOR_BGR2GRAY)
    # 生成高亮遮罩层
    highlight_mask = np.where(gray[..., None] > threshold, img_float, 0)
    # 对高亮层做高斯模糊
    blurred_highlight = cv2.GaussianBlur(highlight_mask, (blur_radius, blur_radius), 0)
    # 可选优化:叠加不同模糊半径的发光层,效果更自然
    # blurred_highlight += cv2.GaussianBlur(highlight_mask, (blur_radius//2 +1, blur_radius//2 +1), 0) * 0.5
    # 混合原图像和泛光层
    result = cv2.addWeighted(img_float, 1, blurred_highlight, bloom_intensity, 0)
    # 转回0-255标准图像格式
    result = np.clip(result * 255, 0, 255).astype(np.uint8)
    return result

# 调用示例
if __name__ == "__main__":
    input_img = cv2.imread("test.jpg")
    output_img = add_bloom_effect(input_img)
    cv2.imwrite("bloom_output.jpg", output_img)

参数调整说明:

  • threshold:高亮提取阈值,取值范围0~1,数值越低越多区域会被识别为发光源,泛光覆盖范围越大
  • blur_radius:高斯模糊核大小,必须为正奇数,数值越大泛光的扩散边缘越柔和、覆盖范围越广
  • bloom_intensity:泛光强度,取值范围0~1,数值越大泛光效果越突出

如果需要更自然的电影感泛光,可以叠加多个不同模糊半径的发光层,或者对发光层先降采样再模糊上采样,能在降低计算量的同时得到更柔和的扩散效果。

内容的提问来源于stack exchange,提问作者AXOME

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:04