Numpy 将带符号浮点转换为uint8图像opencv

Numpy 将带符号浮点转换为uint8图像opencv,numpy,opencv,scikit-image,Numpy,Opencv,Scikit Image,我有一个来自cv2.matchTemplate的图像,它是浮动范围-1,1: res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) res的值如下:[[0.00730964-0.00275442-0.02477949…-0.16014284-0.13686109 -0.13015044] 我可以看到模式匹配的灰度图: cv2.imshow("Match", res) 但是,我希望在colormap中看到,使用: res

我有一个来自cv2.matchTemplate的图像,它是浮动范围-1,1:

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
res的值如下:[[0.00730964-0.00275442-0.02477949…-0.16014284-0.13686109 -0.13015044]

我可以看到模式匹配的灰度图:

cv2.imshow("Match", res)
但是,我希望在colormap中看到,使用:

resC = cv2.applyColorMap(res, cv2.COLORMAP_JET)
使用此选项,我立即会遇到以下问题: “cv::ColorMap仅支持函数“operator()”中cv_8UC1或cv_8UC3类型的源图像”

所以我尝试撇除转换:

from skimage import img_as_ubyte
res = img_as_ubyte(res)

有了它们,我可以得到如下输出: [[48 46 42 ... 14 19 20] [52 56 54…22 28 30]

现在更好了,整数。然而,有些地方不对劲,因为我只得到了(蓝色)单色彩色贴图,而不是cv2.COLORMAP\u JET系列的漂亮贴图。它似乎有点移位了


关于如何正确地从-1,1转换到0255,有什么提示吗?

为什么不起作用:

我不认为这个函数正在做你希望的重新缩放。考虑下面的例子:

它将输入数组中的最小值映射为0,将最大值映射为1。如果输入数组中没有-1和1的精确值,则使用此函数将不起作用


您可以做些什么:

我建议编写一个简单的函数,将值从-1到1重新缩放为0到255:

>>> image = np.random.uniform(-1,1,(3,3))
>>> scaled = (image + 1)*255/2.
>>> image
array([[ 0.59057256,  0.01683666, -0.24498247],
       [-0.25144806, -0.32312655, -0.02319944],
       [ 0.50878506, -0.04102033,  0.3094886 ]])
>>> scaled
array([[ 202.79800129,  129.64667417,   96.26473544],
       [  95.44037187,   86.3013643 ,  124.54207199],
       [ 192.37009459,  122.26990741,  166.95979601]])
工作原理:

  • image+1
    将所有数字移到[0,2]范围
  • (图像+1)/2.
    将所有数字缩放为[0,1]
  • (图像+1)*255/2。
    将数字从[0,1]缩放到[0255]

为什么这不起作用:

我不认为这个函数正在做你希望的重新缩放。考虑下面的例子:

它将输入数组中的最小值映射为0,将最大值映射为1。如果输入数组中没有-1和1的精确值,则使用此函数将不起作用


您可以做些什么:

我建议编写一个简单的函数,将值从-1到1重新缩放为0到255:

>>> image = np.random.uniform(-1,1,(3,3))
>>> scaled = (image + 1)*255/2.
>>> image
array([[ 0.59057256,  0.01683666, -0.24498247],
       [-0.25144806, -0.32312655, -0.02319944],
       [ 0.50878506, -0.04102033,  0.3094886 ]])
>>> scaled
array([[ 202.79800129,  129.64667417,   96.26473544],
       [  95.44037187,   86.3013643 ,  124.54207199],
       [ 192.37009459,  122.26990741,  166.95979601]])
工作原理:

  • image+1
    将所有数字移到[0,2]范围
  • (图像+1)/2.
    将所有数字缩放为[0,1]
  • (图像+1)*255/2。
    将数字从[0,1]缩放到[0255]

很好。非常好,谢谢!我只添加了“scaled=np.uint8(scaled)”来截断小数。这样我就可以使用标准的opencv图像处理。很好。非常好,谢谢!我只添加了“scaled=np.uint8(scaled)”来截断小数。这样我就可以使用标准的opencv图像处理。
>>> image = np.random.uniform(-1,1,(3,3))
>>> scaled = (image + 1)*255/2.
>>> image
array([[ 0.59057256,  0.01683666, -0.24498247],
       [-0.25144806, -0.32312655, -0.02319944],
       [ 0.50878506, -0.04102033,  0.3094886 ]])
>>> scaled
array([[ 202.79800129,  129.64667417,   96.26473544],
       [  95.44037187,   86.3013643 ,  124.54207199],
       [ 192.37009459,  122.26990741,  166.95979601]])