2.3.4 各種コントラスト調整

# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


MATLABによる各種コントラスト調整について紹介します。




Image Processing Toolboxが必要です。




対応ファイル：[I2_03_4_contrast.m](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_03_4_contrast.m)


# 初期化

```matlab:Code
clc;clear;close all;imtool close all;
```

# 画像読込み

```matlab:Code
I = imread('I2_03_peppers_low.png');
Gray = rgb2gray(I);  % グレースケールへ変換
figure;imshow(Gray);
```


![figure_0_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/f3a84154-4ee2-7a7f-705b-14c340d29f37.jpeg)


```matlab:Code
figure;imhist(Gray);     % 輝度値のヒストグラムを表示
```

![figure_1_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/1edb110b-c06e-79ce-df16-c73ee15e486d.jpeg)




# 低・高輝度で1%飽和するよう自動調整

```matlab:Code
Gray1 = imadjust(Gray);
figure;imhist(Gray1);
```

![figure_2_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/951aa16d-5f7e-3952-8c28-8eba7057a910.jpeg)




```matlab:Code
% 処理前後の画像を並べて表示
figure;imshow([Gray Gray1]);
```


![figure_3_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/2fdb1015-79ea-3984-6af2-1a8c27bb0d00.jpeg)


# ヒストグラム均等化を用いたコントラストの強調：ビン間隔の調整をして、フラットになるように

```matlab:Code
Gray2 = histeq(Gray, 256);
figure;imhist(Gray2);
```


![figure_4_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/838f1c1e-af7e-865e-0587-37c0eeccb776.jpeg)



```matlab:Code
% 表示
figure;imshow([Gray1 Gray2]);
```


![figure_5_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/1e719e59-f6b5-c8ca-c12c-3b02d57b08cd.jpeg)


# コントラストに制限を付けた適応ヒストグラム均等化


デフォルトでは、画像を8x8のタイルに分割して、各タイルでヒストグラム均等化処理をします。タイル境界で不連続な結果とならないように、タイルごとの結果を重み付けしてならすように処理されます。



```matlab:Code
% フラットなヒストグラム
Gray3 = adapthisteq(Gray,'Distribution','uniform');
figure;imhist(Gray3);
```


![figure_6_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/ab50f5e3-ba06-80a5-cbaa-8aca03c374d6.jpeg)



```matlab:Code
%% 表示
figure;imshow([Gray1 Gray3]);
```


![figure_7_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/7b348d4d-9488-216c-28ca-70921d80baeb.jpeg)


# ベル型ヒストグラム


各タイルで合わせこむヒストグラムの形を変えることができます。



```matlab:Code
Gray4 = adapthisteq(Gray,'Distribution','rayleigh');
figure;imhist(Gray4);
```


![figure_8_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/766f696e-b01a-40d7-f200-a039c1b195d9.jpeg)



```matlab:Code
% 表示
figure;imshow([Gray3 Gray4]);
```


![figure_9_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/f2ff1636-c67d-7fcf-90bd-df440630e000.jpeg)


# 曲線ヒストグラム

```matlab:Code
Gray5 = adapthisteq(Gray,'Distribution','exponential');
figure;imhist(Gray5);
```


![figure_10_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/720164c4-81a0-efcb-fdb5-23072eb33473.jpeg)



```matlab:Code
% 表示
figure;imshow([Gray3 Gray4 Gray5]);
```


![figure_11_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/6f8ad5a6-17d3-64aa-15d2-e51654defb45.jpeg)


# 曲線ヒストグラム: コントラスト強調の制限を調整


特に値の変化が少ない領域では、微妙な画素の値の違いがより強く強調されることになるため、コントラスト平均化によりノイジーな結果となります。これを防ぐために、ClipLimitプロパティを使うことができます。MATLABでは、ClipLimitは0-1の間で定義されますが、これは総画素数で正規化したヒストグラムの頻度を表していると私は理解しています。この値を超えた頻度となっている画素値は全体にいったんならされて、その状態でヒストグラム平均化がかかることで、過度なヒストグラム均等化を防ぐ仕組みになっているようです。なので0だと何の均等化もかからないことになり、1だと強烈に均等化される、ということになります。




下の例では逆にLimitをかけないとどうなるかがわかります。思いっきりノイジーですね。



```matlab:Code
Gray6 = adapthisteq(Gray,'Distribution','exponential', 'ClipLimit', 1);
figure;imhist(Gray6);
```


![figure_12_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/14606b66-0b15-70a8-bfe3-17bf8eb51801.jpeg)


```matlab:Code
% 表示
figure;imshow([Gray3 Gray4 Gray5 Gray6]);
```


![figure_13_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/4b5e382f-ffab-19b8-eb2b-61e4286b4cd5.jpeg)