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
相关产品推荐
相关产品推荐

