복붙노트

[PYTHON] 파이썬에서 개별 픽셀 값으로 이미지를 그리는 가장 빠른 방법은 무엇입니까?

PYTHON

파이썬에서 개별 픽셀 값으로 이미지를 그리는 가장 빠른 방법은 무엇입니까?

일부 데이터를 시각화하는 수단으로 계산 된 픽셀 값을 기반으로 이미지를 그립니다. 본질적으로, 저는 컬러 삼중 항의 2 차원 행렬을 취하여 렌더링하려고합니다.

기존 이미지를 변환하거나 전체 이미지 변환을 수행하지 않기 때문에 이미지 처리가 아니라는 점에 유의하십시오. 렌더링중인 이미지에 미리 결정된 구조가 없기 때문에 벡터 그래픽도 아닙니다. 저는 한 번에 한 픽셀 씩 무정형의 얼룩을 생성 할 것입니다.

지금 당장 1kx1k 픽셀에 대한 이미지를 렌더링해야하지만 확장 가능한 일부가 유용 할 것입니다. 최종 대상 형식은 PNG 또는 기타 무손실 형식입니다.

나는 ImageDraw의 draw.point를 통해 PIL을 사용하고 있으며, 필자가 필요로하는 매우 특이하고 상대적으로 기본적인 기능을 제공한다면 더 빠른 라이브러리를 사용할 수 있을지 궁금하다.

해결법

  1. ==============================

    1.numpy와 scipy를 사용할 수 있다면 (그리고 파이썬에서 큰 배열을 조작한다면, 나는 그들을 추천 할 것이다), scipy.misc.pilutil.toimage 함수는 매우 편리하다. 간단한 예 :

    numpy와 scipy를 사용할 수 있다면 (그리고 파이썬에서 큰 배열을 조작한다면, 나는 그들을 추천 할 것이다), scipy.misc.pilutil.toimage 함수는 매우 편리하다. 간단한 예 :

    import numpy as np
    import scipy.misc as smp
    
    # Create a 1024x1024x3 array of 8 bit unsigned integers
    data = np.zeros( (1024,1024,3), dtype=np.uint8 )
    
    data[512,512] = [254,0,0]       # Makes the middle pixel red
    data[512,513] = [0,0,255]       # Makes the next pixel blue
    
    img = smp.toimage( data )       # Create a PIL image
    img.show()                      # View in default viewer
    

    좋은 점은 서로 다른 데이터 유형으로 이미지를 복사하는 것이므로 부동 소수점 숫자의 2 차원 배열이 현명하게 그레이 스케일 등으로 변환됩니다.

    numpy 및 scipy는 http://docs.scipy.org/doc/scipy/reference/misc.html에서 다운로드 할 수 있습니다.

  2. ==============================

    2.

    import Image
    im= Image.new('RGB', (1024, 1024))
    im.putdata([(255,0,0), (0,255,0), (0,0,255)])
    im.save('test.png')
    

    빨간색, 녹색 및 파란색 픽셀을 이미지의 왼쪽 상단에 놓습니다.

    바이트 값을 처리하려는 경우 im.fromstring ()이 더 빠릅니다.

  3. ==============================

    3.디스크에 이미지 파일을 생성하기 위해 PIL을 사용하고 나중에 이미지 판독기 소프트웨어로 이미지 파일을로드한다고 생각합니다.

    디스크에 이미지 파일을 생성하기 위해 PIL을 사용하고 나중에 이미지 판독기 소프트웨어로 이미지 파일을로드한다고 생각합니다.

    메모리에 그림을 직접 렌더링하면 속도가 약간 향상됩니다 (디스크에 이미지를 쓰고 다시로드하는 비용을 절약 할 수 있습니다). 다양한 파이썬 모듈로 그 이미지를 렌더링하는 방법에 대해서는이 글에서 https://stackoverflow.com/questions/326300/python-best-library-for-drawing을보십시오.

    나는 개인적으로 wxpython과 dc.DrawBitmap 함수를 시도 할 것이다. 외부 이미지 리더가 아닌 그러한 모듈을 사용하면 다음과 같은 많은 이점이 있습니다.

  4. ==============================

    4.파이썬 3 (TIC-80은 오픈 소스 PICO-8)에서 TIC-80 API의 오픈 소스 구현 인 Pyxel을 사용하는 다른 접근법이 있습니다.

    파이썬 3 (TIC-80은 오픈 소스 PICO-8)에서 TIC-80 API의 오픈 소스 구현 인 Pyxel을 사용하는 다른 접근법이 있습니다.

    다음은 검정색 배경에 노란색 픽셀 하나를 그려 넣는 완벽한 앱입니다.

    import pyxel
    
    def update():
    
        """This function just maps the Q key to `pyxel.quit`,
        which works just like `sys.exit`."""
    
        if pyxel.btnp(pyxel.KEY_Q): pyxel.quit()
    
    def draw():
    
        """This function clears the screen and draws a single
        pixel, whenever the buffer needs updating. Note that
        colors are specified as palette indexes (0-15)."""
    
        pyxel.cls(0)            # clear screen (color)
        pyxel.pix(10, 10, 10)   # blit a pixel (x, y, color)
    
    pyxel.init(160, 120)        # initilize gui (width, height)
    pyxel.run(update, draw)     # run the game  (*callbacks)
    

    참고 : 라이브러리는 최대 16 개의 색상 만 허용하지만 어떤 색상을 변경할 수 있으며 더 많은 색상을 허용하기 위해 쉽게 수정할 수 있습니다.

  5. ==============================

    5.이 예에서는 Numpy와 Pillow를 설치하십시오.

    이 예에서는 Numpy와 Pillow를 설치하십시오.

    목표는 먼저 3 가지 (RGB) 숫자 세트의 배열 어레이로 생성하려는 이미지를 표현하는 것입니다 - 성능과 단순성을 위해 Numpy의 array ()를 사용하십시오.

    import numpy
    
    data = numpy.zeros((1024, 1024, 3), dtype=numpy.uint8)
    

    이제 중간 3 픽셀의 RGB 값을 빨강, 녹색 및 파랑으로 설정합니다.

    data[512, 511] = [255, 0, 0]
    data[512, 512] = [0, 255, 0]
    data[512, 513] = [0, 0, 255]
    

    그런 다음 베개의 Image.fromarray ()를 사용하여 배열에서 이미지를 생성합니다.

    from PIL import Image
    
    image = Image.fromarray(data)
    

    이제 이미지를 "표시"합니다 (OS X에서는 미리보기에서 임시 파일로 열립니다).

    image.show()
    

    이 답변은 BADCODE의 답변에서 영감을 받아 사용하기에는 너무 오래되었고 완전히 다르게 작성하지 않고 단순히 업데이트하기에는 너무 달랐습니다.

  6. from https://stackoverflow.com/questions/434583/what-is-the-fastest-way-to-draw-an-image-from-discrete-pixel-values-in-python by cc-by-sa and MIT license