へっぽこ知識で作る画像処理プログラム 「自炊本のページ抜けチェック」 2.5日目
はじめに
1日目で宣言したとおりPythonでもプログラムを作成しました。
ただC++と同時にプログラムを載せて説明するとややこしいと思ったので*.5日目というかたちで書いてみました。
なお、プログラムはC++と同じリポジトリで公開し、タグもPython版のものを作ります。
今回はPython版の初回なのでC++版とことなる点について説明するために別の記事としましたが、説明が必要なさそうな場合はC++版と一緒にPython版を公開するだけになると思います。
C++版とPython版での大きな違い
C++版とPython版での大きな違いはOpenCVでの画像データの取り扱いです。
C++版ではOpenCV独自のデータ構造であるcv::Matを使って画像データを表現していましたが、
Python版ではcv::Matは使わず、Pythonの数値計算ライブラリであるnumpyの行列ndarrayに画像データを保持します。
そのため、cv::Matに用意されていたメソッドは使えず、numpyに用意されている方法で計算する必要があります。
ただ、cv::Matに用意されているメソッドだけですので、OpenCVに用意されていた関数やその他のクラスなどはその引数などが変更になりますが使うことができます。
例えばC++版で二値化を行っていたcv::threshold関数を比較してみましょう。
C++版のthreshold関数
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
Python版のthreshold関数
cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
大きな違いは処理結果を引数から得るか戻り値から得るかを選べる点です。
どちらを使うかは基本的に好みですが、引数から結果を得る方法をうまく使うことで省メモリなプログラムを書くことができます。
また戻り値はタプルとなっており、retvalには処理が正常に終了したかをboolで返し、dstには処理結果の画像が返ります。
今回は戻り値を使ってプログラムを作成します。理由はシンプルに書けるからです。
Python版にはないメソッドとしてはcv::Matに用意されていたconvertToメソッドがあります。
PythonでconvertToを実現するにはnumpyのndarrayで実装されている四則演算と型変換のメソッドastypeを利用します。
integralVisible = (integral * 255 / max).astype(numpy.uint8)
プログラム自体はとても簡単で0~maxまでの値をとっていた積分画像integralを0~255の値をとるように、maxで割って最大値を1にした後、255を掛けて最大値を255にしているだけです。
式的には一つの値に対して計算しているように見えますが、実際には画像全体い対してこの計算を一気に行っています。
出来上がったプログラム
C++版と同じリポジトリで公開していますが、タグだけ別に用意しています。
GitHub - kyokushin/EBookChecker at python_day_02.5
今回はPython版の説明なのでここまで。