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

OpenCV2中如何将saliency map与原图相乘叠加突出显著区域

问题原因

  • 数据类型匹配错误:拆分得到的B/G/R通道是uint8类型(取值范围0255),而saliencyMap是浮点类型(取值范围01),y.astype(y.dtype)这行没有做任何有效类型转换,相乘后结果为浮点类型数组,取值范围变成0~255。而cv2.imshow显示浮点类型图像时,默认会把大于1的数值统一判定为最大值(白色),小于0的判定为最小值(黑色),因此输出图像显示异常。
  • 直接相乘的处理逻辑会导致非显著区域完全被压黑,视觉效果比较生硬,不是最优的显著性叠加方案。

修复后的代码(适配原有相乘逻辑)

import cv2
import numpy as np

# 前面生成saliencyMap、resize原图的代码保持不变
(B, G, R) = cv2.split(resized)
# 先把显著性图转成0~255的uint8格式,和通道类型对齐
saliency_255 = (saliencyMap * 255).astype(np.uint8)

# 按位相乘,uint8类型运算符合imshow的显示要求
B = cv2.multiply(B, saliency_255, scale=1/255)
G = cv2.multiply(G, saliency_255, scale=1/255)
R = cv2.multiply(R, saliency_255, scale=1/255)

img = cv2.merge((B,G,R))
cv2.imshow("Image", img)
cv2.waitKey(0)

更推荐的显著性高亮方案(半透明叠加,视觉效果更自然)

不需要拆分通道,直接用OpenCV的加权融合接口实现,显著性区域高亮的同时保留原图背景信息:

# 先把显著性图转成伪彩色(可选,也可以直接用灰度显著性图叠加)
saliency_colored = cv2.applyColorMap((saliencyMap * 255).astype(np.uint8), cv2.COLORMAP_JET)
# 加权融合:原图占比0.7,显著性蒙版占比0.3,可根据需求调整权重
overlay_img = cv2.addWeighted(resized, 0.7, saliency_colored, 0.3, 0)
cv2.imshow("Saliency Overlay", overlay_img)
cv2.waitKey(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 14:18:03