結論
やってみた感想
- OpenCVで実装されている基本的なAPIを自分で実装することで何をやっているかを理解することができた
- Numpyの行列計算やIndex処理は適切なコメントがないとすぐには意図が読み取れないことが多かった
- Go言語で行列を計算するのはPython(Numpy)に比べてとても大変
- Go言語楽しい
- 95本で止まったのは最後の5問が機械学習との融合問題になっており、機械学習の知識を得てから取り組みたかったので95までしか解いてません。
画像処理100本ノックをやった動機
- 機械学習を勉強するための前準備として画像処理を復習したい。そして画像を使った機械学習アプリケーション作成につなげていきたい。
- 学生時代にOpenCVのAPIを叩きまくって卒業したが、中身をちゃんと理解してない気持ち悪さをどうにかしたい
Pythonでやらなかった理由
- Pythonを普段業務で書いているので違う言語をやってみたかった
- Python実装が既にあるので、油断するとそれを見て思考停止してしまい自分で考えなくなりそうだった
Go言語にした理由
- C言語とPythonを普段の業務で書いていて、Goの評判を聞くとその丁度中間の言語だと感じたのでやってみた
- いろんな方が言及している通り静的型付言語としての厳格さと動的言語の書きやすさが同居している不思議な感覚で実装できた
- 標準ライブラリで画像の入出力が可能であり、OpenCVのAPIすら使わずに画像処理プログラムを書くことが可能だと思った
- 実際にできた
反省点
- Hilditch細線化やCannyEdgeなどの計算結果が微妙にPython実装と違っており、まだ十分に評価できていないので今後改善してく
- Go言語での基本的な実装に慣れることができたが、Interfaceや構造体を使った実装に取り組むことができなかった
- 問題文にはアルゴリズムの計算方法までは書いてあるが、どのような背景でこのアルゴリズムが導かれたかまでは言及していないので別途そこは補強していく必要がある。(逆に言うとそういう観点で画像処理のアルゴリズム見れるようになる)
注意点
- 同じ画像でもOpenCVでjpeg画像を読み込んだRGB値とGo言語のImage Packageで読み込んだ値が微妙に違うため全く同じ計算結果にならない。よって、Pythonで生成した画像とGoで生成した画像を比較して目で見て評価を行う場面が多かった。
- 初期化する際に使用するランダム値がPythonとGo言語だと違うため、自分で実装した計算結果確認のためPythonのランダム値を代入して確認する必要がある
最後に
大変良い勉強になりました@yoyoyo_さんに感謝します。
また、同じように100ノックをやっているコントリビューターさんが改善活動をしており、今後より良い画像処理練習問題になっていくと思いますので画像処理に興味があるかたはやってみてはいかかでしょうか。また、Pythonでもnumpyを使わない実装や他の言語での実装もあると様々な比較ができて面白い教材になるかと思います。