【Python】OpenCVで画像を切り出す方法

以前にOpenCVをつかって画像や動画を読み込み、書き出しの方法を紹介しました。

今回は、画像内の任意の箇所を切り出す方法を紹介します。

画像を読み込んで一部を切り出す

使用する画像

今回は、この素敵なキツネの画像を使います。

使用するオリジナルの画像(キツネ)

やりたいこと

オリジナルの画像では、キツネの全身+周りに背景が写っています。今回は、キツネの顔部分だけが必要な場合を想定して、顔の切り出しをしていきます。

まずは画像を読み込む。

画像の読込にはcv2.imread()を使います。

import cv2

path = "input/fox.jpg"
img = cv2.imread(path)

画像から切り出す

切り出す画像の範囲は、スライシングで指定します。

切り出し範囲=img[縦方向(上):縦方向(下), 横方向(左):横方向(右)]

実際にキツネの顔を切り出してみます。まずは、画像のサイズを確認します。

print(img.shape)

今回の画像は、4928(幅)×3280(縦)の画像であることがわかりました。この数値の範囲内で切り出す範囲を指定します。

因みに、img.shapeの戻り値の3つ目は、カラー画像のチャネル数(色相数:RGB)を示しています。グレースケールの画像だと行、列のピクセルの2値のみ返されるので、img.shapeの結果によってカラー画像かグレースケールの画像かを判断することができます。

cropped_image = img[400:1500, 800:1700]
cv2.imshow("cropped", cropped_image)

上記の範囲で切り出すと、cropped_imageは次のような画像になります。

顔だけ切り出したキツネ

元の画像から顔部分だけを切り出した画像になりました。

コード全体

これまでのコードをまとめると、以下のようになります。

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()

画像を確認したい際は、imshow()やimwrite()を使います。

OpenCVの学習におすすめ書籍

PythonでOpenCV始めてみようという方におすすめなのが以下書籍です。実装例も豊富なので、1からコードを書かずとも学習を進めることができます。

オライリーの1冊は読み物というより辞書としての利用におすすめです。お値段結構しますが、細かい情報までしっかりと詰め込まれています。

まとめ

PythonのOpenCVで画像空一部分を切り出す方法を紹介しました。画像の切り出しには、スライシングを用います。画像のサイズを確認して、適切なサイズで切り出してみてください!

OpenCVの基礎を身につけるためのロードマップは以下を参考にしてください。

ではでは👋