При чтении 4-канального TIF-файла значение отличается от SKIMAGE, TIFFFILE и т. Д. - PullRequest
0 голосов
/ 26 сентября 2018

Я знаю, что opencv получил заказ BGR, но в моем эксперименте не только порядок, но и значения полностью перепутаны

import cv2 as cv
import tifffile as tiff
import skimage.io

img_path = r"C:\test\pics\t100r50s16_1_19.tif"
c = cv.imread(img_path,cv.IMREAD_UNCHANGED)
t = tiff.imread(img_path)
s = skimage.io.imread(img_path)

print("c:", c.shape, "t:", t.shape, "s:", s.shape)
print("c:", c.dtype, "t:", t.dtype, "s:", s.dtype)

print(c[0, 0], c[1023, 0], c[0, 1023], c[1023, 1023])
print(t[0, 0], t[1023, 0], t[0, 1023], t[1023, 1023])
print(s[0, 0], s[1023, 0], s[0, 1023], s[1023, 1023])

print(c.sum())
print(t.sum())
print(s.sum())

И выходные данные вот так:

c: (1024, 1024, 4) t: (1024, 1024, 4) s: (1024, 1024, 4)
c: uint8 t: uint8 s: uint8
[ 50  63  56 182] [131 137 140 193] [29 28 27 94] [123 130 134 190]
[ 79  88  70 182] [185 181 173 193] [74 77 80 94] [180 174 165 190]
[ 79  88  70 182] [185 181 173 193] [74 77 80 94] [180 174 165 190]
# Here seems that opencv only read the alpha channel right, 
# the values of first three channels are much different than other package

539623146
659997127
659997127

Изображение, которое я использую, можно скачать здесь .Итак, вот мой вопрос, как открыть CIF обрабатывать 4-канальный TIFF файл?Потому что, когда я тестирую 3-канальное изображение, все выглядит хорошо.

1 Ответ

0 голосов
/ 26 сентября 2018

Я не покупаю ни минуты, чтобы произошла ошибка округления или какая-то ошибка, связанная с декодированием JPEG, как предполагает связанная статья.

Во-первых, потому что ваше изображение является целым числом, в частности uint8, поэтому нет округления с плавающей запятой, и, во-вторых, потому что сжатие вашего изображения TIF не является JPEG - на самом деле сжатия нет.Вы можете убедиться в этом сами, если вы используете ImageMagick и делаете:

identify -verbose a.tif

или если вы используете tiffinfo, который поставляется с libtiff, например:

tiffinfo -v a.tif

Итак, я провел несколько экспериментов, сгенерировав образцы изображений с ImageMagick следующим образом:

# Make 8x8 pixel TIF full of RGBA(64,128,192) with full opacity
convert -depth 8 -size 8x8 xc:"rgba(64,128,192,1)" a.tif

# Make 8x8 pixel TIFF with 4 rows per strip
convert -depth 8 -define tiff:rows-per-strip=4 -size 8x8 xc:"rgba(64,128,192,1)" a.tif

И OpenCV смог прочитать все эти данные правильно,однако, когда я сделал следующее, все пошло не так.

# Make 8x8 pixel TIFF with RGB(64,128,192) with 50% opacity
convert -depth 8 -define tiff:rows-per-strip=1 -size 8x8 xc:"rgba(64,128,192,0.5)" a.tif

И значения вышли в OpenCV как 32, 64, 96 - да, точно ПОЛОВИНА правильные значения - как OpenCV предварительно умножает альфа.Поэтому я попытался с непрозрачностью 25%, и значения вышли на 1/4 от правильных.Итак, я подозреваю, что есть ошибка в OpenCV , которая предварительно умножает альфа.

Если вы посмотрите на свои значения, вы увидите, что tifffile и skimage читают первый пиксель как:

[ 79  88  70 182 ]

если вы посмотрите на альфа этого пикселя, это 0,713725 (182/255), и если вы умножите каждое из этих значений на это, вы получите:

[ 50  63  56 182 ]

Это именно то, что OpenCV сделал.

В качестве обходного пути, я думаю, вы могли бы разделить на альфа для правильного масштабирования.


В случае, еслиаргумент в том, что OpenCV преднамеренно предварительно умножает альфа, тогда возникает вопрос, почему он делает это для файлов TIFF, но НЕ для файлов PNG:

# Create 8x8 PNG image full of rgb(64,128,192) with alpha=0.5
convert -depth 8 size 8x8 xc:"rgba(64,128,192,0.5)" a.png

Проверка с помощью OpenCV:

import cv2
c = cv2.imread('a.png',cv2.IMREAD_UNCHANGED)

In [4]: c.shape
Out[4]: (8, 8, 4)

In [5]: c
Out[5]: 
array([[[192, 128,  64, 128],
        [192, 128,  64, 128],
...
...

В случае, если кто-то думает, что значения в файле TIF как OpenCV сообщает о них, я могу только сказать, что я написал rgb (64,128,192) с прозрачностью 50%, и япроверил каждое из следующего и обнаружил, что они все согласны , с единственным исключением OpenCV - это именно то, что содержится в файле:

  • ImageMagick v7
  • libvips v8
  • Adobe Photoshop CC 2017
  • PIL/ Подушка v5.2.0
  • GIMP v2.8
  • scikit-image v0.14
...