我有一个如下所示的数组:
im = plt.array(Image.open('Mean.png').convert('L'))
我必须将其所有值转换为指定范围。为此,我有这个功能:
def translate(value, inputMin, inputMax, outputMin, outputMax):
# Figure out how 'wide' each range is
leftSpan = inputMax - inputMin
rightSpan = outputMax - outputMin
# Convert the left range into a 0-1 range (float)
valueScaled = float(value - inputMin) / float(leftSpan)
# Convert the 0-1 range into a value in the right range.
return outputMin + (valueScaled * rightSpan)
在我的具体问题中,我必须显示这个图像轮廓:
plt.figure()
CS = plt.contour(im, origin='image', extent=[-1, 1, -1, 1])
plt.colorbar(CS, shrink=0.5, aspect=10)
plt.clabel(CS, inline=1, fontsize=10)
plt.savefig("ContourLevel2D.png")
但每个灰度值必须转换为-1..1范围。 我知道我可以这样做:
CS = plt.contour(im/100, origin='image', extent=[-1, 1, -1, 1])
将 im 的每个元素除以 100 。 但是有没有类似/简单的方法来使用我上面提到的函数来转换这些值?
提前致谢。
答案 0 :(得分:1)
translate
函数内的所有操作都可以直接应用于您的数组:
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
im = np.array(Image.open('Mean.png').convert('L'), dtype=float)
# Figure out how 'wide' each range is
leftSpan = inputMax - inputMin
rightSpan = outputMax - outputMin
# Convert the left range into a 0-1 range (float)
imNormalized = (im - inputMin) / leftSpan
# Convert the 0-1 range into a value in the right range.
imTranslated = outputMin + (imScaled * rightSpan)
你已经完成了,im
现在已经有了“跨度”。
通过重新规范化就可以略微减少,也就是说,不要创建单独的数组,只需修改当前的数组。每次重命名数组时,都会复制一份。
im = np.array(Image.open('Mean.png').convert('L'), dtype=float)
# normalize the input, in place
im -= inputMin
im /= inputMax
# Convert the 0-1 range into a value in the right range.
im *= outputMax - outputMin
im += outputMin
答案 1 :(得分:0)
我猜这是pyplot,并且数组是numpy数组。
在这种情况下:
import numpy as np
vtranslate = np.vectorize(translate, excluded=['inputMin', 'inputMax', 'outputMin', 'outputMax'])
plt.contour(vtranslate(im, imin, imax, omin, omax), ...)
但这只是猜测,因为我正在阅读我通常不会使用的库的文档,而且你没有解释你实际使用的库......