【问题标题】:Multiply Maps and Images Together OpenCV2将地图和图像相乘 OpenCV2
【发布时间】:2021-07-17 11:01:21
【问题描述】:

我目前有一张使用以下代码的图像显着图:

img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
saliency = cv2.saliency.StaticSaliencyFineGrained_create()
(success, saliencyMap) = saliency.computeSaliency(image)

# cv2.imshow("Image", image)
cv2.imshow("output", saliencyMap)

输出是下面的显着图。它是标准化的(我相信),并且数组只包含 0 到 1 之间的值。

我想知道是否有办法将此显着性蒙版放在下面的图像上,以获得突出显示显着区域的输出图像?

我尝试将图像分成 3 个通道,并将每个通道乘以地图,然后将它们堆叠在一起,但这并没有显示出效果。我试过的代码是:

(B, G, R) = cv2.split(resized)
y = saliencyMap
# cv2.imshow("Blue", B)
# cv2.imshow("Green", G)
# cv2.imshow("Red", R)
# cv2.waitKey(0)

B = B * y.astype(y.dtype)
G = G * y.astype(y.dtype)
R = R * y.astype(y.dtype)


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

但是,我得到的输出图像是:

这显然是错误的。有什么提示或建议吗?

【问题讨论】:

    标签: python image opencv mask


    【解决方案1】:

    您是对的,只是您需要将 R,G,B 转换为 uint8 dtype。目前它们是float 类型(因为saliency 也是float),float >1 将是白色的。

    另外,你可以使用广播:

    output = (img * saliency[...,None]).astype('uint8')
    

    然后输出:

    【讨论】:

    • 所以我在这里不太确定的一件事是,我放置 y.astype(y.dtype) 的代码不是已经为我做了这个吗?您最终编写了哪些代码来获取该输出图像?
    • Nvm 我意识到这是因为数组的值都大于 1。这绝对是我要找的!谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多