Warning: Undefined variable $position in /home/pystyles/pystyle.info/public_html/wp/wp-content/themes/lionblog/functions.php on line 4897

OpenCV – float 型の配列を画像化する方法について

OpenCV – float 型の配列を画像化する方法について

概要

float 型の配列を $[0, 255]$ の範囲にスケーリングして、画像化する方法について紹介します。

Advertisement

範囲のスケーリング

値 $x_1, x_2, \cdots, x_n$ の範囲を $[a, b]$ に変換する式は以下になります。 スケーリング後の値を $x’_i$ としたとき、

$$ \begin{aligned} x’_i =& \frac{(b – a)(x_i – \displaystyle\min_i x_i)}{\displaystyle\max_i x_i – \displaystyle\min_i x_i} + a \end{aligned} $$
In [1]:
import numpy as np


def scale(x, a, b):
    if x.min() == x.max():
        return np.zeros_like(x)

    scaled = (b - a) * (x - x.min()) / (x.max() - x.min()) + a

    return scaled


x = np.array([5, 6, 4, 5, 6, 4, 1, 5, 1, 7])
print(x.min(), x.max())

x2 = scale(x, 1, 2)
print(x2.min(), x2.max())
1 7
1.0 2.0

[0, 1] にスケーリングする

$a = 0, b = 1$ を代入すると、先程の式は以下のように簡略化できます。

$$ \begin{aligned} x’_i =& \frac{x_i – \displaystyle\min_i x_i}{\displaystyle\max_i x_i – \displaystyle\min_i x_i} \end{aligned} $$
In [2]:
import numpy as np


def scale(x):
    if x.min() == x.max():
        return np.zeros_like(x)

    scaled = 255 * (x - x.min()) / (x.max() - x.min())

    return scaled


x = np.array([5, 6, 4, 5, 6, 4, 1, 5, 1, 7])
print(x.min(), x.max())

x2 = scale(x)
print(x2.min(), x2.max())
1 7
0.0 255.0

[0, 255] にスケーリングする

$a = 0, b = 255$ を代入すると、先程の式は以下のように簡略化できます。

$$ \begin{aligned} x’_i =& 255 \frac{x_i – \displaystyle\min_i x_i}{\displaystyle\max_i x_i – \displaystyle\min_i x_i} \end{aligned} $$
Advertisement

float 型の配列を画像化する

配列の画素値を $[0, 255]$ の範囲に正規化した後、numpy.uint8 にキャストします。

In [3]:
import cv2
from IPython import display


def imshow(img, format=".jpg", **kwargs):
    """ndarray 配列をインラインで Notebook 上に表示する。
    """
    img = cv2.imencode(format, img)[1]
    img = display.Image(img, **kwargs)
    display.display(img)
In [4]:
import numpy as np


def array_to_img(x):
    if x.min() == x.max():
        return np.zeros_like(x, dtype=np.uint8)

    img = 255 * (x - x.min()) / (x.max() - x.min())
    img = img.astype(np.uint8)

    return img


arr = np.tile(np.linspace(0, 1, 200).reshape(1, -1, 1), (200, 1, 3))

img = scale(x)
imshow(img)