какой тип массива возвращается функцией tiff.imread ()? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь получить значение RGB пикселей из изображения TIFF. Итак, что я сделал, это:

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]]]

Но поскольку мы знаем, что цветовой диапазон пикселей от (0,255) для RGB. Итак, я не понимаю, что эти массивы возвращают, так как некоторые значения больше, чем 255 и почему есть 4 значения?

Кстати, размер массива 1295 * 1364, т.е. размер изображения.

1 Ответ

0 голосов
/ 01 ноября 2018

Обычные причины, по которым TIFF (или любое другое изображение) должны быть 4-полосными, состоят в следующем:

  • RGBA, то есть содержит красный, зеленый и синий каналы плюс канал альфа / прозрачности, или
  • CMYK, то есть содержит голубой, пурпурный, желтый и черный каналы - это наиболее распространено в печатной промышленности, где «разделения» используются в 4-цветной печати, см. здесь или
  • что это многодиапазонные изображения, такие как спутниковые изображения с красным, зеленым, синим и ближним инфракрасным диапазоном, например, 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]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...