IT

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

itgroup 2023. 8. 26. 10:42
반응형

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

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

TIFF와 관련된 PIL 방법에 대한 문서를 찾을 수 없었습니다.알아보려고 했지만 "bad mode" 또는 "file type not supported" 오류만 발생했습니다.

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

먼저, 나는 이 페이지에서 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.

문서에 따르면 TIFF를 matplotlib로 처리할 때 실제로 배후에서 작동하는 것은 PIL이지만 PNG는 기본적으로 읽을 수 있지만 저에게는 잘 작동하고 있습니다.

그리고 또.plt.imsave저축 기능

PyLibTiff2023년 4월 현재 컬러당 8비트 이상의 컬러 이미지를 지원하지 않는 PIL보다 더 잘 작동했습니다.

from libtiff import TIFF

tif = TIFF.open('filename.tif') # open tiff file in read mode
# read an image in the current 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 pylibtiff

PyLibTiff의 readme에서도 도서관에 대해 언급하고 있지만 저는 그것을 시도해 본 적었습니다.

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

창에 대한 사전 컴파일된 GDAL 이진 파일에 대한 링크(여기서는 창으로 가정) 링크

어레이에 액세스하는 방법

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()

이미지 스택의 경우, 사용하기가 더 쉽다는 것을 알게 되었습니다.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(img,cmap='gray')
plt.axis('off')
# save the image
plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)

당신은 또한 내가 작가인 파이티프를 사용할 수 있습니다.

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와 Big를 지원합니다.TIFF를 사용하면 큰 이미지의 일부를 읽을 수 있습니다.

라는 멋진 패키지가 있습니다.tifffile.tif 또는 .vmdk 파일로 작업하는 것을 매우 쉽게 합니다.

pip을 사용하여 패키지 설치

pip install tifffile

이제 numpy 배열 형식의 .tif/.tiff 파일을 읽으려면:

from tifffile import tifffile
image = tifffile.imread('path/to/your/image')
# type(image) = numpy.ndarray

numpy 배열을 .tif/.tiff 파일로 저장하려는 경우:

tifffile.imwrite('my_image.tif', my_numpy_data, photometric='rgb')

또는

tifffile.imsave('my_image.tif', my_numpy_data)

패키지에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

cv2 사용

import cv2
image = cv2.imread(tiff_file.tif)
cv2.imshow('tif image',image)

을 tiff로 저장하려면 다음과 .geoTiff사용할 수 있습니다.rasterio

간단한 코드:

import rasterio

out = np.random.randint(low=10, high=20, size=(360, 720)).astype('float64')
new_dataset = rasterio.open('test.tiff', 'w', driver='GTiff',
                            height=out.shape[0], width=out.shape[1],
                            count=1, dtype=str(out.dtype),
                            )
new_dataset.write(out, 1)
new_dataset.close()

numpy 2 GEOtiff에 대한 자세한 내용을 보려면 다음을 클릭하십시오. https://gis.stackexchange.com/questions/279953/numpy-array-to-gtiff-using-rasterio-without-source-raster

OpenImage에 파이썬 바인딩을 사용하는 것이 좋습니다.IO, vfx 세계에서 다양한 이미지 형식을 처리하기 위한 표준입니다.저는 PIL에 비해 다양한 압축 유형을 읽을 때 더 신뢰할 수 있다는 것을 알게 되었습니다.

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

tiff 파일을 읽는 또 다른 방법은 tensorflow api를 사용하는 것입니다.

import tensorflow_io as tfio
image = tf.io.read_file(image_path)
tf_image = tfio.experimental.image.decode_tiff(image)
print(tf_image.shape)

출력:

(512, 512, 4)

텐서 흐름 설명서는 여기에서 찾을 수 있습니다.

이 모듈이 작동하려면 tensorflow-io라는 파이썬 패키지를 설치해야 합니다.

출력 이미지에 4개의 채널이 있기 때문에 (nd.array로 변환한 후) 출력 텐서를 볼 수 있는 방법을 찾을 수 없었습니다.를 사용하여 변환을 시도했습니다.cv2.cvtcolor()깃발을 들고cv2.COLOR_BGRA2BGR 게시물을 본 후에도 여전히 이미지를 볼 수 없었습니다.

이 질문에 대한 답이 없습니다. 그래서 저는 tif/message 파일을 볼 수 있는 다른 방법을 찾았습니다.

import rasterio
from matplotlib import pyplot as plt
src = rasterio.open("ch4.tif")
plt.imshow(src.read(1), cmap='gray')

위의 코드는 당신이 tif 파일을 보는 데 도움이 될 것입니다.또한 다음 사항을 확인하기 위해 아래를 확인합니다.

type(src.read(1)) #see that src.read(1) is a numpy array

src.read(1) #prints the matrix

언급URL : https://stackoverflow.com/questions/7569553/working-with-tiffs-import-export-in-python-using-numpy

반응형