Numpy 배열을 이미지로 저장
Numpy 배열 유형의 행렬이 있습니다. 디스크에 이미지로 쓰려면 어떻게해야합니까? 모든 형식이 작동합니다 (png, jpeg, bmp ...). 한 가지 중요한 제약은 PIL이 존재하지 않는다는 것입니다.
PyPNG 를 사용할 수 있습니다 . 순수 Python (종속성이 없음) 오픈 소스 PNG 인코더 / 디코더이며 NumPy 배열을 이미지로 작성 하는 것을 지원합니다 .
이것은 PIL을 사용하지만 일부는 유용 할 수 있습니다.
import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)
편집 : 현재 scipy
버전은 모든 이미지를 정규화하기 시작하여 최소 (데이터)가 검은 색이되고 최대 (데이터)가 흰색이됩니다. 데이터가 정확한 그레이 레벨 또는 정확한 RGB 채널이어야하는 경우에는 원하지 않습니다. 해결책:
import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
PIL을 사용한 답변 (유용한 경우에 대비하여).
numpy 배열 "A"가 주어진 경우 :
from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")
"jpeg"를 원하는 거의 모든 형식으로 바꿀 수 있습니다. 형식에 대한 자세한 내용은 여기
로 matplotlib
:
import matplotlib
matplotlib.image.imsave('name.png', array)
matplotlib 1.3.1에서 작동하지만 더 낮은 버전에 대해서는 모르겠습니다. docstring에서 :
Arguments:
*fname*:
A string containing a path to a filename, or a Python file-like object.
If *format* is *None* and *fname* is a string, the output
format is deduced from the extension of the filename.
*arr*:
An MxN (luminance), MxNx3 (RGB) or MxNx4 (RGBA) array.
타사 의존성이없는 스 니펫 인 순수 Python (2 & 3).
이 함수는 압축 된 트루 컬러 (픽셀 당 4 바이트) RGBA
PNG를 씁니다 .
def write_png(buf, width, height):
""" buf: must be bytes or a bytearray in Python3.x,
a regular string in Python2.x.
"""
import zlib, struct
# reverse the vertical line order and add null bytes at the start
width_byte_4 = width * 4
raw_data = b''.join(
b'\x00' + buf[span:span + width_byte_4]
for span in range((height - 1) * width_byte_4, -1, - width_byte_4)
)
def png_pack(png_tag, data):
chunk_head = png_tag + data
return (struct.pack("!I", len(data)) +
chunk_head +
struct.pack("!I", 0xFFFFFFFF & zlib.crc32(chunk_head)))
return b''.join([
b'\x89PNG\r\n\x1a\n',
png_pack(b'IHDR', struct.pack("!2I5B", width, height, 8, 6, 0, 0, 0)),
png_pack(b'IDAT', zlib.compress(raw_data, 9)),
png_pack(b'IEND', b'')])
... 데이터는 다음과 같이 바이너리로 열린 파일에 직접 기록되어야합니다.
data = write_png(buf, 64, 64)
with open("my_image.png", 'wb') as fd:
fd.write(data)
- 원본 출처
- 이 질문의 녹 포트 도 참조하십시오 .
- @Evgeni Sergeev 덕분에 사용 예 : https://stackoverflow.com/a/21034111/432509
있다 opencv
(파이썬을 위해 여기 문서 ).
import cv2
import numpy as np
cv2.imwrite("filename.png", np.zeros((10,10)))
저장 이외의 다른 처리가 필요한 경우에 유용합니다.
matplotlib가 있으면 다음을 수행 할 수 있습니다.
import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)
파이썬에서 'skimage'라이브러리를 사용할 수 있습니다
예:
from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)
@ ideasman42의 답변에 대한 부록 :
def saveAsPNG(array, filename):
import struct
if any([len(row) != len(array[0]) for row in array]):
raise ValueError, "Array should have elements of equal size"
#First row becomes top row of image.
flat = []; map(flat.extend, reversed(array))
#Big-endian, unsigned 32-byte integer.
buf = b''.join([struct.pack('>I', ((0xffFFff & i32)<<8)|(i32>>24) )
for i32 in flat]) #Rotate from ARGB to RGBA.
data = write_png(buf, len(array[0]), len(array))
f = open(filename, 'wb')
f.write(data)
f.close()
그래서 당신은 할 수 있습니다 :
saveAsPNG([[0xffFF0000, 0xffFFFF00],
[0xff00aa77, 0xff333333]], 'test_grid.png')
제작 test_grid.png
:
(에서 높은 바이트를 줄여 투명도 작동합니다 0xff
.)
scipy.misc
imsave
기능 에 대한 사용 중단 경고를 표시하고 imageio
대신 사용을 제안합니다 .
import imageio
imageio.imwrite('image_name.png', img)
matplotlib svn에는 이미지를 이미지로 저장하는 새로운 기능이 있습니다-축 등이 없습니다. matnlotlib svn의 image.py에서 직접 복사하지 않고 svn을 설치하지 않으려는 경우 백 포트하는 매우 간단한 기능입니다. 간결함을위한 docstring) :
def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, origin=None):
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
fig = Figure(figsize=arr.shape[::-1], dpi=1, frameon=False)
canvas = FigureCanvas(fig)
fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin)
fig.savefig(fname, dpi=1, format=format)
직접 완전히 작동하는 예제를 찾는 사람들에게 :
from PIL import Image
import numpy
w,h = 200,100
img = numpy.zeros((h,w,3),dtype=numpy.uint8) # has to be unsigned bytes
img[:] = (0,0,255) # fill blue
x,y = 40,20
img[y:y+30, x:x+50] = (255,0,0) # 50x30 red box
Image.fromarray(img).convert("RGB").save("art.png") # don't need to convert
또한 고품질 jpeg를 원한다면
.save(file, subsampling=0, quality=100)
세계는 아마도 numpy 배열을 PNG 파일에 쓰는 데 아직 또 다른 패키지가 필요하지 않지만 충분하지 않은 사람들을 위해 최근 numpngw
에 github을 사용했습니다.
https://github.com/WarrenWeckesser/numpngw
그리고 pypi에서 : https://pypi.python.org/pypi/numpngw/
유일한 외부 의존성은 numpy입니다.
다음 examples
은 저장소 디렉토리의 첫 번째 예입니다 . 필수 라인은 단순히
write_png('example1.png', img)
img
numpy 배열은 어디에 있습니까 ? 해당 줄 앞의 모든 코드는 import 문과 create code img
입니다.
import numpy as np
from numpngw import write_png
# Example 1
#
# Create an 8-bit RGB image.
img = np.zeros((80, 128, 3), dtype=np.uint8)
grad = np.linspace(0, 255, img.shape[1])
img[:16, :, :] = 127
img[16:32, :, 0] = grad
img[32:48, :, 1] = grad[::-1]
img[48:64, :, 2] = grad
img[64:, :, :] = 127
write_png('example1.png', img)
생성하는 PNG 파일은 다음과 같습니다.
회색조 이미지를 원한다고 가정합니다.
im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")
[Py] Qt를 이미 사용하고 있다면 qimage2ndarray에 관심이있을 수 있습니다 . 버전 1.4 (방금 출시)부터 PySide도 지원되며 imsave(filename, array)
scipy와 비슷한 작은 기능이 있지만 PIL 대신 Qt를 사용합니다. 1.3에서는 다음과 같은 것을 사용하십시오.
qImage = array2qimage(image, normalize = False) # create QImage from ndarray
success = qImage.save(filename) # use Qt's image IO functions for saving PNG/JPG/..
(1.4의 또 다른 장점은 순수한 파이썬 솔루션이라는 점입니다.이 솔루션은 훨씬 가볍습니다.)
사용하십시오 cv2.imwrite
.
import cv2
assert mat.shape[2] == 1 or mat.shape[2] == 3, 'the third dim should be channel'
cv2.imwrite(path, mat) # note the form of data should be height - width - channel
Imageio 는 애니메이션 이미지, 비디오, 볼륨 데이터 및 과학적 형식을 포함한 광범위한 이미지 데이터를 읽고 쓸 수있는 쉬운 인터페이스를 제공하는 Python 라이브러리입니다. 크로스 플랫폼이며 Python 2.7 및 3.4+에서 실행되며 설치가 쉽습니다.
이것은 회색조 이미지의 예입니다.
import numpy as np
import imageio
# data is numpy array with grayscale value for each pixel.
data = np.array([70,80,82,72,58,58,60,63,54,58,60,48,89,115,121,119])
# 16 pixels can be converted into square of 4x4 or 2x8 or 8x2
data = data.reshape((4, 4)).astype('uint8')
# save image
imageio.imwrite('pic.jpg', data)
파이썬 환경 Spyder에서 작업하는 경우 변수 탐색기에서 배열을 마우스 오른쪽 버튼으로 클릭하고 이미지 표시 옵션을 선택하는 것보다 더 쉬울 수 없습니다.
이것은 대부분 PNG 형식으로 이미지를 dsik에 저장하도록 요청합니다.
이 경우 PIL 라이브러리가 필요하지 않습니다.
참고 URL : https://stackoverflow.com/questions/902761/saving-a-numpy-array-as-an-image
'IT story' 카테고리의 다른 글
Eclipse가 시작시 중단되는 것을 어떻게 방지합니까? (0) | 2020.04.19 |
---|---|
호스트에서 Vagrant guest로 단일 파일을 복사하는 가장 쉬운 방법은 무엇입니까? (0) | 2020.04.19 |
Swift에서 UI_USER_INTERFACE_IDIOM ()으로 현재 장치 감지 (0) | 2020.04.19 |
iOS 시뮬레이터에서 콘솔 로그를 얻으려면 어떻게해야합니까? (0) | 2020.04.19 |
가장 일반적인 SQL 안티 패턴은 무엇입니까? (0) | 2020.04.19 |