Используя "gdal_translate" из .TIF в .JPG, как установить фон в белый цвет? - PullRequest
1 голос
/ 16 марта 2020

Я попытался использовать следующую строку:

gdal_translate -of jpeg -a_nodata 0 -b 1 -b 2 -b 3 c:\myfolder\mytif.tif c:\myfolder\myNewtif.jpg

При этом получается изображение с требуемыми характеристиками, но фон становится черным (прозрачность?), Даже если оригинал имеет белый цвет. Могу ли я выполнить sh белый фон только с помощью gdal_translate?

Дамп файла файла с маской: https://filebin.net/f15v63to2x3cc4z0

Дамп файла файла без маски: https://filebin.net/kc940hqotcoeny0w

Вывод gdalinfo для TIF, который создает белый фон, как и ожидалось:

Driver: GTiff/GeoTIFF
Files: test.tif
Size is 4799, 3196
Metadata:
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_XRESOLUTION=300
  TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
  COMPRESSION=LZW
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0, 3196.0)
Upper Right ( 4799.0,    0.0)
Lower Right ( 4799.0, 3196.0)
Center      ( 2399.5, 1598.0)
Band 1 Block=4799x1 Type=Byte, ColorInterp=Red
Band 2 Block=4799x1 Type=Byte, ColorInterp=Green
Band 3 Block=4799x1 Type=Byte, ColorInterp=Blue

Tif, который создает черный фон:

Warning 1: TIFFFetchNormalTag:Incompatible type for "RichTIFFIPTC"; tag ignored
Driver: GTiff/GeoTIFF
Files: 100011_1.tif
Size is 1640, 2401
Metadata:
  TIFFTAG_DATETIME=2020:01:13 12:29:55
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_SOFTWARE=Adobe Photoshop 21.0 (Windows)
  TIFFTAG_XRESOLUTION=300
  TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
  COMPRESSION=LZW
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0, 2401.0)
Upper Right ( 1640.0,    0.0)
Lower Right ( 1640.0, 2401.0)
Center      (  820.0, 1200.5)
Band 1 Block=1640x39 Type=Byte, ColorInterp=Red
  Mask Flags: PER_DATASET ALPHA
Band 2 Block=1640x39 Type=Byte, ColorInterp=Green
  Mask Flags: PER_DATASET ALPHA
Band 3 Block=1640x39 Type=Byte, ColorInterp=Blue
  Mask Flags: PER_DATASET ALPHA
Band 4 Block=1640x39 Type=Byte, ColorInterp=Alpha

Также из следующих изображений, которые имеют черный фон после перевода, gdal выдает это предупреждение "Warning 1: TIFFFetchNormalTag: Incompatible type for "RichTIFFIPTC"; tag ignored"

1 Ответ

1 голос
/ 17 марта 2020

Файл, которым вы поделились в filebin, содержит «альфа» маску, как вы можете видеть в выводе gdalinfo. Маска этого файла говорит о том, что фон замаскирован, а остальная часть изображения - нет.

Если вы, например, отображаете tiff в программе просмотра Ubuntu по умолчанию, вы можете видеть, что пиксели фона замаскированы out (они отображаются в виде контрольной панели) masked tiff

Если вы просматриваете растровые данные, вы также видите, что нижележащие пиксели на фоне черные, а не белые. Вот почему gdal_translate создает jpeg с черными пикселями на заднем плане, потому что они действительно черные (но замаскированы) в исходном файле TIFF.

Если вы абсолютно хотите, чтобы фон был белым, Вы можете сделать это с помощью нескольких строк Python, используя, например, библиотеку rasterio, явно установив маскированные пиксели на белый:

import rasterio

with rasterio.open("101679_1.tif") as src:
    arr = src.read(masked=True)

    # Convert all masked values to white
    arr[arr.mask] = 255

    # Write to jpeg file
    profile = src.profile
    profile["count"] = 3
    profile["driver"] = "jpeg"
    with rasterio.open("test.jpeg", "w", **profile) as dst:
        dst.write(arr[:3])

Это должно дать следующее jpeg-файл:

jpeg with white background

Фрагмент кода, который я включил выше, также будет работать с файлами TIF, которые уже имеют белый фон, потому что строка arr[arr.mask] = 255 не будет ничего делать, если файл не содержит маски. Чтобы обработать каталог, полный .tif файлов, вы можете сделать:

from glob import glob
import rasterio

for tif in glob("*.tif"):
    with rasterio.open(tif) as src:
        arr = src.read(masked=True)

        # Convert all masked values to white
        arr[arr.mask] = 255

        # Write to jpeg file
        profile = src.profile
        profile["count"] = 3
        profile["driver"] = "jpeg"
        with rasterio.open(tif.replace(".tif", ".jpeg"), "w", **profile) as dst:
            dst.write(arr[:3])
...