読者です 読者をやめる 読者になる 読者になる

うにの貝焼き

ただしうには食えない

サーマルプリンタを使って画像を印刷する

どうも、サーマルプリンタおじさんです。皆様いかがお過ごしでしょうか。
先日のtwitterのタイムラインをレシート状に印刷するやつの反響がそこそこあって非常に驚いたところです。

実際のところ、twitterのタイムラインをレシート状に印刷するものは結構前にもやっている人はいたのでまさかここまで伸びるとは思ってもいなかったところです。

さて、今回はサーマルプリンタを使って画像を印刷することを試してみました。ただ、サーマルプリンタは白か黒の2色でしか色の表現ができないため色の濃淡をどうするかが鍵となります。そこで、Pillow + numpyを使って画像をグレースケール化した後に誤差拡散法を使用し、色の濃淡に応じて画像を2値化した上で印刷を行うことにしました。

誤差拡散法

誤差拡散法(random dithering)とは、表示色数の制限を補って色の階調を滑らかに表現するディザリング(dithering)と呼ばれる描画手法の一つであります。主にデジタルカメラやイメージスキャナ、プリンタ、FAXなどで使われているそうです。
(参考:誤差拡散法とは|random dithering|ランダムディザリング - 意味/解説/説明/定義 : IT用語辞典

要は、「誤差を拡散する」ので周囲のピクセルに誤差を拡散してそれを繰り返して最終的に画像全体に誤差を拡散する手法です(言葉が違ってたらすんません。)。パソコンで書くのが面倒だったのでこういう感じになるってのを手書きで書いてみました。

f:id:Unicore32:20160213185334j:plain

ぶっちゃけ、他のサイト見たほうがわかりやすいです。要はこの処理をnumpy使ってやりました。まあ実際に比較してみないとわからないので、今回は某クッキー先輩を実験台として比較画像を作ってみました。

f:id:Unicore32:20160213190704j:plain

ソースコード

汚すぎるのでテスト明けに直してから公開します。

動作の様子

補足

ちなみに、文字だけ印刷する場合だったら誤差拡散法を使わず白黒の閾値だけで判別して2値化させたほうが鮮明に出ます。

f:id:Unicore32:20160213203221j:plain

今後

  • 名刺を印刷できるようにする
  • GUI化(SDK化)して楽に印刷できるようにする
  • アンヨヨイヨ端末とかで使えたら最高だな〜〜〜

参考文献

誤差拡散法: koujinz blog

ハーフトーン処理(誤差拡散法) - [物理のかぎしっぽ]