Numpy 将带符号浮点转换为uint8图像opencv
我有一个来自cv2.matchTemplate的图像,它是浮动范围-1,1: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
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]])
工作原理:
将所有数字移到[0,2]范围image+1
将所有数字缩放为[0,1](图像+1)/2.
将数字从[0,1]缩放到[0255](图像+1)*255/2。
您可以做些什么: 我建议编写一个简单的函数,将值从-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]])
工作原理:
将所有数字移到[0,2]范围image+1
将所有数字缩放为[0,1](图像+1)/2.
将数字从[0,1]缩放到[0255](图像+1)*255/2。
>>> 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]])