Shade3D 公式

Xshade.imageとnumpy.arrayの相互変換について

shade
Tags: #<Tag:0x007f0ba01c35b0>

#1

イメージオブジェクトやレンダリングイメージに対する画像処理をスクリプトで実装する際の作法についての相談です.知恵をお貸しください.

一般にShade3D上のオブジェクトに対する画像処理は,xshade.imageを取得して何らかの形で処理をするスクリプトになります.このとき,画像処理の部分はnumpy.arrayに対する演算として実装するようにし,

  1. xshade.imageを取得
  2. xshade.image -> numpy.array
  3. 画像処理を実行
  4. numpy.array -> xhade.image

という順序で処理を行いたいと思います.

2や4の部分を,xshade.image.get_pixel() / .set_pixel()を使ってループ処理で1ピクセルずつ値を取得する方法で実装したところ,この処理があまり速くなく,実行速度のボトルネックになってしまっています.

xshade.imageとnumpy.arrayの相互変換について,get_pixel() / set_pixel()を使うよりも効率の良い方法をご存知の方はいらっしゃいませんでしょうか?


#2

CASPR003 さん、こんにちは、

自身ではこの手の画像処理を行ったことはないので、いささか漠然とした情報ですが、一つの方法として次のような手順が考えられます。

  1. xshade.image から temp file として image file を出力
  2. image file から raw data を得る
  3. rawdata から numpy.array を作成

numpy.array で処理後は上記の逆順をたどることになりますが、image file から shade.image への読み込みをどうするかは ? です。

image file から raw data を得るには、PIL library を使います。

下記の keyword で検索すれば、いろいろと具体的な解説が日本語でも得られると思います。

理解を深めるには binary file に関する基礎知識が必要ですが、この手のテーマについては sample code も数多く入手できそうです。

python
numpy.array
PIL
image
raw image data


#3

ToshiakiKatohさん

一時ファイル経由の方が速いという可能性はあまり考えていませんでしたが,1pxずつget_pixelを呼ぶよりは良いかもしれませんね.
ShadeにPIL入れたりするのも含めて,少し時間がかかりそうですので,ひとまずお礼のみ申し上げます.ありがとうございます.