LoginSignup
1
2

More than 5 years have passed since last update.

pbm画像を画素単位で加工するための準備

Posted at

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')

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2