FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


macOSで保存したデータファイルからPythonで画像を作成する

NSImageから白黒画像のデータが欲しい(2)
↑この辺りの続き。
PythonのKerasとmacOSのSceneKitやMetal Performance Shaderを使い強化学習(CNNなので画像入力)をやりたい。

macOSアプリ側のSceneKitで描画するSCNViewのスクリーンショットを一定時間ごとに白黒画像データで取得。
全体の画像データとしてRGBの3チャンネル分のメモリを確保しておき、データを取得するごとに1チャンネル分ずらし最新のを最後のチャンネルに入れる。

macOSアプリで実行時のスクショ

↑するとこのような画像ができる(これはmacOSアプリ実行時のスクショ)。
3ステップ(時間)分の画像が1つの画像に入ってることになる。
元画像のいつもの宇宙船(?)は回転しているのでRGBそれぞれの画像は上図のようにずれて見える。
{
    unsigned char *wholeData;//全体のデータ


    NSData *data = [NSData dataWithBytes:wholeData length:(NofImageData*NofChannel*sizeof(unsigned char))];
    [data writeToFile:filePath atomically:YES];
}
↑macOSアプリ側の保存部分のコード。NSDataにしてからファイルに保存してる。
ここでNofImageDataは1チャンネル分のピクセル数、NofChannelはチャンネル数(今回は3)。

Finderで確認したファイルの容量

↑8ビット=1バイト、今回はサイズが200x200なので3x200x200 = 120,000バイトをバイナリで保存してる。計算通りだ。


次にPython側。
先ほど保存したデータファイルを読み込んで画像化してみる。
画像関連でPILライブラリを使う。
{
    from PIL import Image

    def img_show(img) :
        pil_img = Image.fromarray(np.uint8(img))
        pil_img.show()


    data = open(FilePath, "rb").read()

    size=(width, height)
    image = Image.new('RGB',size) #白黒は’L’

    for y in range(size[1]) :
        for x in range(size[0]) :
            ite = (y * size[0] + x) * 3
            r = data[ite]
            g = data[ite+1]
            b = data[ite+2]
        
            image.putpixel((x,y) , (r,g,b))

    img_show(image)
}
↑PILでカラー画像のオブジェクト(image)を作成して、そこにputpixelで入れるだけ。

Pythonで出力した画像のスクショ

↑元画像と同じになった!

意図通りにはできたんだが、、、気付いた。なんでこれちゃんと動いたんだ?
ということで続く。



<< 浮動小数点数を持つバイナリファイルをPythonで読み込む  TopPage  Amazonのほしい物リスト(公開用)を作ってみた >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1225-94e45b41




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad