LoginSignup
17
17

More than 3 years have passed since last update.

【Python】OpenCVによる画像の画素へのアクセスと切り取り (初心者向け)

Posted at

はじめに

OpenCVを用いて画像をどうやって切り取るかを解説します。一応前回の続きなので、もしこの記事でわからないところがあれば、ご覧ください。

環境

MacOS Mojave
Python 3.7

使用画像

以下の画像 (neko.jpg) を使用します。
neko.jpg

画像の大きさを確認

以下のコードで画像の大きさを確認できます。

#ライブラリの読み込み
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("neko.jpg")
print(img.shape)

以上のコードを実行すると、以下の結果が出ます。

(900, 1600, 3)

これは、縦が900ピクセル、横が1600ピクセル、チャンネル数が3という意味です。チャンネル数はカラー画像の場合はGBRの3つなので、3になります。グレースケールだと、白色の度合いだけなので、チャンネル数は1となります。

画像の座標

Opencvにおいて、画像の座標軸は以下のようになります。
座標.png

位置を(x,y)とするとき、原点(0,0)は図のように左上にきます。画像を扱う場合は下方向がy軸の正の方向になるので注意してください。
この画像の大きさは縦が900ピクセル、横が1600ピクセルなので、画像の末端のピクセルのx,y座標はそれぞれ899,1599となります。900、1600にならないのは、原点0から数えているためです。

画像の座標へのアクセス

画像の座標を以下のように指定すると、その位置の色の値を取得することができます。

img = cv2.imread("neko.jpg")
print(img[450,800])
出力
[153 161 190]

これは、座標(450,800)の位置の色が(R,G,B) = (153,161,190)であることを示しています。
また、以下のようにすると座標を複数指定できるようになります。

print(img[450:650,800:1000])
[[[153 161 190]
  [153 161 190]
  [152 160 189]
  ...
  [169 178 205]
  [169 178 205]
  [169 178 205]]

 [[152 160 189]
  [152 160 189]
  [153 161 190]
  ...
  [169 178 205]
  [169 178 205]
  [169 178 205]]

 [[151 159 188]
  [152 160 189]
  [154 162 191]
  ...
  [171 178 205]
  [172 179 206]
  [172 179 206]]

 ...
以下省略。。。

[]の中にある":"は私たちが普段数字の範囲を表す時に使う"~"と同じと考えてください。上の例では、座標(450,800)から(649,999)までの範囲の色の情報を出力しています。
座標_位置指定.png

任意の位置で切り取り

指定した画像の範囲を別のオブジェクトに入れれば、その位置を切り出した画像を得ることができます。

#ライブラリの読み込み
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("neko.jpg")
#指定した画素をimg_trimに代入
img_trim = img[450:650,800:1000]
#色を変更
img_trim = cv2.cvtColor(img_trim, cv2.COLOR_BGR2RGB)
#表示
plt.imshow(img_trim)
plt.show()

切り取り画像.png

以上のような画像が出力されれば成功です!(畳なので切り取りが行われているかどうかわかりずらいですが。。。笑)
次回は画像の拡大縮小反転など、こねくり回す作業を解説したいと思います:blush:

Twitterやってます

今後の記事の情報や質疑応答など色々やりたいと思うのでよければ、フォローお願いします、、、!:relieved:
https://twitter.com/ryuji33722052

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17