tiff.imread()返回哪种类型的数组?

时间:2018-11-01 07:05:51

标签: python-3.x image

我正在尝试从TIFF图像中获取像素的RGB值。因此,我所做的是:

import tifffile as tiff 
a = tiff.imread("a.tif")
print (a.shape)    #returns (1295, 1364, 4)
print(a)      #returns  [[[205 269 172 264]...[230 357 304 515]][[206 270 174 270] ... [140 208 183 286]]]

但是由于我们知道RGB的像素颜色范围是(0,255)。所以,我不明白这些数组返回什么,因为有些值大于255,为什么会有4个值呢?

通过数组大小为1295 * 1364,即图像大小。

1 个答案:

答案 0 :(得分:1)

TIFF(或任何其他图像)为4频段的正常原因是:

  • RGBA,即它包含红色,绿色和蓝色通道以及一个alpha /透明通道,或者
  • CMYK,即包含青色,品红色,黄色和黑色通道-这在印刷行业中最常见,其中“分离” 用于四色印刷,请参见here
  • 这是多波段图像,例如具有红色,绿色,蓝色和近红外波段的卫星图像,例如Landsat MSS(多光谱扫描仪)或类似的工具。

请注意,有些人将TIFF文件用于地形信息,测深信息,显微镜检查和其他用途。

值大于256的可能原因是它是16位数据。虽然可以是10位,12位,32位,浮点数,双精度数或其他形式。

如果无法访问您的图像,则无法说更多。有权访问您的图片,您可以在命令行中使用 ImageMagick 来查找更多信息:

magick identify -verbose YourImage.TIF

示例输出

Image: YourImage.TIF
  Format: TIFF (Tagged Image File Format)
  Mime type: image/tiff
  Class: DirectClass
  Geometry: 1024x768+0+0
  Units: PixelsPerInch
  Colorspace: CMYK           <--- check this field
  Type: ColorSeparation      <--- ... and this one
  Endianess: LSB
  Depth: 16-bit
  Channel depth:
    Cyan: 16-bit             <--- ... and this
    Magenta: 1-bit           <--- ... this
    Yellow: 16-bit           <--- ... and this
    Black: 16-bit
  Channel statistics:
    ...
    ...

您可以像这样缩放值:

from tifffile import imread
import numpy as np

# Open image 
img = imread('image.tif')

# Convert to numpy array
npimg = np.array(img,dtype=np.float)
npimg[:,:,0]/=256
npimg[:,:,1]/=256
npimg[:,:,2]/=256
npimg[:,:,3]/=65535

print(np.mean(npimg[:,:,0]))
print(np.mean(npimg[:,:,1]))
print(np.mean(npimg[:,:,2]))
print(np.mean(npimg[:,:,3]))