픽셀 데이터를 분석하고 수정 한 다음 다시 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
저장 기능 도 있습니다 .
ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
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()
.astype(sometype)
통화 끝에 통화를 추가하여 전송할 수 있습니다 ReadAsArray()
. 이것이 복사본인지 확실하지 않습니다 (테스트하지 않았 음).
xrange
, 더 오타없는 xrange
의 파이썬 2 버전입니다 range
. 파이썬 3은 여전히 적극적으로 개선되고 있지만 파이썬 2는 그렇지 않기 때문에이 편집을 수락했습니다.
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")