何がインターネットには想像もつかな描画像からの離散的なピクセル値はPython?
-
10-07-2019 - |
質問
い描像に基づき計算したピクセル値、可視化する一部のデータです。基本的にいた2次元マトリクスの色励および描画します。
いことに注意してはいない画像処理、造形、野暮ったすぎやしませんか変既存の画像もそのような全体像の変換、またはベクトルグラフィックはありません定の構造をイメージによっレンダリング-いしょうモノを生産しているアモルファス用途にでも便色の一つのピクセルです。
が必要で描画する画像を約1kx1kピクセルのもので、何か拡張性が役立ちます。最終ターゲット形式は、PNGやその他のロスレスなどの形式です。
まとめに呼び出された瞬間によImageDrawしたことは大きな成果ですね。点かと思って、特異的ではなく、比較的基礎ほか必要はあるので早く図書館利用できますか?
解決
numpy
および scipy
を使用できる場合(およびPythonで大きな配列を操作する場合はお勧めします)、 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
良い点は toimage
がさまざまなデータ型に非常によく対応しているため、浮動小数点数の2D配列はグレースケールなどに適切に変換されます
numpy
と scipy
はこちら。または、pipを使用:
pip install numpy scipy
他のヒント
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(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]
次に、Pillowの を使用しますImage.fromarray()
を使用して、配列からImageを生成します:
from PIL import Image
image = Image.fromarray(data)
今、" show"画像(OS Xでは、プレビューで一時ファイルとして開きます):
image.show()
注
この回答はBADCODEの回答に触発されたもので、使用するには古すぎ、完全に書き直さずに単純に更新するには多すぎます。
異なるアプローチを使用 Pyxel, オープンソースの実施 のTIC-80API にPython3(TIC-80は、オープンソースのPICO-8).
こちらは完全なアプリだけを描きつ黄色のピクセルの黒い背景:
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)
注意:図書館だけでプロの色が変更できる色として始めたから新築したものです。があります。
PILを使用してディスク上にイメージファイルを生成し、後でイメージリーダーソフトウェアでロードすると思います。
メモリ内の画像を直接レンダリングすることにより、速度が少し向上します(ディスクに画像を書き込んでから再ロードするコストを節約できます)。このスレッドをご覧ください https://stackoverflow.com/questions/326300/python-best-さまざまなpythonモジュールでその画像をレンダリングする方法については、描画用ライブラリ。
個人的にwxpythonと dc.DrawBitmap 関数を試します。外部のイメージリーダーではなくそのようなモジュールを使用すると、多くの利点が得られます。
- 速度
- パラメータ用のボタンを備えたインタラクティブなユーザーインターフェイスを作成できます。
- ズームインおよびズームアウト機能を簡単にプログラムできます
- 画像を計算しながらプロットできます。これは、計算に時間がかかる場合に非常に役立ちます