この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
opencvで画像切り抜き [2017/08/14] adash333 [開発環境] |
opencvで画像切り抜き [2018/10/07] (現在) |
||
---|---|---|---|
ライン 3: | ライン 3: | ||
==== 開発環境 ==== | ==== 開発環境 ==== | ||
- | + | Windows8.1\\ | |
- | Python3.6 | + | Python 3.5\\ |
+ | Anaconda 4.4.0 (64-bit)\\ | ||
OpenCV 3 | OpenCV 3 | ||
+ | |||
+ | ===== OpenCV3をWindows8.1にインストール ===== | ||
+ | 2017/8月時点で、Python3.5であれば、Anaconda Promptで、 | ||
+ | <code> | ||
+ | conda install -c https://conda.anaconda.org/menpo opencv3 | ||
+ | </code> | ||
+ | で、OpenCV3をインストール可能です。 | ||
+ | |||
+ | python3.6の場合については、[[WindowsにOpenCV3をインストール]]をご覧ください。 | ||
+ | |||
+ | ===== OpenCV3で画像の読み込み ===== | ||
+ | |||
+ | OpenCVのPythonからの使用法 | ||
+ | cv2モジュールをインポート | ||
+ | 画像データはnumpyのarray(多次元配列)として格納されている | ||
+ | |||
+ | |||
+ | まず、Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.pngからダウンロードしておきます。 | ||
+ | |||
+ | {{:pasted:20171128-222846.png}} | ||
+ | |||
+ | ここでは、Lenna.pngを、C:/py/opencv3/ フォルダに保存したものとします。 | ||
+ | |||
+ | {{:pasted:20171128-223007.png}} | ||
+ | |||
+ | Windowsのスタートボタンから、Anaconda Promptを開いて、以下のコードを入力して、Jupyter notebookを起動。 | ||
+ | |||
+ | <code> | ||
+ | cd c:/py/opencv3/ | ||
+ | jupyter notebook | ||
+ | </code> | ||
+ | |||
+ | 以下のように、Lenna.pngがあるフォルダが表示されるので、画面右上の、New > Python 3 をクリックして、新しいipynbファイルを作成。 | ||
+ | |||
+ | {{:pasted:20171128-223137.png}} | ||
+ | |||
+ | 画面上の方の、「Untitled」をクリックして、「opencv3_cut」に変更 | ||
+ | |||
+ | {{:pasted:20171128-223316.png}} | ||
+ | |||
+ | 以下のコードを入力して、Shift + Enter | ||
+ | |||
+ | <code> | ||
+ | # cv2モジュールからのOpenCV関数へのアクセス例 | ||
+ | # Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.pngからダウンロードしておく | ||
+ | import cv2 | ||
+ | img = cv2.imread('Lenna.png') | ||
+ | print(img.shape) | ||
+ | </code> | ||
+ | |||
+ | {{:pasted:20171128-224252.png}} | ||
+ | |||
+ | 入出力の可視化\\ | ||
+ | 画像の入力は、cv2.imread() → numpy.ndarray型の画像データ | ||
+ | |||
+ | OpencCVの画像データの構造\\ | ||
+ | カラー画像:(height x width x channels) の3次元配列\\ | ||
+ | グレー画像:(height x width)の2次元配列 | ||
+ | |||
+ | 今回は、hight 512, width 512, channels 3のカラー画像ですので、(512, 512, 3)という結果になりました。 | ||
+ | |||
+ | 画像をグレースケールで読み込みたい場合は、cv2.imread('Lenna.png', 0)のように記載します。 | ||
+ | |||
+ | <code> | ||
+ | # Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.pngからダウンロードしておく | ||
+ | |||
+ | import cv2 | ||
+ | # 画像をグレースケールで読み込み | ||
+ | gray = cv2.imread('Lenna.png',0) | ||
+ | print(gray.shape) | ||
+ | </code> | ||
+ | |||
+ | {{:pasted:20171128-224655.png}} | ||
+ | |||
+ | |||
+ | ==== 画像データがnumpy配列である利点 ==== | ||
+ | numpy, scipyなどの線形代数関数が、OpenCVでのプログラムでも使用可能\\ | ||
+ | 計算スピードが速い\\ | ||
+ | scikit-learnやtensorflow, Chainerなどの、Pythonの統計的・機械学習ライブラリとの連携もよい | ||
+ | |||
+ | ==== OpenCVのnumpy画像データの注意点 ==== | ||
+ | |||
+ | numpyに慣れる必要あり | ||
+ | |||
+ | matplotlib, PIL, scikit-imageは、RGB画像で保持するのに対して、 | ||
+ | OpenCVはBGR画像がデフォルト(matplotlibで描画するときにカラー変換が必要) | ||
+ | |||
+ | OpenCVの画像は全て numpy.uint8型のnumpy.array | ||
+ | 例えば、scikit-imageでは、グレー画像はnumpy.float64型なので、注意。 | ||
+ | |||
+ | |||
+ | ===== OpenCV3でJupyter Notebook上で画像の表示 ===== | ||
+ | まず、以下のコードをコピペして、Shift + Enterをします。 | ||
+ | |||
+ | <code> | ||
+ | # 画像の可視化 with Matplotlib | ||
+ | # 簡単だが、各モジュールのカラー画像の保存方法に注意(RGBとBGR) | ||
+ | |||
+ | # matplotlibでJupyter Notebook内で画像表示するためのおまじない | ||
+ | # Jupyter Notebook内で、%をつけて特定のコマンドを入力する方法を、マジックコマンドという | ||
+ | %matplotlib inline | ||
+ | |||
+ | import cv2 | ||
+ | import matplotlib.pyplot as plt | ||
+ | |||
+ | img = cv2.imread('Lenna.png') | ||
+ | plt.imshow(img) | ||
+ | # これだと、色が明らかに変な風に表示されてしまう | ||
+ | </code> | ||
+ | |||
+ | 以下のようになりますが、なんか変な色です。 | ||
+ | |||
+ | {{:pasted:20171128-225428.png}} | ||
+ | |||
+ | これは、OpenCVの画像はデフォルトだとBGR画像であるため、matplotlib(こちらはRGB画像)で正しく表示するためには色変換が必要。 | ||
+ | 具体的には、cv2.cvtColor()関数を用います。 | ||
+ | |||
+ | 以下のコードを入力して、Shift + Enter. | ||
+ | |||
+ | <code> | ||
+ | %matplotlib inline | ||
+ | |||
+ | import cv2 | ||
+ | import matplotlib.pyplot as plt | ||
+ | # OpenCVの画像はデフォルトだとBGR画像であるため、 | ||
+ | # matplotlib(こちらはRGB画像)で正しく表示するためには色変換が必要 | ||
+ | # 具体的には、cv2.cvtColor()関数を用いる | ||
+ | |||
+ | cvimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | ||
+ | plt.imshow(cvimg) | ||
+ | </code> | ||
+ | |||
+ | ちゃんと普通の色合いになりました。 | ||
+ | |||
+ | {{:pasted:20171128-225835.png}} | ||
+ | |||
+ | ===== OpenCV3で画像の保存 ===== | ||
+ | 作成中 | ||
+ | |||
+ | ===== OpenCV3で画像の切り抜き ===== | ||
+ | |||
+ | 以下のコードを入力して、Shift + Enter. | ||
+ | |||
+ | <code> | ||
+ | %matplotlib inline | ||
+ | |||
+ | import cv2 | ||
+ | import matplotlib.pyplot as plt | ||
+ | # OpenCVの画像はデフォルトだとBGR画像であるため、 | ||
+ | # matplotlib(こちらはRGB画像)で正しく表示するためには色変換が必要 | ||
+ | # 具体的には、cv2.cvtColor()関数を用いる | ||
+ | |||
+ | cvimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | ||
+ | plt.imshow(cvimg) | ||
+ | |||
+ | # 新しい配列に入力画像の一部を代入 | ||
+ | dst = cvimg[0:400, 70:270] | ||
+ | plt.imshow(dst) | ||
+ | </code> | ||
+ | |||
+ | 以下のように、切り抜かれます。 | ||
+ | |||
+ | {{:pasted:20171128-230751.png}} | ||
+ | |||
==== ソースコード(途中) ==== | ==== ソースコード(途中) ==== | ||
ライン 12: | ライン 177: | ||
<script src="https://gist.github.com/adash333/450272b97bd0180025e4d206f533bad6.js"></script> | <script src="https://gist.github.com/adash333/450272b97bd0180025e4d206f533bad6.js"></script> | ||
</html> | </html> | ||
+ | |||
+ | このままだと、RGBとかBGRとか。。。あとで訂正予定。 | ||
+ | |||
+ | {{:pasted:20170814-232549.png}} | ||
==== 参考 ==== | ==== 参考 ==== | ||
+ | 指定した人物の顔画像を自動収集するプログラムの公開と使い方\\ | ||
+ | http://qiita.com/Umemiya/items/747934f18b00c026ce83\\ | ||
+ | これ、すごい! | ||
現役JDと学ぶ画像処理入門①〜openCV入門〜\\ | 現役JDと学ぶ画像処理入門①〜openCV入門〜\\ | ||
ライン 26: | ライン 198: | ||
2016年04月22日に更新 | 2016年04月22日に更新 | ||
+ | http://qiita.com/zaburo/items/5637b424c655b136527a\\ | ||
+ | Matplotlibで画像を表示 | ||
+ | 20151227 | ||
+ | http://d.hatena.ne.jp/moremagic/touch/20160817/1471427660\\ | ||
+ | jupyter で opencv を試してみる | ||
+ | 20160817 | ||