「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



断片的にメモ残している、Python3、Pillow、tkinter
を使った画像処理について、計算方法の考え方自体は
なかなかいいところまで行ったので、現時点までの
ゴニョゴニョをちょっと纏めておくことに。

発端は、aliexで買ったブギーボードみたいなやつ、便利
なんだけど、PCに見やすい画像で保存しておきたいよな、
と思ったことから。

書くときに電気食わないし、消すときにも電気ちょっと
しか食わないし、便利なんだけど、PCにデータとして残す
機能が無い。デジカメとかで撮っておけばいいんだけど、
コントラストが薄くて見づらいし、紙に刷りだして沢山
刷りだすとしても、元画像そのままだと見づらい。

で、なんとかきれいに二値化できないかな?と思ったわけ。

で、なんとなく思いついたロジックだと、完璧じゃないに
しても、そこそこ文字や画像を浮き上がらすことは可能な
はず。ただし、処理時間が超長くなりそうで心肺だな、と。

サンプル画像。処理時間をそこそこ短くするために、ひとまず
640×480ぐらいの小さいものを使ってみる。



こんな風に、コントラストが結構小さくて、もともと
見づらいんだよな。

ちなみに、この画像を、レタッチソフトとか使って単純な
二値化をしてみると、こんな具合。



ライトが差している右上は白っぽく明るくなってて、
左下は逆に暗くなっている。
なので、二値化の弁別値を弄るだけだと、こんな具合に
右上が白く飛んで、左下は黒くつぶれてしまうわけ。

同じ事を、普通のデジカメ画像でも行ってみる。
こないだも挙げたネコ写真だと…



こうなる。クロネコだ。



まぁ、ネコの写真はともかく、ブギーボードもどきに
書いた(描いた)文字や絵が、黒い地からきれいに分離
できる画像処理方法をいろいろ模索してみた。


ざっくりした計算処理内容を纏めると、あるドットの
周辺の平均値を求めて、その平均値よりも明るければ
明るい点に、暗ければ黒として描けば、周辺ドットとの
比較によってきれいに文字や絵が浮き上がるはずだろう、
と。
というわけで、愚直に処理ロジックに落とし込んで実行
してみたのが、こないだまでのお話。

なんといっても、Python3用のメジャーな画像処理用
ライブラリPillowを使って、ドットの明るさの平均値を
取ったり、それを新しい画像データに描きこんで行く
ための、getpixel、putpixelがものすごく遅いって
ところが大問題。こないだも書いたけど、

https://brown.ap.teacup.com/nekosan0/3779.html

640×480程度の画像をドットtoドットでコピーするだけ
でも、4秒も掛かっちゃう。

これだけ遅いとなると、周囲の平均値を取って比較する
処理を入れたら、二桁遅い時間が掛かるだろうと思って、
いろいろ考えてみた結果、とりあえず配列(Pythonだと
リスト形式)のデータに一旦変換しちゃえば、getpixel、
putpixelよりも速いだろうと。

で、試してみたら…そんな劇的には速くならなかった。

まぁ、速くならないのはひとまず仕方ないとして、高速化
の工夫は後回しとして、CPU時間をゴリゴリに掛けてでも
一連の処理を実行して、結果の画像を眺めてみたい。
プログラムに愚直にロジックを落とし込んで行ってみる。


ある1ドットについて、その周辺の縦横21ドットずつ
(合計441ドット)の平均値を求めて、その平均値より
明るければ緑、暗ければ黒としてドットを打ってみたのが
これ。



まぁ、想像通り、文字や図が浮き出てきた。画像が640×480
と粗いので、みづらいけれど、まぁなんとか文字や図は
ちゃんと読み取れる。
けど、見てのとおり、文字や図が書かれているところから
ちょっと離れたところ(何も書かれていない真っ黒なところ)
は、微小なノイズを拾って、妙な模様が出てきちゃう。

ちなみに、ネコの写真をやってみると、



こんな風に、薄暗い部分ですら、ネコの毛の模様が判る
程度に浮き上がらせてくるのが面白いところ。ピントが
外れている芝生の部分はモヤモヤした模様になって出て
きた。


現時点の問題は、この画像処理1枚行うのに、なんと
15分近く掛かっちゃう。
平均値の計算を愚直に行っているので、計算量が無駄に
多いのが原因。FFTの計算みたいに、これをもっと減らす
必要がありそう。まぁ、高速化はまた後の課題に。


その前に、文字や絵が描かれていない黒い部分に載っちゃう
モヤモヤノイズをナントカしたい。

というわけで、黒い部分に注目して、その辺の計算をちょっと
加えてみたのがこれ。



うん。まぁ、狙った感じになった。さっきの



元画像と比べてみると、こんな具合。うん。

ただ、今はまだ少しマジックナンバーをプログラム中で
使ってるので、その辺をたいていの画像でも自動計算
できるように変えていく必要がある。そのロジックは
もう考えてあるので、あとはその辺の処理を足しこんで
いけばokなはず。


あと、現時点のプログラムだと、広い面積を塗りつぶし
した場合に、(平均値が高くなっちゃうので)その中央部分
が黒く沈んでしまう恐れがある。なので、その辺についても
手を当てないといけない事はわかっていて、その対策も一応
考えてある。

その辺の考え方をさらにプログラムに追加すれば、計算方法
の内容としては完成っぽいんだよな。

そしたら、高速化を計ろう。


というのが、現時点までの進捗。





https://www.youtube.com/watch?v=4u5O3Ri1Dfc&t=32m20s

ゆいちゃんの、「乾きやすい」マークの顔真似。







https://www.youtube.com/watch?v=C0ZXOWa9LS0

Landing High Japanって、なんだ?
これ知らなかったな。こんなゲームあったのか。
Midnight landing、Top Landing、Landing Gearは
散々やったけど、これ全然しらなかったよ。




https://kuruma-news.jp/post/120299

ロービームでも、対向車のライトがまぶしい理由。
なんか、釈然としないけど、まぶしいものはやっぱり
まぶしいとは感じる。

なんとかならないものかなぁ?




https://twitter.com/shapoco/status/1075397780363825152

電解コンのマステ。
欲しいな、これ。



コメント ( 0 )