[python] numpy를 사용하여 Python에서 TIFF (가져 오기, 내보내기) 작업

픽셀 데이터를 분석하고 수정 한 다음 다시 TIFF로 저장할 수 있도록 TIFF 이미지를 열고 numpy 배열로 가져 오는 파이썬 메서드가 필요합니다. (기본적으로 그레이 스케일의 광도 맵으로 픽셀 당 각 값을 나타냄)

TIFF와 관련된 PIL 메서드에 대한 문서를 찾을 수 없습니다. 알아 내려고했지만 “나쁜 모드”또는 “지원되지 않는 파일 형식”오류 만 발생했습니다.

여기서 무엇을 사용해야합니까?



답변

첫째,에서 테스트 TIFF 이미지 다운로드 페이지 이라고를 a_image.tif. 그런 다음 다음과 같이 PIL로 열었습니다.

>>> from PIL import Image
>>> im = Image.open('a_image.tif')
>>> im.show()

이것은 무지개 이미지를 보여주었습니다. numpy 배열로 변환하려면 다음과 같이 간단합니다.

>>> import numpy
>>> imarray = numpy.array(im)

이미지의 크기와 배열의 모양이 일치하는 것을 볼 수 있습니다.

>>> imarray.shape
(44, 330)
>>> im.size
(330, 44)

그리고 배열에는 다음 uint8값이 포함 됩니다.

>>> imarray
array([[  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       ...,
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246]], dtype=uint8)

배열 수정을 마치면 다음과 같이 PIL 이미지로 되돌릴 수 있습니다.

>>> Image.fromarray(imarray)
<Image.Image image mode=L size=330x44 at 0x2786518>


답변

TIFF 파일을 읽기 위해 matplotlib를 사용합니다.

import matplotlib.pyplot as plt
I = plt.imread(tiff_file)

I유형이 ndarray됩니다.

문서에 따르면 matplotlib는 기본적으로 PNG 만 읽으므로 TIFF를 처리 할 때 실제로 PIL이 작동하지만 이것은 잘 작동합니다.

plt.imsave저장 기능 도 있습니다 .


답변

GDAL을 사용하여이 작업을 수행 할 수도 있습니다. 나는 그것이 지리 공간 툴킷이라는 것을 알고 있지만지도 제작 제품이 필요하지는 않습니다.

Windows 용 사전 컴파일 된 GDAL 바이너리에 대한 링크 (여기에서 Windows 가정)
http://www.gisinternals.com/sdk/

어레이에 액세스하려면 :

from osgeo import gdal

dataset = gdal.Open("path/to/dataset.tiff", gdal.GA_ReadOnly)
for x in range(1, dataset.RasterCount + 1):
    band = dataset.GetRasterBand(x)
    array = band.ReadAsArray()


답변

pylibtiff 는 2020 년 6 월 현재 색상 당 8 비트 이상의 색상 이미지를 지원하지 않는 PIL보다 더 잘 작동했습니다 .

from libtiff import TIFF

tif = TIFF.open('filename.tif') # open tiff file in read mode
# read an image in the currect TIFF directory as a numpy array
image = tif.read_image()

# read all images in a TIFF file:
for image in tif.iter_images():
    pass

tif = TIFF.open('filename.tif', mode='w')
tif.write_image(image)

다음을 사용하여 pylibtiff를 설치할 수 있습니다.

pip3 install numpy libtiff

pylibtiff의 readme에도 언급 tifffile되어 있지만 시도하지 않았으며 표면적으로 오픈 소스이지만 코드를 더 이상 사용할 수 있다고 생각하지 않습니다 (PyPI 패키지에서 수동으로 추출하는 것 외에).


답변

내가 저자 인 pytiff 를 사용할 수도 있습니다 .

    import pytiff

    with pytiff.Tiff("filename.tif") as handle:
        part = handle[100:200, 200:400]

    # multipage tif
    with pytiff.Tiff("multipage.tif") as handle:
        for page in handle:
            part = page[100:200, 200:400]

상당히 작은 모듈이고 다른 모듈만큼 기능이 많지 않을 수 있지만 타일링 된 tiff 및 bigtiff를 지원하므로 큰 이미지의 일부를 읽을 수 있습니다.


답변

이미지 스택의 경우 scikit-image읽기, matplotlib표시 또는 저장 이 더 쉽습니다 . 다음 코드로 16 비트 TIFF 이미지 스택을 처리했습니다.

from skimage import io
import matplotlib.pyplot as plt

# read the image stack
img = io.imread('a_image.tif')
# show the image
plt.imshow(mol,cmap='gray')
plt.axis('off')
# save the image
plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)


답변

Vfx 세계에서 다양한 이미지 형식을 처리하기위한 표준 인 OpenImageIO에 대한 Python 바인딩을 사용하는 것이 좋습니다. 나는 PIL에 비해 다양한 압축 유형을 읽는 데 더 신뢰할 수 있음을 발견했습니다.

import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")