kobar9568のブログ

技術的なメモやその他諸々

ちょっとした画像切り出しにopencv-pythonが便利だった

はじめに

私はよく作業メモ等でWindows 10のスクリーンショット機能(Win + PrintScreen)を使うのだが、普段FHDの画面3つ+WQXGAの画面を横に並べているせいで、8320x1600のデカい画像が次々保存されていく。
中央のFHD部分だけを切り出したり、数十枚あるスクショから同じ部分を切り出したりする需要が結構あった。

画像編集ソフトとしてはPaint.NETを愛用しているのだが、手で切り出して保存するのがしんどかったので自動化を模索。

調べるとGIMPにはバッチ機能があるようだが、もっとシンプルに? OpenCV+Pythonを使うことにした。

OpenCV自体は画像解析やマシンラーニングも含むつよそうなライブラリだが、今回は単純に画像切り出しに使うことにする。

やりたいこと

f:id:kobar9568:20190714064858p:plain

FHDの画面を3つ横に並べた5760x1080のこのスクショから真ん中の写真を切り出して…

f:id:kobar9568:20190714064905p:plain

FHDの画像として保存する。

インストール

pip install opencv-python

pipで一発。簡単。

コード

基本的にcv2.imread()でNumPy配列として画像を読み込んで、切り出す範囲を選択して、cv2.imwrite()で選択した範囲を画像として書き出すだけ

#!/usr/bin/env python3

import cv2

# 切り出す範囲の左上と右下の座標を指定
crop_left_top = [1920, 0]
crop_right_bottom = [3839, 1079]

# 切り出し座標を調整
left = crop_left_top[0]
right = crop_right_bottom[0] + 1
top = crop_left_top[1]
bottom = crop_right_bottom[1] + 1

input_image = cv2.imread('in.png')
cropped_image = input_image[top : bottom, left : right]
cv2.imwrite('out.png', cropped_image)

画像編集ソフトで切り出したい範囲の左上と右下の座標を確認して、6-7行目に記述。
確認した座標をそのまま使えるように調整して範囲選択し、書き出す。

おわりに

あとは入出力周りを適当に作って今後はこれを使うことにする。
1枚2枚ならともかく、数十枚同じ範囲を切り出すのはかなり面倒で放置していたスクショが溜まっているのでこれを機に片付ける。
テストに使った写真は2年前くらいに瀬長島で撮ったやつ。第2滑走路が供用開始したらまた行きたいなぁ…