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)
-
前の記事
OpenCV – ndarray 形式の画像を Notebook 上にインライン表示する方法について 2020.06.16
-
次の記事
OpenCV – inRange で画像を2値化する方法について 2020.08.13