【Python】画像の読み込みと切り取り

 

こんにちは。のっくんです。

 

今日の記事では、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月

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog