KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
OpenCVで使われるresizeとは?実例サンプルコード【4選】を一挙紹介

OpenCVで使われるresizeとは?実例サンプルコード【4選】を一挙紹介

今回はOpenCVで使われるresizeに関して、実例サンプルコード【4選】を用いて徹底解説致します。resizeに関して詳しく知りたい、実例を通してresizeに関して学びを深めたい方へおすすめです。ぜひ最後までご覧ください。

目次
  1. OpenCVで使われるresizeとは?
    1. なぜ多次元配列(numpy.ndarray)から画像の大きさを変更するの?
  2. OpenCVで使われるresize関数の定義
  3. 画像の大きさを変更する、サンプル集【4選】
    1. 画像幅の値を固定してアスペクト比を揃える
    2. 画像の高さの値を固定してアスペクト比を揃える
    3. 指定する画像の大きさからアスペクト比を算出して、画像の大きさを変更する
    4. 指定する解像度に合わせて画像の大きさを変更する
  4. まとめ
  5. 参考文献
目次を開く⬇︎

OpenCVで使われるresizeとは?

OpenCVで使われるresizeとは、多次元配列(numpy.ndarray)情報を元に、画像の大きさを変更するものを意味します。

なぜ多次元配列(numpy.ndarray)から画像の大きさを変更するの?

それでは、なぜ多次元配列(numpy.ndarray)から画像の大きさを変更するのでしょう?

多次元配列から画像の大きさを変更する理由としては、

  • OpenCV内に含まれる、関数の処理を容易にするため。
  • 画像の加工や表示などの演算処理を、高速化するため。

が挙げられます。

確かに画像の加工や表示などの結果が遅いと、実運用を考える場合に、悩みの種になりそうなので、高速化は必要ですね。

OpenCVで使われるresize関数の定義

resize関数は、

1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# resize : 画像の大きさを変更する関数
5# 第一引数 : 多次元配列(画像情報)
6#################################
7# 第二引数 : 画像の大きさを指定する。(画像の幅, 画像の高さ)で設定する。
8# (例) (200, 150) -> 画像の大きさを幅200, 高さ150に変更する。
9# ※ fx, fy optionを利用する場合、Noneを指定する。
10#################################
11#################################
12# 第三引数以降(任意) : option1, option2, ...
13# fx option, fy option : それぞれ元画像から何倍の幅にするのか、元画像から何倍の高さにするのか指定する。
14# (例) fx=0.5 -> 元画像から0.5倍の幅へ変更する。
15
16# interpolation option : 補間方法を設定する。
17# 補間とは? : https://kotobank.jp/word/%E8%A3%9C%E9%96%93-8781
18# cv2.INTER_NEAREST : 最近傍補間
19# 最近傍補間について : https://algorithm.joho.info/image-processing/nearest-neighbor-linear-interpolation/
20# cv2.INTER_LINEAR : バイリニア補間(デフォルト)
21# バイリニア補間について : https://algorithm.joho.info/image-processing/bi-linear-interpolation/
22# cv2.INTER_CUBIC : バイキュービック補間
23# バイキュービック補間について : https://algorithm.joho.info/image-processing/bicubic-interpolation/
24# cv2.INTER_AREA : ピクセル領域の関係を利用したリサンプリング
25# cv2.INTER_LANCZOS4 : Lanczos補間
26# Lanczos補間について : http://koujinz.cocolog-nifty.com/blog/2009/05/lanczos-76aa.html
27# 窓関数について : https://ja.wikipedia.org/wiki/%E7%AA%93%E9%96%A2%E6%95%B0
28
29# (例) interpolation=cv2.INTER_NEAREST -> 補間方法として、最近傍補間を利用する。
30################################# 
31# 戻り値 : 多次元配列(画像情報) 
32dst = cv2.resize(img, (画像の幅, 画像の高さ), option1, option2, ...)

で定義されます。

例えば以下のようなコードを作成すると、

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# shape : 画像の形状を返す。
15# (列数, 行数, チャンネル数)
16# チャンネルとは? : http://www.cg-ya.net/2dcg/aboutimage/basic-knowledge-degitalimage/
17# (例) : (382, 640, 3)
18height, width, channel = img.shape
19
20# resize : 画像の大きさを変更する関数
21# 第一引数 : 多次元配列(画像情報)
22# 第二引数 : 画像の大きさを指定する。(画像の幅, 画像の高さ)で設定する。
23# <第一引数の例>
24# [
25# [
26# [234 237 228]
27# ...
28# [202 209 194]
29# ]
30# [
31# [10 27 16]
32# ...
33# [36 67 46]
34# ]
35# [
36# [34 51 40]
37# ...
38# [50 81 60]
39# ]
40# ]
41# 戻り値 : 多次元配列(画像情報)
42# もしくは、img = cv2.resize(img, None, fx=0.5, fy=0.5)
43img = cv2.resize(img, (int(width * 0.5), int(height * 0.5)))
44
45# imwrite : 画像の保存を行う関数
46# 第一引数 : 保存先の画像ファイル名
47# 第二引数 : 多次元配列(numpy.ndarray)
48# <第二引数の例>
49# [
50# [
51# [234 237 228]
52# ...
53# [202 209 194]
54# ]
55# [
56# [10 27 16]
57# ...
58# [36 67 46]
59# ]
60# [
61# [34 51 40]
62# ...
63# [50 81 60]
64# ]
65# ]
66# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
67cv2.imwrite('output.jpg', img)

以下の画像のように画像の幅、高さを1/2倍にして描画します。

元画像

画像の幅、高さを1/2倍にした画像

多次元配列情報からどのように画像が構成されているのか、イメージ画像

imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。

imwriteに関しては、OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介でまとめていますので、詳しく知りたい方は是非ご確認ください。

画像の大きさを変更する、サンプル集【4選】

最後に画像の大きさを変更する、サンプル集【4選】をご紹介致します。ぜひ最後までご確認ください。

画像幅の値を固定してアスペクト比を揃える

アスペクト比 : 画像の幅と画像の高さの比率。

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# shape : 画像の形状を返す。
15# (列数, 行数, チャンネル数)
16# チャンネルとは? : http://www.cg-ya.net/2dcg/aboutimage/basic-knowledge-degitalimage/
17# (例) : (382, 640, 3)
18height, width, channel = img.shape
19
20# 画像の幅を800に固定する。
21w = 800
22
23# 画像の幅の比率を元に、高さの調整を行う。
24h = round(height * (width / w))
25
26# resize : 画像の大きさを変更する関数
27# 第一引数 : 多次元配列(画像情報)
28# 第二引数 : 画像の大きさを指定する。(画像の幅, 画像の高さ)で設定する。
29# <第一引数の例>
30# [
31# [
32# [234 237 228]
33# ...
34# [202 209 194]
35# ]
36# [
37# [10 27 16]
38# ...
39# [36 67 46]
40# ]
41# [
42# [34 51 40]
43# ...
44# [50 81 60]
45# ]
46# ]
47# 戻り値 : 多次元配列(画像情報)
48img = cv2.resize(img, (w, h))
49
50# imwrite : 画像の保存を行う関数
51# 第一引数 : 保存先の画像ファイル名
52# 第二引数 : 多次元配列(numpy.ndarray)
53# <第二引数の例>
54# [
55# [
56# [234 237 228]
57# ...
58# [202 209 194]
59# ]
60# [
61# [10 27 16]
62# ...
63# [36 67 46]
64# ]
65# [
66# [34 51 40]
67# ...
68# [50 81 60]
69# ]
70# ]
71# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
72cv2.imwrite('output.jpg', img)

元画像

画像幅の値を固定してアスペクト比を揃える画像

画像の高さの値を固定してアスペクト比を揃える

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# shape : 画像の形状を返す。
15# (列数, 行数, チャンネル数)
16# チャンネルとは? : http://www.cg-ya.net/2dcg/aboutimage/basic-knowledge-degitalimage/
17# (例) : (382, 640, 3)
18height, width, channel = img.shape
19
20# 画像の高さを400に固定する。
21h = 400
22
23# 画像の高さの比率を元に、幅の調整を行う。
24w = round(width * (height / h))
25
26# resize : 画像の大きさを変更する関数
27# 第一引数 : 多次元配列(画像情報)
28# 第二引数 : 画像の大きさを指定する。(画像の幅, 画像の高さ)で設定する。
29# <第一引数の例>
30# [
31# [
32# [234 237 228]
33# ...
34# [202 209 194]
35# ]
36# [
37# [10 27 16]
38# ...
39# [36 67 46]
40# ]
41# [
42# [34 51 40]
43# ...
44# [50 81 60]
45# ]
46# ]
47# 戻り値 : 多次元配列(画像情報)
48img = cv2.resize(img, (w, h))
49
50# imwrite : 画像の保存を行う関数
51# 第一引数 : 保存先の画像ファイル名
52# 第二引数 : 多次元配列(numpy.ndarray)
53# <第二引数の例>
54# [
55# [
56# [234 237 228]
57# ...
58# [202 209 194]
59# ]
60# [
61# [10 27 16]
62# ...
63# [36 67 46]
64# ]
65# [
66# [34 51 40]
67# ...
68# [50 81 60]
69# ]
70# ]
71# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
72cv2.imwrite('output.jpg', img)

元画像

画像の高さの値を固定してアスペクト比を揃える画像

指定する画像の大きさからアスペクト比を算出して、画像の大きさを変更する

1import cv2
2import sys
3
4# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
5# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
6# 第一引数 : 画像のファイルパス
7# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
8img = cv2.imread('./xxx.xxx')
9
10# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
11if img is None:
12    sys.exit("Could not read the image.")
13
14# shape : 画像の形状を返す。
15# (列数, 行数, チャンネル数)
16# チャンネルとは? : http://www.cg-ya.net/2dcg/aboutimage/basic-knowledge-degitalimage/
17# (例) : (382, 640, 3)
18height, width, channel = img.shape
19
20# アスペクト比の求めるための、画像の高さを400にする。
21h = 400
22# アスペクト比の求めるための、画像の幅を300にする。
23w = 300
24
25# 画像の大きさを変更する値から、アスペクト比を求める。
26aspect = w / h
27# 元画像のアスペクト比と比較して、元画像のアスペクト比の方が大きい場合
28# 高さを固定して、幅をアスペクト比に合わせる。
29if width / height >= aspect:
30    nh = height
31    nw = round(nh * aspect)
32# 元画像のアスペクト比と比較して、元画像のアスペクト比の方が小さい場合
33# 幅を固定して、高さをアスペクト比に合わせる。
34else:
35    nw = width
36    nh = round(nw / aspect)
37
38# resize : 画像の大きさを変更する関数
39# 第一引数 : 多次元配列(画像情報)
40# 第二引数 : 画像の大きさを指定する。(画像の幅, 画像の高さ)で設定する。
41# <第一引数の例>
42# [
43# [
44# [234 237 228]
45# ...
46# [202 209 194]
47# ]
48# [
49# [10 27 16]
50# ...
51# [36 67 46]
52# ]
53# [
54# [34 51 40]
55# ...
56# [50 81 60]
57# ]
58# ]
59# 戻り値 : 多次元配列(画像情報)
60img = cv2.resize(img, (nw, nh))
61
62# imwrite : 画像の保存を行う関数
63# 第一引数 : 保存先の画像ファイル名
64# 第二引数 : 多次元配列(numpy.ndarray)
65# <第二引数の例>
66# [
67# [
68# [234 237 228]
69# ...
70# [202 209 194]
71# ]
72# [
73# [10 27 16]
74# ...
75# [36 67 46]
76# ]
77# [
78# [34 51 40]
79# ...
80# [50 81 60]
81# ]
82# ]
83# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
84cv2.imwrite('output.jpg', img)

元画像

指定する画像の大きさからアスペクト比を算出して、画像の大きさを変更する画像

指定する解像度に合わせて画像の大きさを変更する

解像度とは? : 画面を構成する点の数を意味します。画素数と同じ意味を持ちます。

1import cv2
2import sys
3import math
4
5# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
6# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
7# 第一引数 : 画像のファイルパス
8# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
9img = cv2.imread('./xxx.xxx')
10
11# 画像ファイルが正常に読み込めなかった場合、プログラムを終了する。
12if img is None:
13    sys.exit("Could not read the image.")
14
15# shape : 画像の形状を返す。
16# (列数, 行数, チャンネル数)
17# チャンネルとは? : http://www.cg-ya.net/2dcg/aboutimage/basic-knowledge-degitalimage/
18# (例) : (382, 640, 3)
19height, width, channel = img.shape
20
21# 解像度を設定する。
22# 解像度とは? : https://wa3.i-3-i.info/word16886.html
23resolution = 1000 * 600
24
25# 解像度 : 画素数(画像の幅 x 画像の高さ)。
26# width(画像の幅) * height(画像の高さ)を実行して、元画像の解像度を洗い出す。
27# 指定する解像度(resolution) / 元画像の解像度(width * height)を実行して、解像度の比率を出す。
28# 元画像からscale倍の幅、元画像からscale倍の高さへ変更する。
29# 参考 : https://pystyle.info/opencv-resize/
30scale = math.sqrt(resolution / (width * height))
31
32# resize : 画像の大きさを変更する関数
33# 第一引数 : 多次元配列(画像情報)
34# 第二引数 : 画像の大きさを指定する。(画像の幅, 画像の高さ)で設定する。
35# <第一引数の例>
36# [
37# [
38# [234 237 228]
39# ...
40# [202 209 194]
41# ]
42# [
43# [10 27 16]
44# ...
45# [36 67 46]
46# ]
47# [
48# [34 51 40]
49# ...
50# [50 81 60]
51# ]
52# ]
53# fx, fy option : それぞれ元画像から何倍の幅にするのか、元画像から何倍の高さにするのか指定する。
54# 戻り値 : 多次元配列(画像情報)
55img = cv2.resize(img, None, fx=scale, fy=scale)
56
57# imwrite : 画像の保存を行う関数
58# 第一引数 : 保存先の画像ファイル名
59# 第二引数 : 多次元配列(numpy.ndarray)
60# <第二引数の例>
61# [
62# [
63# [234 237 228]
64# ...
65# [202 209 194]
66# ]
67# [
68# [10 27 16]
69# ...
70# [36 67 46]
71# ]
72# [
73# [34 51 40]
74# ...
75# [50 81 60]
76# ]
77# ]
78# imwriteについて : https://kuroro.blog/python/i0tNE1Mp8aEz8Z7n6Ggg/
79cv2.imwrite('output.jpg', img)

元画像

指定する解像度に合わせて画像の大きさを変更する画像

まとめ

  • OpenCVで使われるresizeとは、多次元配列(numpy.ndarray)情報を元に、画像の大きさを変更するものを意味します。
  • 多次元配列から画像の大きさを変更する理由としては、OpenCV内に含まれる、関数の処理を容易にする、画像の加工や表示などの演算処理を、高速化するが挙げられます。

参考文献