LoginSignup
169
137

More than 1 year has passed since last update.

pythonで画像処理 〜黒板の写真を撮って文字以外を透過させた画像を作る〜

Last updated at Posted at 2019-10-07

#目標とモチベーション
大学で講義ノートをipadのノートアプリでとっている私のような者が最終的に行き着くのはこんなノートです
IMG_0812.PNG

そう、黒板の写真を撮ってノートに貼っつけるわけです。
このやり方はとても楽な代わりに不恰好なノートになってしまいます…
そこでpythonistaでpython動かして黒板に書かれた文字だけ残した透過画像にしてやれば楽で、なおかつそこそこ綺麗なノートになるはず…と思ったのでやってみました。

#画像の処理

sample.py
import photos
from PIL import Image
from PIL import ImageOps

今回はすべての処理をpythonistaで行いたかったのでpythonistaでも動く上記のモジュール等をimportします

sample.py
img=photos.capture_image()
mono=img.convert("L")
mono=ImageOps.invert(mono)

photos.capture_image()でpythonistaからカメラを起動し黒板の写真を撮ります。
撮った写真はimgにPIL.Imageオブジェクトとして渡されます。

convert()では画像のモードを変更することができます。今回はグレースケールにしたかったので上記のようにしました。

次に、最終的に黒板の文字は黒にしたいのでネガポジ反転しておきます。
ここまでで以下のように画像が処理されてきました。

IMG_9C6D09310ECD-1.jpeg

image.png

image.png

そしてここからバイナリ値で0と255の2値に落とし込みます

sample.py
i =155
mono=mono.point(lambda x: 0 if x < i else x) 
mono=mono.point(lambda x: 255 if x >= i else x)

image.png
元の画質のせいで若干潰れているところがありますが結構綺麗になりましたね。

さてここから白い部分を透けさせていきます

Image.putalpha()は与える引数によって透過率を設定することができます。
0を与えると100%透過、255を与えると0%透過(不透過)となります。
また、引数に透過させたい画像と同サイズで8bitグレースケールのImageオブジェクトを指定することもでき、この場合も透過率は先ほどと同様です。

今、先ほどの画像の白い部分を100%透過させたいので、これをネガポジ反転した画像を引数として与えます

sample.py
temp=mono.copy()
temp=ImageOps.invert(temp)
mono.putalpha(temp)
mono.show()

最終的にこんな感じになりました
image.png
少しわかりにくいですがしっかり透けています
ノートに貼り付けてみましょう
IMG_93EF67348226-1.jpeg

いい感じです。これでノートを書くのに夢中になって話を聞けない!
なんてことは無くなります

なお有志の手によって2値に落とし込むときの基準値をuiで微調整して多種多様な教授の筆圧に対応できるようになった完成品がこちらに置いてあります
https://github.com/Keisuke168/auto_boading

#補足
私の場合はiPhoneのpythonistaにこのスクリプトを入れておき、ショートカットから動かしました。
import clipboardして一番最後に

hosoku.py
clipboard.set_image(mono)

これをつけておけばクリップボードにコピーまでできるのであとはipad上でペーストするだけです

169
137
4

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
169
137