ImageMagick で Equalize (ヒストグラム平坦化)

こちらから ImageMagick に関する記述を抜き出した記事です。

- PIL でカラー画像を Equalize(ヒストグラム平坦化)する際の注意
   - https://qiita.com/yoya/items/a11085f90f555b887cf6#imagemagick

# ヒストグラム平坦化とは

輝度ヒストグラムの偏りを減らす事で視認性を向上させる代表的なアルゴリズムです。

例えば、暗い方に色の輝度が偏っているケース。

```shell
% echo "P2 3 3  31 \
  31 7 6 \
   5 4 3  \
   2 1 0 " | convert - -sample 300x300 3x3.png
% convert 3x3.png -equalize 3x3eq.png
```
|実験画像(3x3.png)| ヒストグラム平坦化(3x3eq.png) |
|---|---|
|![3x3.png](https://qiita-image-store.s3.amazonaws.com/0/1798/298eeba0-26c4-7da7-1c52-2926b0ded04d.png) | ![3x3eq.png](https://qiita-image-store.s3.amazonaws.com/0/1798/5af61a59-9d91-8200-3664-b623d882554d.png) |
|ヒストグラム| |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/cbc384cd-8514-197d-6bf7-cae86be8008e.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/a5a89f8c-1648-68b6-78fc-57118e494dd7.png) |

(ヒストグラムは横軸が輝度、縦軸は該当輝度のカウント数を最大値で正規化)
このように輝度の階調を均すと、見た目潰れかかっている階調が改善する傾向にあります。

画像認識の前処理でよく使われます。(お世話になっております！)

サンプルデモを作ってみたので、とりあえず画像ファイルを試しに放り込んでみて下さい。

- https://app.awm.jp/image.js/equalize.html

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">暗がりで大したもの見えないだろうと油断してアップロードした写真も、ヒストグラム平坦化かけると細部まで見える事があるので注意しようね。( ^ω^ )
https://app.awm.jp/image.js/equalize.html
ここに画像ファイルを放り込むと試せるYO！ </p>&mdash; ＼助けよや／ (@yoya) <a href="https://twitter.com/yoya/status/1464612438452498437">2021年11月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# ヒストグラム平坦化の実行

```shell
% convert IMG_0837.jpg -equalize IMG_0837-eq.jpg
```

|オリジナル | ImageMagick -equalize |
|---|---|
|![IMG_0837.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/4b6efd0d-6ea5-c324-c6ea-5c4b1b27ba22.jpeg) | ![IMG_0837-eq.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/8d4a586d-1c87-5ea7-fbc7-3e67680f70f8.jpeg)|
|ヒストグラム | | 
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/ac1bb497-9a4e-06e2-cb35-fe19b69a75d4.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/cf5f4dd7-02f1-afe0-19b1-6d8caa3eecfa.png)|

実装としては、R,G,B をバラバラに256個のヒストグラムで処理するのでなく、 R1,G1,B1,R2,G2,G3 のように並べて 256x3=>768個のヒストグラムで処理するだけの単純なものです。
中間処理とはいえ3倍の粒度で均すおかげか出来あがる画像も綺麗な気がします。


## !Sync

ちなみにですが、ImageMagick-6.7.9-3(2012年2月リリース)まで、R,G,B バラバラに処理したり不具合があったりで色味を維持しませんでした。6.8.6-3(2013年6月)以降、今の挙動に落ち着いています。 

- ImageMagick の equalize の昔話
  - https://qiita.com/yoya/items/be70bfa89ad8456202b0

-channel 指定で !Sync すると、R,G,B 独立して平坦化します。

こちらのイラスト画像の方が違いがわかりやすいので、サンプルして使わせて頂きます。

- http://seiga.nicovideo.jp/seiga/im2758073

```shell
% convert im2758073.jpg -channel "RGB,\!Sync" -equalize imeq-nosync.jpg
```

|オリジナル| !Sync |
|---|---|
|![im2758073.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/8238636f-8023-7d53-46de-696af38cb8f1.jpeg)|![imeq-nosync.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/cd3a5833-1837-45b5-2ea1-1652b0a5d391.jpeg)|
|ヒストグラム| |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/0c7060c9-8de2-f0da-777b-7eb7ee8fe7f4.png) |![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/b224ae03-7f18-8790-c1de-d8e1bbb27096.png)|

 !Sync は他の用途やデバッグにも便利なので、豆知識としてどうぞ。

# より高度な平坦化 (CLAHE)

今まで説明したヒストグラム平坦化は画像全体のヒストグラムをとるので、場所によって視認性が逆に下がる事もあり得ます。その点を改良した高度な手法もあります。

- 適応ヒストグラム平坦化(AHE, Adaptive Histogram Equalization)
    - ブロックに分けてバラバラにヒストグラム平坦化処理を行い、線形補完でマージする
- コントラスト制限適応ヒストグラム平坦化(CLAHE, Contrast Limited Adaptive Histogram Equalization)
    - AHE の改良で、ブロックに分けた分だけ局所的なノイズに弱くなるので、ヒストグラムのビンが高すぎる場合に他にバラす。
 
ImageMagick-7.0.8-15 から -clahe オプションが導入されました。尚、6系にはバックポートされていません。

-  usage
   - https://imagemagick.org/script/clahe.php

```
% convert original.jpg  -equalize           im-equalize.jpg
% convert original.jpg  -clahe 20x25%+256+7 im-clahe.jpg
```

|オリジナル写真 | Equalize(ImageMagick) | CLAHE(ImageMagick) |
|---|---|---|
| ![IMG_1979.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/3ad5349d-0b48-94d9-7ca2-7b4c507ac836.jpeg) |![im-equalize.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/76bf619b-39f1-99e6-a9e9-7f6445b94889.jpeg) |  ![im-clahe.jpg](https://qiita-image-store.s3.amazonaws.com/0/1798/d3eb567c-76bb-7bee-cef5-e84bdc358d34.jpeg)|
|ヒストグラム| | |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/2454ca27-4207-47b7-cc79-5ac5478bdd4d.png)  | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/ee370f81-9d7a-8858-4fc9-8466e5115275.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/1798/0bd0d2ac-3bf3-d96c-860c-4b30fa29520b.png) |


CLAHE の方が看板の文字は読み易いのですが、普通の Equalize で浮かび上がっていた背景が闇のとばりに隠れていますね。一長一短といったところです。