OpenCV – 画像の要約統計量を計算する方法

目次

概要

画像から最小値、最大値、平均値、中央値、最頻値、分散、標準偏差といった各種統計量を計算する方法について解説します。

統計量

画像の統計量はチャンネル単位で計算します。 カラー画像の場合は、cv2.split() でチャンネルごとに分解した後、各チャンネルごとに計算を行います。

# カラー画像の場合
b, g, r = cv2.split(img)

最大値、最小値

画素値の中で最小のものを最小値 (minimum value)、最大のものを最大値 (maximum value) といいます。cv2.minMaxLoc() を使用すると、一度に取得できます。

sample.jpg

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

コメント

コメントする

目次