Почему cv2 mask imwrite уменьшает детализацию изображения?

#python #opencv #tiff #filesize

#python #opencv #tiff #размер файла

Вопрос:

У меня есть 1,17 Гб tiff («тепловая карта»), который я хочу обрезать до контура другого 425,7 Мб tiff («тротуар»). Тепловая карта содержит тонкие цветовые оттенки, которые я хочу сохранить в конечном изображении. Я использую bitwise_and операцию для применения изображения дорожного покрытия в качестве маски и использования cv2.imwrite для сохранения. Но результирующему tiff не хватает едва заметного затенения и составляет всего 10,5 Мб. Это кажется большим уменьшением размера и, вероятно, поэтому конечное изображение имеет меньшую детализацию.

Что я могу сделать, чтобы сохранить тонкое затенение ввода в выходном изображении?

 import sys
import cv2
import numpy as np

heatmapfile  = "heatmap.tif"
pavementfile = "pavement.tif"
output       = "masked_heatmap.tif"

heatmap  = cv2.imread(heatmapfile,-1)
pavement = cv2.imread(pavementfile,0)

# apply thresholding to create mask
ret, binimg = cv2.threshold(pavement,1,255,cv2.THRESH_BINARY)

# make binary image same size as heatmap, needed for bitwise_and
bin_4ch = cv2.cvtColor(binimg,cv2.COLOR_GRAY2BGRA)

# mask the heatmap and save
hm_masked = cv2.bitwise_and(heatmap,bin4ch)
cv2.imwrite(output, hm_masked)
  

Комментарии:

1. Вы просматривали OpenCV ImwriteFlags , особенно те, которые касаются изображений TIFF?

2. @HansHirse: спасибо за совет! Действительно, существует флаг для сжатия в формате TIFF, и по умолчанию используется LZW: IMWRITE_TIFF_COMPRESSION . Это объясняет изменение размера файла, но не изменение внешнего вида. Разве несжатый tiff не должен выглядеть так же, как оригинал?