OpenCVで、画像に線や円などを描画する際、ベースとなる画像データを色を指定して新規作成したい時があるかと思います。
PythonのOpenCVにはC++のMatクラスのようなものはなく、画像データはnumpyのndarrayなので、numpyの関数を使って画像データを新規作成します。
numpyで画像データを作成するには、
●すべての画像データを0で初期化する zeros
●すべての画像データを1で初期化する ones
●すべての画像データを指定した値で初期化する full
のいずれかの関数を用いる事で、画像データの新規作成が可能になります。
zeros を用いる方法
zerosは画像データをすべて0で初期化します。
0で初期化した画像に、値を足すと、足した値一色の画像データとなります。
zerosの構文
numpy.zeros(shape, dtype=float, order='C', *, like=None)
shape | 配列のサイズを指定します。 モノクロの場合:(高さ, 幅) カラーの場合:(高さ, 幅, 3)や(高さ, 幅, 4) |
dtype | データの型を指定します。 画像データなので、 dtype = np.uint8 とします。 |
order | ‘C’ もしくは ‘F’ 詳細は不明。。 |
like | 詳細は不明。。 |
サンプルプログラム
import cv2
import numpy as np
# モノクロ(黒(0))で初期化
img_mono_black = np.zeros((100, 400), dtype = np.uint8)
# モノクロ(白(255))で初期化
img_mono_white = np.zeros((100, 400), dtype = np.uint8) + 255
# カラー(黒(0))で初期化
img_color_black = np.zeros((100, 400, 3), dtype = np.uint8)
# カラー(白(255))で初期化
img_color_white = np.zeros((100, 400, 3), dtype = np.uint8) + 255
cv2.imshow("mono_black", img_mono_black)
cv2.imshow("mono_white", img_mono_white)
cv2.imshow("color_black", img_color_black)
cv2.imshow("color_white", img_color_white)
print(img_color_black)
cv2.waitKey()
実行結果
ones を用いる方法
onesは画像データをすべて1で初期化します。
1で初期化した画像に、値を掛け、掛けた値一色の画像データとなります。
onesの構文
numpy.ones(shape, dtype=None, order='C', *, like=None)
shape | 配列のサイズを指定します。 モノクロの場合:(高さ, 幅) カラーの場合:(高さ, 幅, 3)や(高さ, 幅, 4) |
dtype | データの型を指定します。 画像データなので、 dtype = np.uint8 とします。 |
order | ‘C’ もしくは ‘F’ 詳細は不明。。 |
like | 詳細は不明。。 |
サンプルプログラム
import cv2
import numpy as np
# モノクロの指定色(128)で初期化
img_mono_128 = np.ones((100, 400), dtype = np.uint8) * 128
# カラーの指定色(グレー200)で初期化
img_color_200 = np.ones((100, 400, 3), dtype = np.uint8) * 200
cv2.imshow("mono_128", img_mono_128)
cv2.imshow("color_200", img_color_200)
cv2.waitKey()
実行結果
full を用いる方法
fullは画像データをすべて指定した値で初期化します。
fullの構文
numpy.full(shape, fill_value, dtype=None, order='C', *, like=None)
shape | 配列のサイズを指定します。 モノクロの場合:(高さ, 幅) カラーの場合:(高さ, 幅, 3)や(高さ, 幅, 4) |
fill_value | 指定色 カラーの場合は、 (青, 緑, 赤) の順のタプルで指定します。 |
dtype | データの型を指定します。 画像データなので、 dtype = np.uint8 とします。 |
order | ‘C’ もしくは ‘F’ 詳細は不明。。 |
like | 詳細は不明。。 |
サンプルプログラム
import cv2
import numpy as np
# カラーの指定色(青)で初期化
img_color_blue = np.full((100, 400, 3), (255, 0, 0), dtype = np.uint8)
# カラーの指定色(緑)で初期化
img_color_green = np.full((100, 400, 3), (0, 255, 0), dtype = np.uint8)
# カラーの指定色(赤)で初期化
img_color_red = np.full((100, 400, 3), (0, 0, 255), dtype = np.uint8)
cv2.imshow("color_blue", img_color_blue)
cv2.imshow("color_green", img_color_green)
cv2.imshow("color_red", img_color_red)
cv2.waitKey()
実行結果
参照ページ
https://numpy.org/doc/stable/reference/generated/numpy.zeros.html#numpy.zeros
https://numpy.org/doc/stable/reference/generated/numpy.ones.html#numpy.ones
https://numpy.org/doc/stable/reference/generated/numpy.full.html