문제

나는 매트릭스에는 유형의 Numpy 배열입니다.어떻게 그것을 작성하여 디스크 이미지로?모든 형식으로 작업(png,jpeg,bmp,...).하나의 중요한 관건은 PIL 은 존재하지 않습니다.

도움이 되었습니까?

해결책

당신이 사용할 수있는 pypng. 순수한 파이썬 (종속성 없음) 오픈 소스 PNG 인코더/디코더 및 IT입니다. 지원합니다 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')

사용하는 답 (유용한 경우).

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.

enter image description here

순수한 파이썬 (2 & 3), 제 3 자 종속이없는 스 니펫.

이 함수는 압축, True-Color (픽셀 당 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)

거기 있습니다 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)

이것은 플롯을 저장합니다 (이미지 자체가 아님).enter image description here

@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:

Grid of red, yellow, dark-aqua, grey

(투명도는 또한 높은 바이트를 줄임으로써 작동합니다. 0xff.)

파이썬에서 '스키지'라이브러리를 사용할 수 있습니다

예시:

from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)

scipy.misc 감가 상각 경고를 제공합니다 imsave 기능 및 사용법을 제안합니다 imageio 대신에.

import imageio
imageio.imwrite('image_name.png', img)

Matplotlib SVN은 이미지 만 이미지로 저장하는 새로운 기능을 가지고 있습니다. 간결함을위한 문서) :

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 배열입니다. 해당 라인 앞의 모든 코드는 가져 오기위한 가져 오기 명령문 및 코드입니다. 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 파일입니다.

example1.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  

에서 작업하는 경우에는 파이썬 환경 스파이더,그때 그것을 얻을 수 없습니다 더 쉽게보다는 그냥 마우스 오른쪽 클릭합 배열 변수에서 탐색기,그리고 다음을 선택 하여 이 활성화되었는지 확인합니다.

enter image description here

이 물을 것이다 당신은 이미지로 저장하 dsik,대부분에서 PNG 형식입니다.

PIL 라이브러리가 필요하지 않습니다 이 경우에.

Imageio 애니메이션 이미지, 비디오, 볼륨 측정 데이터 및 과학적 형식을 포함하여 광범위한 이미지 데이터를 읽고 쓸 수있는 쉬운 인터페이스를 제공하는 파이썬 라이브러리입니다. 크로스 플랫폼이며 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top