numpy를 사용하여 Python에서 TIFF (가져 오기, 내보내기) 작업
TIFF 이미지를 열고 numpy 배열로 가져올 수있는 Python 루틴이 필요하므로 포함 된 데이터를 분석하고 수정 한 후 나중에 다시 TIFF로 저장할 수 있습니다. (기본적으로 그레이 스케일의 광도 맵으로 픽셀 당 각 값을 나타냄)
뭔가를 찾으려고했지만 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 는 컬러 당 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.py도 언급 되어 있지만 시도하지 않았습니다.
내가 저자 인 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)
I recommend using the python bindings to OpenImageIO, it's the standard for dealing with various image formats in the vfx world. I've ovten found it more reliable in reading various compression types compared to PIL.
import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")
참고URL : https://stackoverflow.com/questions/7569553/working-with-tiffs-import-export-in-python-using-numpy
'IT TIP' 카테고리의 다른 글
| Jquery $ .ajax가 도메인 간 호출에서 IE에서 실패합니다. (0) | 2020.11.19 |
|---|---|
| Tkinter :“Python이 Tk 용으로 구성되지 않았을 수 있습니다.” (0) | 2020.11.19 |
| 전환 후 제약 조건을 적용하는 iOS 8 UIPageViewController (0) | 2020.11.19 |
| Dagger2 종속성-Gradle (0) | 2020.11.19 |
| Pandas 데이터 프레임에서 튜플 열을 분할하는 방법은 무엇입니까? (0) | 2020.11.19 |