具体例で学ぶ Hu Moments

### はじめに

Hu Momentsは，1962年に提案された画像の形状特徴量です．平行移動，回転，スケール変換に対して不変性を持つため，物体認識や形状解析で広く使用されています．

ひょんなことからこれを使ってみたくなる用事が発生したのですが，登場する記号や要素が多く，直感的な理解が難しかったです．

本記事では，**具体的なバイナリ画像を用いた計算例**を通じて，Hu Momentsの各要素が表現できることをできるだけわかりやすく直感的に理解できるよう解説してみようと思います．

![all_test_images3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/ce83f09a-67cf-4650-8be6-d9a388493dd7.png)

実装コードはこちら： https://github.com/pfunami/Vis-Hu-Moments

## モーメントとは何か？

### 力学から数学，そして画像へ

高校物理で習った「モーメント」を覚えている方が多いと思うので（自分もそう），そこからの導入してみます．

- **力のモーメント**: $M = F \times r$（力×距離）
- **慣性モーメント**: $I = \sum mr^2$（質量×距離²の総和）

これらの共通点は「ある基準点からの距離を重みとして使っていること」です．

### 数学的なモーメントの一般化

力学のモーメントを数学的に一般化すると：

**k次モーメント** = $\int x^k \cdot f(x) dx$

ここで：
- $x$: 位置（距離）
- $k$: 何乗するか（次数）
- $f(x)$: その位置での「重み」

### 画像のモーメント

画像を「2次元の質量分布」として見ると，画像$f(x,y)$の原点まわりの $(p,q)$ 次**モーメント**（混合$p+q$次モーメントとも呼ぶ）は：

$M_{pq} = \sum_{x} \sum_{y} x^p \cdot y^q \cdot f(x,y)$

とかけます．

**物理的イメージ**：

- 画像の明るさ = 質量密度
- ピクセル位置 = 質量の位置
- モーメント = 質量分布の物理的性質


### 画像での低次モーメントの意味

具体例として，白い物体が黒い背景にある二値画像を考えましょう：

- **$M_{00}$**: $\sum\sum f(x,y)$ → 物体のピクセル数（面積）
- **$M_{10}$**: $\sum\sum x \cdot f(x,y)$ → 物体のx方向の「重心×面積」
- **$M_{01}$**: $\sum\sum y \cdot f(x,y)$ → 物体のy方向の「重心×面積」

**重心座標**:
- $\bar{x} = M_{10}/M_{00}$
- $\bar{y} = M_{01}/M_{00}$

これは力学の重心計算と同じ考え方になっています．

## 中心モーメントと正規化中心モーメント
Hu momentsの目的は，移動，スケール，回転に不変な形状特徴量の計算です．
これを実現するために，中心モーメントと正規化中心モーメントを導入します．

### なぜ中心モーメントが必要か？

普通のモーメント $M_{pq}$ には大きな問題があります：

**同じ形状でも位置が違うと値が変わってしまう**

### 中心モーメントの定義

$\mu_{pq} = \sum_{x} \sum_{y} (x-\bar{x})^p \cdot (y-\bar{y})^q \cdot f(x,y)$

**意味**：重心まわりの(p,q)次モーメント
→ 重心まわりだから**物体がどこにあっても同じ値**（平行移動不変）

### 正規化中心モーメント

中心モーメントでも，まだ問題が残ります：

**同じ形状でもサイズが違うと値が変わってしまう**

そこで以下のようにスケーリングすることで，サイズ不変なモーメントである正規化中心モーメントが得られます．：

$$\eta_{pq} = \frac{\mu_{pq}}{\mu_{00}^{\gamma}}$$

ここで $\gamma = \frac{p+q}{2} + 1$．

なぜ$1/\mu_{00}^{\gamma}$でスケーリングすることでうまくいくかは，[Appendix](#疑問2-なぜ正規化で面積のγ乗で割るのか)を参照ください．


## Hu Momentsの定義

Hu Momentsは，正規化中心モーメント$\eta_{pq}$から計算される7要素として定義されます：

$$h_1 = \eta_{20} + \eta_{02}$$

$$h_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2$$

$$h_3 = (\eta_{30} - 3\eta_{12})^2 + (3\eta_{21} - \eta_{03})^2$$

$$h_4 = (\eta_{30} + \eta_{12})^2 + (\eta_{21} + \eta_{03})^2$$

$$h_5 = (\eta_{30} - 3\eta_{12})(\eta_{30} + \eta_{12})[(\eta_{30} + \eta_{12})^2 - 3(\eta_{21} + \eta_{03})^2] + (3\eta_{21} - \eta_{03})(\eta_{21} + \eta_{03})[3(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2]$$

$$h_6 = (\eta_{20} - \eta_{02})[(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2] + 4\eta_{11}(\eta_{30} + \eta_{12})(\eta_{21} + \eta_{03})$$

$$h_7 = (3\eta_{21} - \eta_{03})(\eta_{30} + \eta_{12})[(\eta_{30} + \eta_{12})^2 - 3(\eta_{21} + \eta_{03})^2] - (\eta_{30} - 3\eta_{12})(\eta_{21} + \eta_{03})[3(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2]$$


各Hu Momentの意味を確認していきましょう．


### h1（全体的な広がり）

$$h_1 = \eta_{20} + \eta_{02}$$

**直感**: 物体の全体的な広がり（サイズ感，楕円感）

#### 詳細解析
- $\eta_{20}$: x方向の慣性モーメント（横方向の広がり）
- $\eta_{02}$: y方向の慣性モーメント（縦方向の広がり）
- **合計**: 物体が2次元空間でどれだけ広がっているか

この値は「コンパクトさ」の逆指標として機能します．同じ面積でも，広がり方によって値が変わります．

#### 具体例
- 点状の物体 → $h_1$小
- 面状の物体 → $h_1$大

| image | $h_1$ | $\eta_{20}$ | $\eta_{02}$ | コメント|
|:-:|:-:|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/85834002-a8e5-4ebc-9f47-e4a34b735c78.png">| 6.52E-04  | 3.26E-04  | 3.26E-04  | 正円なのでx,y両方向への慣性モーメントは同じ |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/60a26e3c-e0b1-46ec-8dda-2a5879c1d9c2.png">| 8.17E-04 | 6.73E-04  | 1.45E-04  | x方向の慣性モーメントがでかい |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/b9dc3509-dbbd-4417-8f8b-e8911b39a8b2.png">| 9.92E-04 | 1.22E-04 | 8.71E-04 | y方向への慣性モーメントがでかい |



### h2（異方性と傾き）

$h_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2$

**直感**: 物体の異方性の総量（方向に依存しない「細長さ」）

#### 詳細解析
- **第1項** $(\eta_{20} - \eta_{02})^2$: 軸方向異方性
  - 物体がx軸・y軸方向にどの程度異方的かの指標
  - 値が大きい → 座標軸に沿って細長い形状
- **第2項** $4\eta_{11}^2$​: 軸不一致異方性（4倍重み付け）
  - $\eta_{11}=\mu_{11}/\mu_{00}^2=\sum_{x} \sum_{y} (x-\bar{x}) \cdot (y-\bar{y}) \cdot f(x,y)/\mu_{00}^2$ : すなわち分子がxとyの共分散
  - $\eta_{11}$は傾き角度ではなく **「主軸と座標軸の不一致度」** を表す
      - $\eta_{11}=0$: 物体の主軸がx軸またはy軸と完全に一致
      - $\eta_{11}\neq0$: 物体の主軸が座標軸と斜めの関係
  - 2乗されることで，軸不一致の程度のみが残る
- **総和** $h_2$:これが回転不変である理由は，各項の総和が回転に対して一定になるように保証されているから
    - **0°/90°回転**: $\eta_{11} = 0$ だが，$(\eta_{20} - \eta_{02})^2$ が大きい
    - **45°回転**: $(\eta_{20} - \eta_{02})^2 = 0$ だが，$\eta_{11}^2$ が大きい
    - **中間角度**: 両項のバランスで補償
    - 詳しくは[Appendix](#疑問1-h2は方向性を表すのになぜ回転不変なのか)へ


#### 物理的解釈
$h_2 = (\text{横広がり} - \text{縦広がり})^2 + 4 (\text{異方性})^2 = (\text{異方性の軸方向成分})+(\text{異方性の斜め方向成分})$
異方性の総エネルギーのようなものとして解釈できる．合計は回転で保存されるようなエネルギー．

#### 具体例
- 正円: どの方向も同じ → $h_2 \approx 0$
- 楕円: 離心率が大きいほど $h_2$ が大きい（角度無関係）
- 細長い形状: 非常に細長いほど $h_2$ が大きい

**ポイント**: $h_2$は「どちら方向に細長いか」ではなく「どの程度細長いか」を測定する

| image | $h_2$ | $(\eta_{20} - \eta_{02})^2$ | $4\eta_{11}^2$ | コメント|
|:-:|:-:|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/85834002-a8e5-4ebc-9f47-e4a34b735c78.png">| 0.00E+00 | 0.00E+00 | 0.00E+00 | 異方性なし |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/60a26e3c-e0b1-46ec-8dda-2a5879c1d9c2.png">| 2.79E-07 | 2.79E-07 | 0.00E+00 | 主軸のx軸に沿っている |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/14967a72-8887-43c9-bb24-4b732df60a99.png">| 2.79E-07 | 2.79E-07 | 0.00E+00 | 主軸のy軸に沿っている  |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/974bdecd-2912-48b1-ab61-906b960da0f3.png">| 2.01E-07 | 2.23E-12 | 2.01E-07 | 主軸に対して斜め配置．値が厳密に一致していないのは解像度の問題と推察 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/314efaa0-825b-4be9-8f4e-4468941d026b.png">| 5.61E-07 | 9.66E-36 | 5.61E-07 | 主軸のx軸に沿っている |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/e73e8cc6-0f5d-458e-8c4f-5251508c7a94.png">| 5.61E-07 | 9.66E-36 | 5.61E-07 | 主軸のy軸に沿っている |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/79476e42-cc28-4199-86af-ae70c104064e.png">| 9.22E-17 | 5.60E-07 | 5.60E-07 | 主軸に対して斜め配置．値が厳密に一致していないのは解像度の問題と推察 |


### h3（対称性）

$h_3 = (\eta_{30} - 3\eta_{12})^2 + (3\eta_{21} - \eta_{03})^2$

**直感**: 物体の対称性（左右・上下の偏り）

#### 詳細解析
ここから3次モーメントが絡んできます．
- **第1項** $(\eta_{30} - 3\eta_{12})^2$: x方向系の非対称性
  - $\eta_{30}$: x方向の3次モーメント（x方向の歪み，すなわち左右非対称性）
  - $\eta_{12}$: 混合3次モーメント（xに対するねじれのような斜め方向への非対称性）
      - 詳しく展開すると以下．すなわちy方向の分散的な広がりが，xによってどう変化するかが現れている．
$$
\eta_{12}=\frac{\mu_{12}}{\mu_{00}^{2.5}}=\frac{\sum \sum(x-\bar{x})^1(y-\bar{y})^2 f(x, y)}{\mu_{00}^{2.5}}
$$
  - 組み合わせで複雑なx方向の非対称性を表現
- **第2項** $(3\eta_{21} - \eta_{03})^2$: y方向系の非対称性
  - $\eta_{21}$: 混合3次モーメント（yに対するねじれのような斜め方向への非対称性）
  - $\eta_{03}$: y方向の3次モーメント（y方向の歪み，すなわち上下非対称性）

#### 具体例
- **完全対称形状**: $h_3 \approx 0$
- **左右非対称**: $h_3 > 0$
- **上下非対称**: $h_3 > 0$
- **複合非対称**: $h_3$最大

文字認識において：
- 「I」「H」→ $h_3$小（対称に近い）
- 「P」「F」→ $h_3$大（明らかに非対称）

| image | $h_3$ | $(\eta_{30} - 3\eta_{12})^2$ | $(3\eta_{21} - \eta_{03})^2$ | コメント|
|:-:|:-:|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/85834002-a8e5-4ebc-9f47-e4a34b735c78.png">| 0.00E+00 | 0.00E+00 | 0.00E+00 | 上下左右対称 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/ca996d4c-ac50-48bd-8275-32224e9b8d5a.png">| 3.12E-10 | 0.00E+00 | 3.12E-10 | 左右対称・上下非対称 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/a67db881-9cdc-442e-af7a-7142b25e1e51.png">| 3.12E-10 | 4.99E-37 | 3.12E-10 | 左右非対称・上下対称<br>$(3\eta_{21} - \eta_{03})^2$は誤差か |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/e28b439e-b03f-4fdb-8b9e-4f3cd100737d.png">| 1.74E-11 | 1.74E-11 | 3.57E-40 | 左右非対称・上下対称<br>$(3\eta_{21} - \eta_{03})^2$は誤差か |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/2d2413c4-6e53-42d5-9c39-1c32be196a51.png">| 8.86E-11 | 2.47E-11 | 6.39E-11 | 上下左右非対称 |

### h4（複雑な形状特徴）

$h_4 = (\eta_{30} + \eta_{12})^2 + (\eta_{21} + \eta_{03})^2$

**直感**: 物体の複雑な形状特徴（3次モーメントの総合強度，歪さ）

#### h3との違い
- **$h_3$**: 差を取る（非対称性を強調）
- **$h_4$**: 和を取る（全体的な3次特徴を測定）

#### 詳細解析
- **第1項** $(\eta_{30} + \eta_{12})^2$: x方向系の3次モーメントに関する特徴の総強度
- **第2項** $(\eta_{21} + \eta_{03})^2$: y方向系の3次モーメントに関する特徴の総強度

#### 相補的関係
$h_3$と$h_4$は相補的な関係にあります：
- 対称だが複雑な形状 → $h_3$小，$h_4$大
- 単純だが非対称な形状 → $h_3$大，$h_4$小

#### 具体例
$h_4$は「形状の複雑さ」「歪さ:Skewness」を測定します：
- 単純な幾何形状（円，正方形）→ $h_4$小
- 複雑な形状（星型，不規則形状）→ $h_4$大

| image | $h_4$ | $(\eta_{30} + \eta_{12})^2$ | $(\eta_{21} + \eta_{03})^2$ | コメント|
|:-:|:-:|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/85834002-a8e5-4ebc-9f47-e4a34b735c78.png">| 0.00E+00 | 0.00E+00 | 0.00E+00 | 歪さなし |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/34f27f6e-6fda-4571-890f-dcbb20d43c6e.png">| 0.00E+00 | 0.00E+00 | 0.00E+00 | 歪さなし |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/096bde43-3740-4e26-a0f7-9439e1f10aba.png">| 8.55E-16 | 4.46E-16 | 4.10E-16 | 形状は左右対称だがcircleやsquareより高い値 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/eb7ce8b3-2155-4bb8-ad61-4a8c01cd01ae.png">| 1.30E-13 | 1.60E-15 | 1.28E-13 | 形状複雑で不規則，歪つ．starより高い値 |


### h5（3次までの高次な形状特徴）

$h_5 = (\eta_{30} - 3\eta_{12})(\eta_{30} + \eta_{12})[(\eta_{30} + \eta_{12})^2 - 3(\eta_{21} + \eta_{03})^2] + (3\eta_{21} - \eta_{03})(\eta_{21} + \eta_{03})[3(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2]$

**直感**: 複雑で微細な形状特徴（高次の非線形組み合わせ）

#### 構造の理解
この複雑な式は，3次モーメントの**4つの基本要素**の非線形結合です：
- $\eta_{30} - 3\eta_{12}$: $h_3$の第1成分
- $\eta_{30} + \eta_{12}$: $h_4$の第1成分
- $3\eta_{21} - \eta_{03}$: $h_3$の第2成分
- $\eta_{21} + \eta_{03}$: $h_4$の第2成分

$h_3, h_4$と比較すると，微細な形状の違いを検出できたり，単純な線形結合では表現できない特徴を表現できたりすると期待されます．

#### 具体例
$h_5$は以下のような用途で威力を発揮しえます：
- 同じような楕円の微妙な違いの識別
- 文字の細かいフォント差の検出
- など


| image | $h_5$  | コメント|
|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/60a26e3c-e0b1-46ec-8dda-2a5879c1d9c2.png">| 0.00E+00  | ベースライン |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/974bdecd-2912-48b1-ab61-906b960da0f3.png">| 7.55E-30  | 傾きは２次なので値は小さい|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/cfd6db75-4e06-4314-9cdb-aa61cc72fd13.png">| -2.46E-28 | 楕円との微妙な違いに敏感 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/b1150422-c03d-4064-b454-346a7209fbf8.png">| 1.15E-26 | 楕円との微妙な違いに敏感 |

### h6（2次と3次の高次な形状特徴）

$h_6 = (\eta_{20} - \eta_{02})[(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2] + 4\eta_{11}(\eta_{30} + \eta_{12})(\eta_{21} + \eta_{03})$

**直感**: 2次モーメント（基本形状）と3次モーメント（複雑特徴）の相互作用

#### 詳細解析
- **第1項** $(\eta_{20} - \eta_{02})[(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2]$:
  - $(\eta_{20} - \eta_{02})$: 基本的な異方性（$h_2$の成分）
  - $[(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2]$: 3次特徴の方向性
  - 組み合わせは基本異方性と複雑特徴の積

- **第2項** $4\eta_{11}(\eta_{30} + \eta_{12})(\eta_{21} + \eta_{03})$:
  - $4\eta_{11}$: 基本的な傾き（$h_2$の成分）
  - $(\eta_{30} + \eta_{12})(\eta_{21} + \eta_{03})$: 3次特徴の積
  - 組み合わせは基本傾きと複雑特徴の積

#### 特徴的な性質
- $h_5$は3次モーメントの組み合わせだが，$h_6$は2次モーメントとも結合している．
- $h_1$〜$h_4$より詳細な識別能力が期待


#### 具体例
まず，2次モーメント指標の$h_2$と比較します．
| image | $h_2$ | $h_6$ | コメント|
|:-:|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/60a26e3c-e0b1-46ec-8dda-2a5879c1d9c2.png">| 2.79E-07 | 0.00E+00 | ベースライン1 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/974bdecd-2912-48b1-ab61-906b960da0f3.png">| 2.01E-07 | 5.89E-19 | 上と比べ，$h_6$間の差は$h_2$間の差より限定的であり，同一図形としての識別性が高い |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/314efaa0-825b-4be9-8f4e-4468941d026b.png">| 5.61E-07 | 2.31E-42 | ベースライン2 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/79476e42-cc28-4199-86af-ae70c104064e.png">| 5.60E-07 | -2.24E-23 | 上と比べ，$h_6$間の差は$h_2$間の差より限定的であり，同一図形としての識別性が高い |

次に，2次モーメント情報を持たない$h_5$と比較します．比較に使う図形は2次モーメントでは識別可能で3次モーメントでは識別が難しい例です．長方形の左上に，位置と半径が異なる円が重なっている図形です．これらの円の半径と位置は，$h_5$の差がなくなるように（つまり3次モーメントに関する情報で差がわからなくなるように）人間チューニングしました．

| image | $h_5$ | $h_6$ | コメント|
|:-:|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/1d962362-a26c-4826-97c1-6e5ad52cfc0e.png">| 2.37E-24 | 5.96E-16 | ベースライン1 |
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/6673cf91-82f8-4284-a2e6-97296bc57104.png">| 2.37E-24 | 7.55E-16 | 上と比べ，x軸に対するy軸方向への膨らみ具合という2次モーメント関連の情報が異なるので，$h_5$は同等で$h_6$に差が現れる． |


### h7（反射識別子）

$h_7 = (3\eta_{21} - \eta_{03})(\eta_{30} + \eta_{12})[(\eta_{30} + \eta_{12})^2 - 3(\eta_{21} + \eta_{03})^2] - (\eta_{30} - 3\eta_{12})(\eta_{21} + \eta_{03})[3(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2]$

**直感**: 反射に対する符号変化を持つ特徴（鏡像区別器）

#### 重要特徴
**$h_7$だけが反射で符号が変わります**：
- 他の$h_1$〜$h_6$は反射不変
- $h_7$により鏡像の区別が可能


#### 構造の理解
$h_7$は$h_5$と似た複雑な構造を持ちますが，簡潔に書くと以下のような違いがあります：
- $h_5$: $(A \cdot B \cdot C) + (D \cdot E \cdot F)$の形
- $h_7$: $(D \cdot B \cdot C) - (A \cdot E \cdot F)$の形

$h_5$と同様にどれも3字モーメントの組み合わせです．$A$は$h_3$の第一成分でx方向系の非対称性，$D$は$h_3$の第二成分でx方向系の非対称性です．
$A$と$D$の入れ替えと2の項の間の符号反転により，反射で符号が変化する性質が生まれます．

#### 注意点
- **反射対称な物体では $h_7 = 0$**
- 鏡像区別が不要な場合は使用を避ける場合もある

#### 具体例
- 文字「b」と「d」: 反射関係 → h₁〜h₆は同じ，h₇は符号が逆
- 文字「p」と「q」: 反射関係 → h₁〜h₆は同じ，h₇は符号が逆

| image | $h_7$  | コメント|
|:-:|:-:|:-:|
| <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/60a26e3c-e0b1-46ec-8dda-2a5879c1d9c2.png">| 0.00E+00  | 反射対称なので0 |
|<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/b0736c89-d3e2-4248-9b03-2d0b30baef61.png">| -7.41E-22  | ベースラインのL字|
|<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/6b6154b8-2228-4f8a-9adb-077571667352.png">| -7.41E-22 | L字を回転．<br>回転だけなので反射関係はない |
|<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/6049e617-a513-4a44-822d-6a20048ac802.png">| 7.41E-22 | L字の鏡像．<br>反射関係があり，上二つと符号が反転． |


## Flusserの8番目の不変量

### 従来のHu Momentsの問題点

J. Flusserは，従来のHu momentsに以下の問題があることを指摘しました：

1. **独立性の欠如**: $h_3$が他の要素に依存
   $$h_3 = \frac{h_5^2 + h_7^2}{h_4^3}$$

2. **完全性の欠如**: 3次モーメントから作れる独立な不変量が1つ欠けている（発見された）

### 8番目の不変量

$h_8 = \eta_{11}[(\eta_{30} + \eta_{12})^2 - (\eta_{03} + \eta_{21})^2] - (\eta_{20} - \eta_{02})(\eta_{30} + \eta_{12})(\eta_{03} + \eta_{21})$

この$h_8$は：
- $h_7$には主軸と座標軸の不一致度を表す$\eta_{11}$がないが，$h_8$には$\eta_{11}$がある
- $h_7$と同様に**反射反対称性**を持つ（鏡像で符号が変わる）
- **2次と3次モーメントの新しい組み合わせ**で，既存の$h_1 \sim h_7$では捉えられない微細な形状特徴を表現できることが期待

### 改良されたセット

$\{h_1, h_2, h_4, h_5, h_6, h_7, h_8\}$
- 7次元
- 完全に独立
- 3次までのモーメントを完全にカバー

###  具体例
些細な違いがある画像を用いて，$h_7$と$h_8$を比較します．

|  |![circle_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/7bdafd34-cf53-4e28-aba6-69677eebfddc.png)  | ![flusser_circle_abnormal_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/3887eb38-443c-4025-95fb-efb945623735.png) | ![flusser_circle_chipped_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/4fa7f2b8-154a-45e7-b268-c75131503ac4.png) | ![flusser_circle_deformed_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/05ff4ed0-49ff-474b-9ee7-563cdbc87ea5.png) |
|:-:|:-:|:-:|:-:|:-:|
| $h_7$ | 0.00E+00 | 1.50E-30 | 5.24E-29 | 2.10E-26 |
| $h_8$ | 0.00E+00 | 8.68E-21 | 5.10E-21 | 1.07E-18 |

指数部乗に注目すればわかるように，$h_7$間の差よりも$h_8$間の差の方が大きいため，$h_8$は$h_7$よりも微細に識別できると言えます．

|  | ![horizontal_ellipse_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/4449a71f-6ee0-409d-b50b-ae0f7fb5f67a.png) | ![flusser_ellipse_ref_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/065c32b2-a649-4883-a9cf-6bf29ee21340.png) | ![flusser_ellipse_compressed_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/144055c6-14f2-433f-ab01-537b6e14401e.png) | ![flusser_ellipse_expanded_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679228/959873a2-9d96-4841-b1db-b9f4b479453c.png) |
|:-:|:-:|:-:|:-:|:-:|
| $h_7$ | 0.00E+00 | 0.00E+00 | 0.00E+00 | 0.00E+00 |
| $h_8$ | 0.00E+00 | 0.00E+00 | 0.00E+00 | 0.00E+00 |

対称性のある図形だと，$h_8$は$h_7$と同様に識別できないことがわかります．


## まとめ

Hu Momentsは：

1. **物理的直感**: 画像を質量分布として扱う
2. **数学的厳密性**: 幾何学的変換に対する不変性
3. **実用的価値**: 物体認識・形状解析に広く応用

**段階的な特徴抽出**：
- $h_1, h_2$: 基本的な形状特徴
- $h_3, h_4$: 非対称性・複雑さ
- $h_5, h_6, h_7$: 微細な形状特徴
- $h_8$: 補完的な追加特徴



# Appendix
## 私が当初疑問に思ったこと

Hu Momentsを学習する過程で，記事の筆者が特に疑問に思った点について解説します．

### 疑問1: h2は方向性を表すのに，なぜ回転不変なのか？

$h_2$が表す「方向性」は「物体がどの方向を向いているか」ではなく，「主軸と座標軸の不一致度」です．つまり勘違いしていました．

- **変わるもの**: 物体の向き（絶対的方向）
- **変わらないもの**: 物体の異方性の程度（相対的方向性）

$h_2$は後者を測る指標なので，回転不変なのです．

$$h_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2$$

- **0°/90°回転**: $\eta_{11} = 0$ だが，$(\eta_{20} - \eta_{02})^2$ が大きい
- **45°回転**: $(\eta_{20} - \eta_{02})^2 \approx 0$ だが，$\eta_{11}^2$ が大きい
- **中間角度**: 両項のバランスで補償


#### 横長楕円の回転例

0°回転時:$\quad \eta_{20} = \text{大}, ; \eta_{02} = \text{小}, ; \eta_{11} \approx 0 \Rightarrow h_2 = (\text{大} - \text{小})^2 + 4 \times 0^2 = \text{大} $

45°回転時:$\quad \eta_{20} \approx \eta_{02}, ; \eta_{11} = \text{大} \
\Rightarrow h_2 = (\text{中} - \text{中})^2 + 4 \times (\text{大})^2 = \text{大} $

90°回転時:$ \quad \eta_{20} = \text{小}, ; \eta_{02} = \text{大}, ; \eta_{11} \approx 0 \
\Rightarrow h_2 = (\text{小} - \text{大})^2 + 4 \times 0^2 = \text{大}$

つまりどの角度でも$h_2$の値は同じになります．

#### コードで実験
```python
def test_rotation_invariance():
    base = np.zeros((64, 64), dtype=np.uint8)

    # 楕円を様々な角度で作成
    angles = [0, 15, 30, 45, 60, 75, 90]

    for angle in angles:
        ellipse = base.copy()
        cv2.ellipse(ellipse, (32, 32), (20, 10), angle, 0, 360, 255, -1)

        moments = cv2.moments(ellipse)
        m00 = moments['m00']
        eta20 = moments['mu20'] / (m00 ** 2)
        eta02 = moments['mu02'] / (m00 ** 2)
        eta11 = moments['mu11'] / (m00 ** 2)

        h2 = (eta20 - eta02) ** 2 + 4 * eta11 ** 2

        print(f"{angle:2d}°: η20={eta20:.6f}, η02={eta02:.6f}, η11={eta11:.6f}, h2={h2:.8f}")


test_rotation_invariance()
```
結果：
```
 0°: η20=0.000601, η02=0.000162, η11=0.000000, h2=0.00000019
15°: η20=0.000563, η02=0.000196, η11=0.000113, h2=0.00000019
30°: η20=0.000499, η02=0.000271, η11=0.000193, h2=0.00000020
45°: η20=0.000388, η02=0.000386, η11=0.000229, h2=0.00000021
60°: η20=0.000271, η02=0.000498, η11=0.000194, h2=0.00000020
75°: η20=0.000196, η02=0.000563, η11=0.000113, h2=0.00000019
90°: η20=0.000162, η02=0.000601, η11=0.000000, h2=0.00000019
```
各$\eta$の値は違えど，最終的な$h_2$はほぼ同じになっていることがります．
### 疑問2: なぜ正規化で面積のγ乗で割るのか？


**なぜ単純に面積$\mu_{00}$で割らないのか？**

スケール変換（物体が$s$倍に拡大）を考えると：
- $\mu_{pq} \rightarrow s^{p+q+2} \mu_{pq}$
- $\mu_{00} \rightarrow s^2 \mu_{00}$

単純に$\mu_{00}$で割ると：
$$\frac{\mu_{pq}}{\mu_{00}} \rightarrow \frac{s^{p+q+2} \mu_{pq}}{s^2 \mu_{00}} = s^{p+q} \frac{\mu_{pq}}{\mu_{00}}$$

$s^{p+q}$が残ってしまい，スケール不変になりません．

正しい正規化では：
$$\eta_{pq} = \frac{\mu_{pq}}{\mu_{00}^{(p+q+2)/2}} \rightarrow \frac{s^{p+q+2} \mu_{pq}}{s^{p+q+2} \mu_{00}^{(p+q+2)/2}} = \frac{\mu_{pq}}{\mu_{00}^{(p+q+2)/2}}$$

$s$が完全に消えて，真のスケール不変性を実現します．

#### 連続値としても同様

スケール変換（$s$倍拡大）で：
- $\mu_{pq} \rightarrow s^{p+q+2} \mu_{pq}$

スケール不変にするには$s^{p+q+2}$を打ち消す必要があります：
$\mu_{00}^{(p+q+2)/2} = (s^2 \mu_{00})^{(p+q+2)/2} = s^{p+q+2} \mu_{00}^{(p+q+2)/2}$

$\mu_{pq} = \iint (x-\bar{x})^p (y-\bar{y})^q f(x,y) \, dx \, dy$

スケール変換すると：
- $(x-\bar{x})^p \rightarrow s^p (x-\bar{x})^p$
- $(y-\bar{y})^q \rightarrow s^q (y-\bar{y})^q$
- $dx \, dy \rightarrow s^2 dx \, dy$（面積要素）

合計：$s^p \times s^q \times s^2 = s^{p+q+2}$

正しい正規化では：
$\eta_{pq} = \frac{\mu_{pq}}{\mu_{00}^{(p+q+2)/2}}$

スケール変換後：
$\eta_{pq} = \frac{s^{p+q+2} \mu_{pq}}{(s^2 \mu_{00})^{(p+q+2)/2}} = \frac{s^{p+q+2} \mu_{pq}}{s^{p+q+2} \mu_{00}^{(p+q+2)/2}} = \frac{\mu_{pq}}{\mu_{00}^{(p+q+2)/2}}$

$s$が完全に消えて，真のスケール不変性を実現します．

---

*この記事が皆様のHu Moments理解の助けになれば幸いです．ご質問やご指摘がございましたら，コメントでお知らせください．*