【问题标题】:Matplotlib - how to rescale pixel intensities for RGB imageMatplotlib - 如何重新调整 RGB 图像的像素强度
【发布时间】:2016-09-24 14:41:58
【问题描述】:

我对 matplotlib 如何处理 fp32 像素强度感到困惑。据我了解,它会重新调整图像的最大值和最小值之间的值。但是,当我尝试通过使用 imshow() 将像素强度重新缩放到 [-1,1](通过 im*2-1)来查看最初在 [0,1] 中的图像时,图像的颜色会有所不同。如何重新缩放以使图像没有差异?

编辑:请看图片 -

PS:我需要将这些值作为程序的一部分来输出 [-1,1]

以下是用于此的代码:

img = np.float32(misc.face(gray=False))
fig,ax = plt.subplots(1,2)
img = img/255 # Convert to 0,1 range
print (np.max(img), np.min(img))    
img0 = ax[0].imshow(img)
plt.colorbar(img0,ax=ax[0])
print (np.max(2*img-1), np.min(2*img-1))
img1 = ax[1].imshow(2*img-1)  # Convert to -1,1 range
plt.colorbar(img1,ax=ax[1])
plt.show() 

最大、最小输出为:

(1.0, 0.0)
(1.0, -1.0)

【问题讨论】:

    标签: python image-processing matplotlib


    【解决方案1】:

    你可能在这里使用了 matplotlib 错误。

    标准化步骤应该可以正常工作,如果它处于活动状态的话。 docs 告诉我们,只有在输入图像为浮点类型时才默认激活!

    代码

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import misc
    
    fig, ax = plt.subplots(2,2)
    
    # This usage shows different colors because there is no normalization
    # FIRST ROW
    f = misc.face(gray=True)
    print(f.dtype)
    g = f*2  # just some operation to show the difference between usages
    ax[0,0].imshow(f)
    ax[0,1].imshow(g)
    
    # This usage makes sure that the input-image is of type float
    # -> automatic normalization is used!
    # SECOND ROW
    f = np.asarray(misc.face(gray=True), dtype=float)  # TYPE!
    print(f.dtype)
    g = f*2  # just some operation to show the difference between usages
    ax[1,0].imshow(f)
    ax[1,1].imshow(g)
    
    plt.show()
    

    输出

    uint8
    float64
    

    分析

    第一行显示错误用法,因为输入是 int 类型,因此不会使用规范化。

    第二行显示正确用法!

    编辑:

    sascha 在 cmets 中正确指出,重新缩放不适用于 RGB 图像,并且必须确保输入在 [0,1] 范围内。

    【讨论】:

    • 我添加了一张图片来澄清。我正在使用浮动 - 问题是我想从 [0,1] 移动到 [-1,1] 而不更改显示的图像。
    • @Jagadeesh 然后显示代码以及一些关于数组的形状、类型、最小值的调试输出。标准化对我来说工作正常。您的代码似乎还有其他问题。它似乎与彩色图像的使用有关(而不是我的例子中的灰度)。
    • @Jagadeesh 您还可以多解释一下管道中的问题。最终情节中将使用哪种格式的图像? -1,1 和 0,1 的混合?只有-1,1的图像?当然还有一个问题,如果你需要全局标准化,当绘制两个不同的图像时,都在 -1,1 之内;但最小/最大不同。也许预处理需要外包。这一切都取决于你的任务!这可以通过 scikit-learn 或(我推荐)很好地完成:在 scikit-image 之上构建所有内容,这应该保持连贯的 reprs。内部。
    • 我同意差异是由于使用 RGB 图像造成的。在我的实验中,我有 0-1 范围浮点数的 RGB 图像。然而,在应用了一些变换(最终是一个 tanh 函数)之后,生成的图像在 [-1,1] 范围内。我的问题是像素值从 [0,1] 拉伸到 [-1,1] 的图像在 matplotlib 中看起来不一样,这意味着标准化没有正确进行。我所有的图像都是 [-1,1] 并且没有混合并且它们看起来很奇怪但是当我将它们转换为 [0,1] 时它们看起来很好。
    • @Jagadeesh docs 说,plt.imshow 的输入必须在 range(0,1) 范围内,并且没有对带有颜色的图像进行归一化(只有灰度被归一化) . 这意味着,在调用 imshow 之前将图像预处理为 (0,1) 是您的工作。我认为将其添加到您的管道中没有任何问题(即使有一些关于规范化的决定;本地与全局......我会使用 sklearns MinMaxScaler)!
    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多