BGR 値を直接記述して、OpenCV で画像にする

大きなデータを得たとして、その特徴を画像の濃淡で可視化したり、画像処理の技法で分析したりするかもしれない、と考え、その準備として、 numpy の配列と OpenCV の出力について、いくつか試してみた。

OpenCV と numpy を import しておく。後述のコードは、全てこの2つのライブラリを import して動かしている。

import cv2
import numpy as np

画像データは、3次元配列で表現される。各次元は、行、列、色 に対応する。

img = np.zeros((300, 300, 3), np.uint8)
cv2.imwrite("01.jpg",img)

色の設定

色は、B, G, R の順番で記述される。

img = np.zeros((300, 300, 3), np.uint8)
img[:,:] = [255, 0, 0] # B G R の順                                                                                                           
cv2.imwrite("02.jpg",img)

行のスライス

img = np.zeros((300, 300, 3), np.uint8)
img[  0:100,:] = [255,   0,   0]
img[100:200,:] = [  0, 255,   0]
img[200:300,:] = [  0,   0, 255]
cv2.imwrite("03.jpg",img)

列のスライス

img = np.zeros((300, 300, 3), np.uint8)
img[:,   0:100] = [255,   0,   0]
img[:, 100:200] = [255, 255, 255]
img[:, 200:300] = [  0,   0, 255]
cv2.imwrite("04.jpg",img)

行列の座標を指定して、数値を入力

img = np.zeros((256, 256, 3), np.uint8)
print(img.shape)
for i in range(256):
    for j in range(256):
	img[i,j] = [i, j, 0]

cv2.imwrite("05.jpg",img)

float32 で計算して、最後に uint8 の画像にする

小数や大きな数を扱うために、 float32 を使い後で丸めて整数にする。

img = np.zeros((256, 256, 3), np.float32)
print(img.shape)
for i in range(256):
    for j in range(256):
	img[i,j] = [i ** 2, j ** 2, (i ** 2 + j ** 2)/2.]

cv2.imwrite("06.jpg",np.uint8(np.clip(img/256., 0, 255)))

ランダムウォーク

import random
img = np.zeros((256, 256, 3), np.uint8)
img.fill(255)
pos = [127, 127]
for i in range(3000):
    pos = [pos[0] + random.randint(-1, 1),
           pos[1] + random.randint(-1, 1)]
    img[pos[0], pos[1]] = [255, 0, 0]
cv2.imwrite("07.jpg",img)

コメント

タイトルとURLをコピーしました