我应该为Python中的数组类型而烦恼吗?

我应该为Python中的数组类型而烦恼吗?,python,arrays,image,Python,Arrays,Image,我正在尝试使用下面的代码在Python中导入一系列.tiff图像。我想将它们转换为intro数组,以便处理数据。问题是,对于一些32位有符号整数的图像,它们都显示为白色,并且我没有收到正确的矩阵。 这里的变通方法是什么? 谢谢 您在图像数组中看到了什么类型的值 我注意到,如果我没弄错的话,你试图用灰度显示图像。我很确定灰度值在0-255之间,所以尝试用np.uint8表示数组。我已经下载了图像。结论如下: from skimage import io io.use_plugin('freeima

我正在尝试使用下面的代码在Python中导入一系列.tiff图像。我想将它们转换为intro数组,以便处理数据。问题是,对于一些32位有符号整数的图像,它们都显示为白色,并且我没有收到正确的矩阵。 这里的变通方法是什么? 谢谢


您在图像数组中看到了什么类型的值


我注意到,如果我没弄错的话,你试图用灰度显示图像。我很确定灰度值在0-255之间,所以尝试用np.uint8表示数组。我已经下载了图像。结论如下:

from skimage import io
io.use_plugin('freeimage')
data = io.imread('/tmp/data.tif')
我使用
scikits image
进行图像分析,但如果您愿意,可以使用matplotlib的内置功能,没有区别

  • 一些基本统计数字:

    >>> print(data.dtype, data.min(), data.max(), data.shape)
    int32 -2147483647 61 (4094, 6383)
    >>> print(np.unique(data))
    [-2147483647, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
     31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
     47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]
    >>> print(len(np.unique(data)))
    46
    
  • 正在尝试打印图像:

    plot(data)
    

那么这里发生了什么?您有int32数据,大多数值在
[0,61]
范围内,但图像的背景硬编码为
-2147483647
。这就是为什么,当你试图描绘一些东西时,你看到的只是黑白。在内部,
matplotlib
正在根据您的数据重新调整灰度范围(从
[0255]
[-2147483647,61]
),这就是为什么所有前景看起来都是白色的:
[0,61]
中的
[-2147483647,61]
几乎是白色的

你能做些什么来避免这种情况发生

1-忽略背景进行可视化(以下结果是具有不同颜色贴图的相同图像):

    imshow(data, vmin=-1)  # <-1 values are set to -1, only for visualization
    data[data < 0] = data.max() + 1  # or data[data >= 0].min() - 1
    imshow(data)
imshow(数据,vmin=-1)#=0].min()-1
imshow(数据)


稍后,您可以将数据转换为所需的类型,并回答您最初的问题:
float
应该完全可以(我主要使用浮点图像)。

Matplotlib的颜色贴图会根据数据(包括灰度)进行缩放,因此不需要这样做。如果我使用np.float,则值如下:
[0.0.0.255.][0.0.0.255.][0.0.0.255.]
使用np.uint8是可行的,但让我想到了“nodata”值,它们的大小大于int8(它们是int32)。这是个问题吗?@Litwos您的数据被钳制了。255以上的所有值都设置为其他值。只要试试
np.uint8(500)
。如果要将其转换为uint8,则需要在调用
.astype(np.uint8)
之前将数据重新缩放到[0255]。我需要保持数据原样,因为我将执行进一步的分析。因此,我应该得出结论,通过使用np.uint8(500),值为-2*10^9的“nodata”像素将变为255,因此,不需要再次使用np.float?我认为与转换为float相比,mpimg的问题更多。最后一个应该很好用。您可以检查
np.unique(img)
以查看从加载的图像中获得的值吗?我在img\u数组中保留了np.float并使用了np.unique。这是结果:
[0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.43.59.61.255.]
奇怪的是,它有255个值,但是my.tiff的最大值为61,从61大幅跳到255。。您可以尝试类似于
img\u array[img\u array>70]=70的方法。这将把所有具有255个值的像素设置为70,这将增强对比度(只是为了检查它是否改善了任何东西)。与上述相同的(不操纵数据,只是为了可视化)是在
imshow
中设置
vmin=0,vmax=70
。感谢这一提示,但是我需要保留返回的矩阵,因为我有不同的图像,它们的值大于61。非常感谢。它现在运行良好。我需要处理浮点图像,这就解决了问题。:)@利特沃很高兴它起了作用:)祝你好运!顺便说一句,如果没有什么合理的,数据是关于什么的?这看起来很有趣(也很难分析)。这是一个森林区域的树冠高度模型,我需要在上面应用小波滤波器(也需要一些帮助:/)。再次感谢你的帮助!
    data[data < 0] = data.max() + 1  # or data[data >= 0].min() - 1
    imshow(data)