ここでは、OpenCVを用いて、新規に空白の画像を作成する方法を解説します。
[toc]新規グレースケール画像の作成
グレースケール画像の作成
OpenCVで幅300ピクセル x 高さ200ピクセルの黒のグレースケールイメージを新規作成するには、次のようにします。
import numpy as np
img_black = np.zeros((200, 300), np.uint8)
OpenCV-Pythonにおいては画像はnumpy.ndarrayとして扱われるので、新規イメージを作成するのは、単純にnumpy.ndarrayの配列を作成するだけです。
黒いピクセルは画素値が0であるので、numpy.zeros関数を用いて、要素がすべて0のnumpy.ndarray配列を作成します。
同様に白のグレースケール画像は以下のようにします。
import numpy as np
img_white = np.ones((200, 300), np.uint8) * 255
白いピクセルは画素値が255であるので、numpy.ones関数を用いて、要素がすべて1のnumpy.ndarray配列を作成してから、すべての要素を255倍します。
上記で作成したイメージは以下のようにimwrite関数を用いることで画像ファイルとして保存できます。
import cv2
cv2.imwrite('D:\\BioTech-Lab\\img_black.tif', img_black)
cv2.imwrite('D:\\BioTech-Lab\\img_white.tif', img_white)
これにより、エクスプローラ上からもnumpy.ndarray配列が画像ファイルとして認識されるようになりました。
新規イメージのデータ型
OpenCVは8ビットカラーであるため、画素値の範囲は0-255の256段階となります。そのため、上の例のnumpy.zeros関数にて、データ型はnumpy.uint8を指定しています。ここで、データ型を指定しないと、デフォルトのfloatになってしまい、画像が正しく扱えなくなってしまいます。また、numpy.uint8以外のデータ型でも同様に正しく画像を扱えなくなってしまいますので注意が必要です。
新規カラー画像の作成
白画像・黒画像の作成
基本的な注意点はグレースケール画像の場合と変わりませんが、OpenCVで幅300ピクセル x 高さ200ピクセルの黒のカラー画像を新規作成するには、次のようにします。
import numpy as np
img_black = np.zeros((200, 300, 3), np.uint8)
img_white = np.ones((200, 300, 3), np.uint8) * 255
色のついた画像の作成
例えば赤い画像はすべての画素値のカラーチャネルが(0, 0, 255)となっている画像です。一発でこのような画像を作成する関数はないので、まずすべての画素値が(0, 0, 0)の画像を作成して、カラーチャネルの3つ目を255に入れ替えます。
import numpy as np
img_red = np.zeros((200, 300, 3), np.uint8)
img_red[:, :, 2] = 255
ここで作成した画像は、グレースケール画像の時と同様にimwrite関数を用いることで画像ファイルとして保存可能です。
import cv2
cv2.imwrite('D:\\BioTech-Lab\\img_black.tif', img_black)
cv2.imwrite('D:\\BioTech-Lab\\img_white.tif', img_white)
cv2.imwrite('D:\\BioTech-Lab\\img_red.tif', img_red)
グレースケール画像とカラー画像の違い
import numpy as np
import cv2
img_black_gray = np.zeros((200, 300), np.uint8)
cv2.imwrite('D:\\BioTech-Lab\\img_black_gray.tif', img_black_gray)
img_black_color = np.zeros((200, 300, 3), np.uint8)
cv2.imwrite('D:\\BioTech-Lab\\img_black_color.tif', img_black_color)
上記の例ではグレースケールとBGRカラーで、それぞれ幅300ピクセル x 高さ200ピクセルの黒の画像を作成しています。これで見かけ上は全く同じ黒の画像ができますが、プロパティを確認してみると以下のようになります。
カラー画像では1つのピクセル当たりの情報量が青・緑・赤の3倍に増えたので、ファイルサイズもその分大きくなっていることが分かります。
まとめ
OpenCV上で新規の画像を作成する方法を解説しました。Pythonではnumpy.ndarrayの配列がそのまま画像そのものになるというのが、ほかの言語にはないPythonの柔軟性を表していると思います。まずは、画像を表す配列の取り扱いに慣れていきましょう。
コメント