#はじめに
OpenCVを用いて画像をどうやって切り取るかを解説します。一応前回の続きなので、もしこの記事でわからないところがあれば、ご覧ください。
#環境
MacOS Mojave
Python 3.7
#使用画像
以下の画像 (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において、画像の座標軸は以下のようになります。
位置を(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)までの範囲の色の情報を出力しています。
#任意の位置で切り取り
指定した画像の範囲を別のオブジェクトに入れれば、その位置を切り出した画像を得ることができます。
#ライブラリの読み込み
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()
以上のような画像が出力されれば成功です!(畳なので切り取りが行われているかどうかわかりずらいですが。。。笑)
次回は画像の拡大縮小反転など、こねくり回す作業を解説したいと思います
#Twitterやってます
今後の記事の情報や質疑応答など色々やりたいと思うのでよければ、フォローお願いします、、、!
https://twitter.com/ryuji33722052