dpe*_*ini 1 opencv numpy scikit-image
我有一个来自cv2.matchTemplate的图像,其浮动范围为-1,1:
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
Run Code Online (Sandbox Code Playgroud)
res的值例如:[[0.00730964 -0.00275442 -0.02477949 ... -0.16014284 -0.13686109 -0.13015044]
我可以看到模式匹配的graycale图:
cv2.imshow("Match", res)
Run Code Online (Sandbox Code Playgroud)
但是我想在颜色图中使用:
resC = cv2.applyColorMap(res, cv2.COLORMAP_JET)
Run Code Online (Sandbox Code Playgroud)
使用此方法,我立即遇到类似问题:“ cv :: ColorMap在函数'operator()'中仅支持CV_8UC1或CV_8UC3类型的源图像”
所以我尝试skimage转换:
from skimage import img_as_ubyte
res = img_as_ubyte(res)
Run Code Online (Sandbox Code Playgroud)
要么
from skimage import exposure
res = exposure.rescale_intensity(res, out_range=(0, 255))
Run Code Online (Sandbox Code Playgroud)
有了它们,我得到如下输出:[[48 46 42 ... 14 19 20] [52 56 54 ... 22 28 30]
现在更好,整数。但是,出了点问题,因为我只得到了(蓝色)单色色图,而不是cv2.COLORMAP_JET范围中的漂亮色图。似乎有所改变。
关于如何正确地从-1,1转换为0,255的任何提示?
小智 5
为什么这不起作用:
我不认为此功能正在做您希望的缩放。考虑以下参考手册中的示例:
>>> image = np.array([-10, 0, 10], dtype=np.int8)
>>> rescale_intensity(image, out_range=(0, 127))
array([ 0, 63, 127], dtype=int8)
Run Code Online (Sandbox Code Playgroud)
它将输入数组中的最小数映射为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]])
Run Code Online (Sandbox Code Playgroud)
怎么运行的:
image + 1 将所有数字移至[0,2]范围(image +1)/2. 将所有数字缩放为[0,1] (image +1)*255/2. 将数字从[0,1]缩放到[0,255]