こんにちは。のっくんです。
今日の記事では、Pythonで画像を読み込んで表示したり切り取る方法を紹介するよ。
[speech_bubble type=”ln” subtype=”L1″ icon=”ilust/cat2_1_idea.png” name=”ネコ”]おお!ついにこのブログも画像を取り扱うようになるのね。画像処理って難しそうだけど大丈夫かな。[/speech_bubble] [speech_bubble type=”ln” subtype=”L1″ icon=”profile_face.png” name=”のっくん”]難しく聞こえるけど、Pythonには画像を処理するOpenCVっていう便利なライブラリがあるんだよ。5〜10行のコードで実装できるんだ。[/speech_bubble]
[toc]
・Python3.6
・Jupyter Notebook
OpenCVのインストール
まずは画像を処理するためのライブラリOpenCVをインストールします。
Anacondaにはないみたいなのでpipを使ってインストールします。
$ pip install opencv-python
画像をダウンロードしてOpenCVで読み込む
Jupyter Notebookを開いて、以下のコードを実行します。
# 画像のダウンロード import urllib.request as req url = "http://uta.pw/shodou/img/28/214.png" req.urlretrieve(url,"test.png") # OpenCVで読み込む import cv2 img = cv2.imread("test.png") print(img)
requestというライブラリを使って画像ファイルをダウンロードしtest.pngという名前で保存します。
保存したファイルをimreadを使って読み込みます。実行して以下のように0-255の配列が表示されれば正しく動作しています。

[speech_bubble type=”ln” subtype=”L1″ icon=”ilust/cat2_4_think.png” name=”ネコ”]この数値列は何を意味しているの〜〜?[/speech_bubble] [speech_bubble type=”ln” subtype=”L1″ icon=”profile_face.png” name=”のっくん”]これは画像のカラーデータを表しているんだよ。1ピクセルの中に入っているカラーデータがBGR、つまり(青、緑、赤)の順番で並んでいるんだ。[/speech_bubble] 次は、matplotlibを使って画像をJupyterNotebook上に表示してみます。
画像をJupyterNotebookに表示する
Jupyter Notebook上に画像を表示するには、matplotlibというライブラリを使います。Anacondaで検索すると見つかりますのでインストールしておいて下さい。
次にJupyter Notebookでmatplotlibをインラインで利用する宣言をします。先頭で以下のコードを入力、実行して下さい。
%matplotlib inline
続いて表示するためのコードを書きます。
import matplotlib.pyplot as plt import cv2 img = cv2.imread("test.png") plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()
cvtColor(img, cv2.COLOR_BGR2RGB)では、カラーデータの順番をBGRからRGBに変換しています。これが無いと赤と青が反転して表示されます。

実行すると、こんな感じで画像が表示されました。
・OpenCVは画像処理するライブラリ。カラーデータはBGRの順番で格納されている。
・matplotlibは図やグラフを表示するためのライブラリ。カラーデータはRGBの順番で格納されている。
・画像データを受け渡しする際には、cvtColorを使って変換する必要がある。
画像の切り取り
次に画像の切り取りです。先ほどの画像のやき鳥の「き」の部分だけ切り取ってみます。

「き」の部分に当たる座標はどこでしょう。y軸は上から下に向かって数値が増えるようになっています。y軸は200〜450、x軸は100〜250と言ったところでしょうか。
Pythonのリストのスライスを利用して、配列[y1:y2,x1:x2]の書式で画像を切り取ります。
import matplotlib.pyplot as plt import cv2 #画像を読み込む img = cv2.imread("test.png") #画像の一部を切り取る im2 = img[200:450,100:250] cv2.imwrite("cut.png", im2) #画像を表示 plt.imshow(cv2.cvtColor(im2, cv2.COLOR_BGR2RGB)) plt.show()

うまくいきましたね。
参考
「PythonによるAI・機械学習・深層学習アプリのつくり方」、ソシム、2018年6月