（ブラウザ版）画像処理を用いた結晶粒度の測定アプリ

# はじめに
JIS G0551 : 2020 鋼－結晶粒度の顕微鏡試験方法で規定されている「切断法」により結晶粒度を評価（粒度番号を測定）するウェブアプリを作成しました。

アプリの特徴は次のとおりです。

- Edgeなどのブラウザで動作（インターネットに接続されていること）
- 試験方法：試験線と結晶粒界との公差点の数と画像の倍率から粒度番号を算出
- 試験線の種類は円と直線に対応
- 組織画像の「撮影倍率」や「その倍率で表示したときの画像の幅」などの値をアプリに入力することより、幅広い組織画像の評価に対応
- 試験線と結晶粒界との交差点は画像処理で検出した後、「マウスの左・右クリック」により手動で編集可能
    - 試験線と三重点との交点は、「Alt＋マウスの左・右クリック」により手動で編集可能

以下では、使い方やプログラムの内容について説明します。

# 作成したアプリ
https://repositoryfiles.github.io/MeasurementGrainSizeUsingInterceptMethodWithImageProcessing/

# 使い方
1. 粒度番号を評価したい組織画像を用意します。以下URLのimgフォルダ内にサンプル画像があるので、それらを使うこともできます。
imgフォルダ内の画像ファイル名は　「材料名_熱処理_mag倍率_size画像の幅」 としています。
https://github.com/repositoryfiles/MeasurementGrainSizeUsingInterceptMethodWithImageProcessing

2. 上の「作成したアプリ」にアクセスするとウェブアプリが立ち上がります。左上に```Ready```と表示されていれば使用可能です。

3. 「ファイルの選択」をクリックして、読み込む画像を選んで開きます。組織画像が表示されます。

4. ```Select Type of test line```で試験線の種類（```Circles``` または ```Lines```）を選択します。

5. ```Magnification```と```Pincture Width```に数値を入力します。```Magnification```は組織画像の倍率で、```Pincture Width```はその倍率（```Magnification```）で表示させるための画像の大きさ（画像の幅）を入力します。デフォルト値として、```Magnification```には1000、```Pincture Width```には142がそれぞれ設定されています。

6. ```Picture Width Durring Analysis```は解析時の画像の幅です。直線の試験線を描画できるようにするため、デフォルトでは180mmとしています。

7. 「```Analysis```」をクリックすると、円又は直線の試験線が青色で表示され、自動的に検知した試験線と結晶粒との交点が赤色で表示されます。

8. マウスを使って試験線と結晶粒界との交点の位置を修正します。左クリックで交点を追加でき、右クリックで削除できます。試験線から離れた位置では交点の追加はできないようになっています。一方、三重点の追加と削除は、Altキーを押したしたままマウスを左クリックで追加でき、右クリックで削除できます。三重点の追加は試験線から離れた位置でもできるため、使用の際は注意してください。

9. 「```Analysis```」の下に測定結果等が表示されます。交点を追加・削除するたびに測定結果等の値は更新されます。

10. 「```Download Picture```」をクリックすると、試験線や交点が描画された画像を保存できます。ファイル名は「元のファイル名_(解析時の画像の倍率_解析時の画像の幅_試験線1mmあたりの交点数_粒度番号)」となります。

11. 「```Reload Page```」はアプリを再読み込みしたいときにクリックします（F5キーと同様な機能です）。

# プログラムの機能
- 画像の読み込み
ユーザーが「ファイル選択」ボタンを押して組織画像を選択すると、画像ファイルを読み込み、画面に表示します。

- 「Analysis」をクリックすると画像解析により試験線と交差する結晶粒界を自動的に求め、粒度番号などを算出して表示します。具体的には、以下の作業が行われます。

    1. グレースケール化（白黒画像に変換）
画像を**グレースケール画像**に変換します。
グレースケール画像とは、「色の情報」をなくした「明るさ（輝度）」だけの画像です。これにより、結晶粒界と背景のコントラストをはっきりさせます。
    1. 二値化処理（白黒をはっきり分ける）
次に二値化と呼ばれる処理を行います。
二値化とは、画像の中で明るい部分を白、暗い部分を黒にする処理です。このプログラムでは、**白黒を反転して二値化**します。これにより、粒界を検出しやすくします。
    1. 粒子（結晶粒）の輪郭を検出
OpenCVというライブラリを使用し、白黒画像の **輪郭（Contour）** を検出します。この輪郭が結晶粒界とみなされます。
    1. 小さいノイズの除去
小さすぎる粒子（ノイズ）を自動的に取り除きます。このプログラムでは、10µm以下の微小粒子をノイズとして処理しています。この値は **minSize** で変更できます。
    1. 試験線（テストライン）の生成
ユーザーが選択した方法によって、次の2種類の測定方法を適用します。
    ① 円（Circles）
    　画像の中心に3つの同心円（大・中・小の円）を表示します。
    ② ライン（Lines）
    　画像上に4本の直線（水平・垂直・斜め）を表示します。

    1. 試験線の座標値の取得
   試験線のx, y座標値を取得します。

    1. 交差回数のカウント
6.で取得した試験線上の各座標値における画像の画素値を求め、255（白色）であれば交差していると判断し、その座標値を交差点として登録します。公差点の個数が多いほど結晶粒が小さいことを意味します。**三重点（Triple Junctions）** については手動で追加します。三重点とは、3つの結晶粒界が交差する点を表します。

    1. 粒度番号（Grain Size Number）の算出
G0551の式(A.14)に式(A.11)を代入して$G=$の形に書き換えて、$\bar{N_L}$（試験線の単位長さ当たりの、補足した結晶粒の平均数）を$\bar{P_L}$（試験線の単位長さ当たりの結晶粒界の交点の数の平均数）に置き換え、次式の粒度番号を計算します。
$　　G = -3.3335 + 6.6439 \times \log_{10}\bar{(P_L)}$

    1. 結果の表示
解析結果は次のように表示されます。

|内容|説明|
|---|---|
|Type of test line|CirclesまたはLines|
|Magnification of the Picture During Analysis|	解析時の画像の倍率（例：1000倍）|
|Number of Grain Boundary Intersections|粒界と試験線との交点数|
|Number of Grain Boundaries  Intersections per 1 mm |試験線1mmあたりの交点数|
|Grain Size Number by the Intercept Method|	粒度番号（G）|

- 手動による交点の追加・削除
画像処理によって自動で求められた交点を手動操作により追加・削除できます。交点を追加・削除するたびに解析結果が更新されます。

  ① マウス左クリック：交点を追加
試験線上の位置をクリックすると「交点（赤色）」を追加できます。
  ② 右クリック：交点を削除
削除したい交点を右クリックすると「交点（赤点）」を削除できます。
  ③ Alt + マウス左または右クリック：三重点を追加または削除
【Altキー】を押しながら左または右クリックすると「三重点（紫点）」を追加または削除できます。試験線上でなくても交点を追加・削除できるので、注意してください。
三重点は試験線が円（Circles）の場合は2、直線（Lines）の場合は1.5とカウントします（JIS G0551に準じる）。
&nbsp;  

- ダウンロード機能
解析結果の画像を保存
「Download Picture」ボタンを押すと、解析結果の画像をJPEGファイルでダウンロードできます。ファイル名は、入力ファイル名と解析条件を反映した「 **画像ファイル名_解析時の倍率_解析時の画像幅_試験線1mm長さあたりの交点数_粒度番号.jpg** 」の形式になります。

- リロード機能
「 **Reload Page** 」ボタンを押すと、ページがリロードされ、最初からやり直すことができます。

# 終わりに
- JIS G0551の内容をご理解の上、ご使用ください。
- ご使用結果について、当方は責任は負いません。