pythonとOpenCVを使って画像の加工をやっています。最終的には動画で人の顔を自動で認識→自動でモザイクをかけるところまでやりたいと思っています。
とりあえず今回は画像を取り込んで大きさを変えて出力するまでをまとめようと思います。
OpenCVのインストールは各所に記事があるので割愛いたします。
###①画像の取り込み
画像取り込みのためにはcv2.imread()を使います(OpenCVのチュートリアル に大変分かりやすく解説してあります)。画像の保存場所とコードの保存場所が異なる場合はファイルパスで指定してあげる必要あり。
img = cv2.imread('sample.jpg')
###②画像の加工(拡大・縮小)
cv2.resizeを使います。OpenCVのDocumentationに解説がありますが、これが非常に分かりにくい。resize()は引数をいくつか指定する必要があるみたいです。
cv2.resize(①加工する画像, ②加工する際の縮尺, ③縮尺の仕方)
こんな感じになるかと思います。実際のコードを下に。
cv2.resize(img, dsize=(100, 200), interpolation = cv2.INTER_LINEAR)
#"dsize="は省略可能
cv2.resize(img, (100, 200), interpolation = cv2.INTER_LINEAR)
①加工する対象の画像がimg、②加工する際の縮尺がdsize=(100,200)、③縮尺の仕方がinterpolation = cv2.INTER_LINEAR、になります。
ちなみに③について調べた&試してみた結論としては、縮尺の方法については個人的にはほとんど変わらないという印象でした。。。なので最初のうちは③はあまり気にせず、慣れてきたらいろいろ比較するのがよろしいかと思います。この記述自体省略可能です。
ちょっとややこしいのが②で、上記のサンプルコードでは出力の際の大きさをピクセルで直接指定しています。元の写真の縦横の比率は無視しているので、これだと上下や左右に画像がつぶれてしまうと思います。
そこで使うのがfx, fyで縮尺を指定するという方法です。縦と横を半分の大きさにしたい場合は下記のようなコードになります(その場合dsize=Noneを指定しないとエラーになってしまいますので忘れずに)。
cv2.resize(image, dsize=None, fx=0.5,fy=0.5, interpolation = cv2.INTER_LINEAR)
#"dsize="は省略可能
cv2.resize(image, None, fx=0.5,fy=0.5, interpolation = cv2.INTER_LINEAR)
4分の1の大きさにする場合はfx,fyに0.25を指定。
cv2.resize(image, dsize=None, fx=0.25,fy=0.25, interpolation = cv2.INTER_LINEAR)
ただ、0.5とか0.25と打ち込むとコードとして分かりにくくなるので、もうちょっと工夫できるかも。例えば少し工夫をして、resizeのコードの前に%で指定して、fxとfyを記述する際にその数値を100で割るという手もありそうです。
最終的なコードは下の通りです。imshow()、WaitKey()、cv2.destroyAllWindows()についてはimread()と同じチュートリアルのページに分かりやすく解説がありました。このページ本当に分かりやすいです。
import cv2
image = cv2.imread('Hiro.jpg')
#比較用にオリジナル画像を出力する場合は下記コード
#cv2.imshow('Original Image', image)
#cv2.waitKey()
#縦300ピクセル、横200ピクセルに大きさを指定
resized = cv2.resize(image, dsize=(300,200), interpolation = cv2.INTER_LINEAR)
#縦横半分に大きさを指定
resized_half = cv2.resize(image, dsize=None, fx=0.5, fy=0.5, interpolation = cv2.INTER_LINEAR)
#縦横にピクセルを指定した画像を出力
cv2.imshow('Resized', resized)
cv2.waitKey()
#縦横半分の大きさにした画像を出力
cv2.imshow('Resized half', resized_half)
cv2.waitKey()
cv2.destroyAllWindows()