pbmのバイナリ部分を自分で加工するんじゃなく、
ライブラリ使って簡単に書けないかなと思ったところ、numpyがいいらしい。
pbmからndarrayに入れるまではよかったのだけど、
ndarrayから2値のpbmに戻す方法がわかりません。
NumPyのarrayとPILの変換Add Star
↑など参照したものの、
2値画像のarrayを画像に戻すときに、
1bitじゃなく8bitの1に値が置き換わってしまうのでpbmにはなってない。
pillowじゃだめなんだろうか。
array_to_pbm.py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
#画像ファイル開く
file_name = 'lf_img_small.pbm'
lf_img = Image.open(file_name)
#2値画像の場合はbool型で値が格納されています。
#numpyではbool型はnumpy.bool8として定義されています。
#配列に読み込む際には読み込みモードとしてbool8を指定します。
lf_img_ary = np.array(lf_img, np.bool8)
width, height = lf_img.size
print(width, height)
#配列の素性を調べてみる。
print('****************')
print(img_ary.flags)
print(img_ary.ndim)
print(img_ary.size)
print(img_ary.shape)
print(img_ary.itemsize)
print(img_ary.strides)
print(img_ary.nbytes)
print(img_ary.dtype)
print('****************')
for x in range(height):
for y in range(width):
if y ==0 :
print(img_ary[x,y])
#画像に変換する場合はfromarrayみたいなんだけど、
#bool8だとエラーになる。
Image.fromarray(np.bool8(img_ary)).save('ary_to_pbm_file.pbm')
#uint8を指定だとpbmじゃなくpgmができている。
Image.fromarray(np.uint8(img_ary)).save('ary_to_pbm_file.pbm')