1

我有一个创建如下的数组:

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。但是有没有类似/简单的方法可以使用我上面提到的函数来转换这些值?

提前致谢。

4

2 回答 2

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
于 2013-09-16T01:51:26.193 回答
0

我猜这是 pyplot,并且这些数组是 numpy 数组。

在这种情况下:

import numpy as np
vtranslate = np.vectorize(translate, excluded=['inputMin', 'inputMax', 'outputMin', 'outputMax'])
plt.contour(vtranslate(im, imin, imax, omin, omax), ...)

但这只是一个猜测,因为我正在阅读我通常不使用的库的文档,并且您没有解释您实际使用的库...

于 2013-09-16T01:22:06.277 回答