目次
概要
画像から最小値、最大値、平均値、中央値、最頻値、分散、標準偏差といった各種統計量を計算する方法について解説します。
統計量
画像の統計量はチャンネル単位で計算します。
カラー画像の場合は、cv2.split()
でチャンネルごとに分解した後、各チャンネルごとに計算を行います。
# カラー画像の場合
b, g, r = cv2.split(img)
最大値、最小値
画素値の中で最小のものを最小値 (minimum value)、最大のものを最大値 (maximum value) といいます。cv2.minMaxLoc()
を使用すると、一度に取得できます。
In [1]:
import cv2
import numpy as np
# 画像を読み込む。
img = cv2.imread("sample.jpg", cv2.IMREAD_GRAYSCALE)
# OpenCV
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(img)
print(f"[minimum] value: {min_val}, position: {min_loc}")
print(f"[maximum] value: {max_val}, position: {max_loc}")
# numpy
min_val = img.min()
max_val = img.max()
min_loc = np.unravel_index(img.argmin(), img.shape)
max_loc = np.unravel_index(img.argmax(), img.shape)
print(f"[minimum] value: {min_val}, position: {min_loc}")
print(f"[maximum] value: {max_val}, position: {max_loc}")
# axis=0, 1 の順なので、min_loc、max_loc は (y, x) の順になっています。
[minimum] value: 0.0, position: (193, 133) [maximum] value: 248.0, position: (211, 106) [minimum] value: 0, position: (133, 193) [maximum] value: 248, position: (106, 211)
平均値
画像サイズが $M \times N$ のとき、その画像の平均値 (mean value) $\mu$ は次の式で計算できます。
$$ \mu = \frac{1}{MN} \sum_{i=0}^{M-1} \sum_{j=0}^{N-1} \text{src}(i, j) $$ただし、$\text{src}(i, j)$ は画像の位置 $(i, j)$ の画素値を表します。
In [2]:
# OpenCV
mean = cv2.mean(img)
print("mean", mean)
# numpy
mean = img.mean()
print("mean", mean)
mean (81.10509036144578, 0.0, 0.0, 0.0) mean 81.10509036144579
中央値
画像サイズが $M \times N$ のとき、その画像の中央値 (median) は次のように計算できます。
- $MN$ が奇数の場合: 画素値を小さい順に並べたときの $MN / 2$ 番目の値
- $MN$ が偶数の場合: 画素値を小さい順に並べたときの $(MN / 2)$ 番目と $(MN / 2 + 1)$ 番目の値の平均
In [3]:
# numpy
median = np.median(img)
print("median", median)
median 64.0
最頻値
画素値の中で最も頻度が高い値を最頻値 (mode) といいます。
In [4]:
from scipy import stats
mode, count = stats.mode(img.ravel())
print("mode", mode)
mode [41]
分散、標準偏差
画像サイズが $M \times N$ のとき、その画像の分散 (variance) $\sigma^2$ は次の式で計算できます。
$$ \sigma^2 = \frac{1}{MN} \sum_{i=0}^{M-1} \sum_{j=0}^{N-1} (\text{src}(i, j) – \mu)^2 $$ただし、$\text{src}(i, j)$ は画像の位置 $(i, j)$ の画素値を表します。 分散の平方根 $\sigma$ を標準偏差 (standard deviation) といいます。
In [5]:
# OpenCV
mean, stddev = cv2.meanStdDev(img)
print(mean, stddev)
# numpy
var = img.var()
print("var", var)
std = img.std()
print("std", std)
[[81.10509036]] [[47.48715753]] var 2255.0301307147265 std 47.48715753458746
コメント