画像処理では、画像の一部だけを切り出して使いたい場面が頻繁にあります。 例えば、写真から顔の部分だけを取り出したい場合や、解析対象のエリアを限定したい場合などです。
このような処理をトリミング(クロッピング)と呼びます。この記事では、PythonのOpenCVで画像をトリミングする方法を解説します。
この記事の目次
前提
今回は以下のキツネの画像を使用し、顔部分だけをトリミングします。

画像のトリミング
OpenCVで読み込んだ画像はNumPy配列として扱われるため、Pythonのスライスを使うことでトリミングが可能です。
以下がトリミングのサンプルコードです。
import cv2
path = "input/fox.jpg"
img = cv2.imread(path)
print(img.shape)
# 切り取り範囲の指定
cropped_image = img[400:1500, 800:1700]
cv2.imshow("cropped", cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()>> (3280, 4928, 3) <- img.shapeスライスとは
スライスとは、Pythonの仕組みで、配列や文字列などのシーケンスから指定した範囲の要素を切り出す機能です。
基本的な構文は 配列[開始:終了] で、開始インデックスから終了インデックスの手前までの要素を取得します。
スライスを用いた画像トリミング
OpenCVで読み込んだ画像は (高さ, 幅, チャンネル数) の形状を持つNumPy配列です。そのため、スライスを使って以下のように範囲を指定します。
cropped_image = img[y開始:y終了, x開始:x終了]今回の画像は 3280(高さ)× 4928(幅) のサイズです(img.shape で確認)。スライスの範囲はこの画像サイズ内で指定する必要があり、範囲外を指定するとエラーになります。
img[400:1500, 800:1700] は、y座標400〜1500、x座標800〜1700の範囲を切り出しています。
トリミングした結果は以下のようになります。

顔部分だけが切り出された画像が得られました。
まとめ
今回は、OpenCVで画像をトリミングする方法を紹介しました。
- OpenCVで読み込んだ画像はNumPy配列なので、Pythonのスライスでトリミングできる
- スライスの構文は
img[y開始:y終了, x開始:x終了] - 画像サイズの範囲内で座標を指定する必要がある
シンプルな仕組みですが、画像処理の多くの場面で活用できる基本テクニックです。