如何使用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
相关产品推荐
相关产品推荐

