2.1.3 静止画 画像処理・解析のワークフロー

# 目次へのリンク


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

# 概要


MATLABで静止画の画像処理を行うワークフローについてご紹介します。




画像の読み込み、解析、可視化、書き出しまでを少ないコードで実現できます。




画像処理・解析のワークフローを身に着けて活用しましょう。




対応ファイル



   -  [I2_01_3_workflow_still.m](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_01_3_workflow_still.m) 

# 初期化


変数などをクリアします。


```matlab:code
clear;clc;close all;imtool close all
```
# 静止画の読み込み


静止画像の読込みます。


```matlab:code
A=imread('peppers.png');
%
% ここに各種画像処理･解析 のコードを挿入 −−−−−−−−−
%
```
# 静止画の可視化
```matlab:code
figure;
imshow(A);
```

![figure_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/1f64f08d-d498-665f-cb7f-eef6fd442050.png)


# 解析結果の挿入


例として玉ねぎを四角で囲んでみます。簡単に可視化を行うことができます。


```matlab:code
loc = [187 75 82 63];     % 例：座標が解析により得られたとした例
A1 = insertShape(A, 'Rectangle', loc, 'Color', 'cyan', 'LineWidth', 3);
figure; imshow(A1);
```

![figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/db7b2690-1cbe-de98-a8da-954dcdcb6ebf.png)

# 結果の書き出し


結果を画像ファイルとして簡単に書き出せます。


```matlab:code
imwrite(A1, 'tmp_result.png');
```

# 歯車の欠け検出を例にした静止画処理ワークフロー

歯車の画像を読み込んで歯車の欠けを検出例を用いて実際の静止画処理のワークフローを紹介します。


## 画像の読込み
```matlab:code
G = imread('I2_01_3_gear7g.jpg'); % 変数宣言不要。容易な多次元配列取扱い
imtool(G);                   % 容易な可視化
```

![figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/41c66d99-13c9-cdbf-965f-c8bfa11ff131.png)



## 前処理:二値(白黒)画像に変換

2値化します。

```matlab:code
BW = G > 130;     % 二次元の配列と、数値の比較。自動閾値設定：BW=im2bw(G, graythresh(G));     150
imtool(BW);       % ピクセル値を確認 (0と1の、2値画像)
```


![figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/966f7a9e-08d9-21f6-f2af-7a3cd3ea2d68.png)


## フィルタ処理:トップハット フィルタ処理で、歯の部分を抽出


モルフォロジー処理(形態素処理)を行います。元画像からオープニング画像を引くことで歯車の歯の部分を抽出します。


```matlab:code
%トップハットフィルタ処理を１つの関数で実行も可能
% BWtoph = imtophat(BW, strel('Disk',30,8));         
```


収縮処理を実行します。


```matlab:code
BWerode = imerode(BW, strel('Disk',30,8));          % 収縮
imshow(BWerode);
```


![figure_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/16c89ace-c66e-f5de-166a-670de850e475.png)



膨張処理を実行します。これにより指定した半径以下の領域が削られます。


```matlab:code
BWdilate = imdilate(BWerode, strel('Disk',30,8));   % 膨張
figure;imshow(BWdilate);
```


![figure_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/774d0902-b74b-ebd0-0cd8-1a24bfa1a98c.png)



元の画像からオープニング画像を引き算し、歯車の歯の部分を抽出します。


```matlab:code
BWtoph = imsubtract(BW, BWdilate);       % 元画像 - Opening画像
imshow(BWtoph);
```

![figure_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/fef93cd9-dce7-3515-23fe-3d22ea42e0da.png)


## 後処理：細かなノイズの除去

後処理として残った小さなゴミを除去します。今回は50ピクセルをしきい値としてそれ以下のものは歯ではなくノイズとして除去します。

```matlab:code
BWclear = bwareaopen(BWtoph, 50); % 50ピクセル以下のものを削除
imshow(BWclear);
```


![figure_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/9bcfb118-a512-d451-f1d2-e8485cf5103a.png)



## 途中結果の可視化


ここまでの結果を、並べて表示します。


```matlab:code
figure; imshowpair(BW, BWclear, 'montage');shg;
```


![figure_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/b05821eb-4b21-aaf9-88ff-05246b559072.png)




２つの画像を重ねて表示します。


```matlab:code
imshowpair(BW, BWclear);shg;   % 白：変化ない部分、緑：元の画像のみに存在
```

![figure_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/b9e70754-d02c-4c55-ff3c-b58acd3d17b8.png)




## 計測：各歯の面積と中心点の測定


各歯の領域の面積と重心を計算します。面積の小さい順に並び替え、極端に小さい領域があれば欠けと判断できます。



```matlab:code
stats = regionprops('table', BWclear, 'Area', 'Centroid');
sortrows(stats) % 面積の小さい順にソート
```
| |Area|Centroid| |
|:--:|:--:|:--:|:--:|
|1|77|390.4935|389.8571|
|2|119|218.4454|138.2521|
|3|121|222.1570|426.0496|
|4|124|241.8387|432.3790|
|5|125|144.3200|204.7120|
|6|126|136.5476|341.9683|
|7|126|200.2778|147.4286|
|8|127|135.6220|222.8898|
|9|127|168.7717|172.4094|
|10|127|424.1260|218.0079|
|11|128|337.5859|135.8047|
|12|128|432.9141|318.5000|
|13|129|203.8372|417.0078|
|14|129|323.5271|431.4806|

## グラフ化： ヒストグラムの表示


ヒストグラムとして面積の分布を確認することもできます。欠けのある歯車は正常な歯の面積の集団から離れています。


```matlab:code
figure; histogram([stats.Area], 1:179);
```


![figure_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/55c0dcaf-30d1-0d7f-73a4-f0cbe023ba69.png)




## 結果の可視化

欠けのある場所を可視化し、目視で確認します。

```matlab:code
ind = find([stats.Area] < 100);  % ベクトルと数値の比較
Gresult2 = insertShape(G, 'Circle', [stats.Centroid(ind,:) 18], 'LineWidth',4, 'Color','red', 'Opacity',1);
Gresult3 = insertText(Gresult2, [10, 10], 'Defect Tooth: indicated by Red Circle', 'FontSize', 30, 'BoxColor','red', 'BoxOpacity',1);
imshow(Gresult3);
```



![figure_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14336/6dea6fbb-9d32-605c-006e-03772395f316.png)




# まとめ

MATLABによる画像処理の静止画のワークフローをご紹介しました。
お手持ちの画像でお試しください。

# 参考

   -  [画像処理](https://jp.mathworks.com/discovery/image-processing.html) 
   -  [イメージ内の円形オブジェクトの検出と測定](https://jp.mathworks.com/help/images/detect-and-measure-circular-objects-in-an-image.html)


# 謝辞


本記事は @eigs さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。



# 目次へのリンク


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