将带符号的float转换为uint8图像opencv

时间:2018-08-01 21:56:47

标签: 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]

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

cv2.imshow("Match", res)

但是我想使用以下方法在颜色图中查看

resC = cv2.applyColorMap(res, cv2.COLORMAP_JET)

使用此方法,我会立即遇到以下问题: “ cv :: ColorMap在函数'operator()'中仅支持CV_8UC1或CV_8UC3类型的源图像”

所以我尝试skimage转换:

from skimage import img_as_ubyte
res = img_as_ubyte(res)

from skimage import exposure
res = exposure.rescale_intensity(res, out_range=(0, 255))

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

现在,整数。但是,出了点问题,因为我只得到了(蓝色)单色色图,而不是cv2.COLORMAP_JET范围中的漂亮色图。似乎有所改变。

是否有任何有关如何正确地将-1,1转换为0,255的提示?

1 个答案:

答案 0 :(得分:3)

为什么这不起作用:

我不认为此功能正在执行您希望的重新缩放。考虑下面reference manual中的示例:

>>> image = np.array([-10, 0, 10], dtype=np.int8)
>>> rescale_intensity(image, out_range=(0, 127))
array([  0,  63, 127], dtype=int8)

它将输入数组中的最小数字映射为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]范围
  • (image +1)/2.将所有数字缩放为[0,1]
  • (image +1)*255/2.将数字从[0,1]缩放为[0,255]