• トップ
  • ブログ一覧
  • 【後編】Pythonでカンタン画像解析~錆の面積はどれくらい?~
  • 【後編】Pythonでカンタン画像解析~錆の面積はどれくらい?~

    広告メディア事業部広告メディア事業部
    2020.10.08

    IT技術

    python で画像解析してみよう!

    業務の効率化や不明確値の定量化に大きく貢献してくれる「画像解析」。

    前回に引き続き、python の特色である「モジュール」と「プログラミング技術」を活用して、仕事の効率化をはかりましょう!

    今回は、錆の面積を算出していきたいと思います。

    前回の記事を読んでいない方は、まずはこちらをお読みください。

    featureImg2020.10.06【前編】Pythonでカンタン画像解析~タピオカはいくつ?~python で画像解析してみよう!業務の効率化や不明確値の定量化に大きく貢献してくれる「画像解析」。難しそうに思うか...

    異物検知アルゴリズムの応用

    今回紹介した「異物検知アルゴリズム」の構築は、産業的にも様々な応用が可能です。

    Deep learning のインプットにするも良し、アルゴリズム単体でも応用が可能でしょう。

    画像解析で錆の面積を算出しよう

    たとえば、配管の腐食を検知するにあたって「錆」の検出は非常に重要です。

    今度は応用編として、以下の画像を解析し、錆の面積率を算出してみましょう。

    錆画像

    色の明暗で判定

    タピオカでも最初に試した、一定の敷居値より「暗い」箇所を切り出すコードです。

    1## もっとも単純な方法 ##
    2img_bw = imread('PEI85_sabitakabe_TP_V.jpg', 2)
    3hit, wid = img_bw.shape
    4
    5## 一定の敷居値(今回は120)より暗い箇所のみ表示 ##
    6from numpy import sum
    7img_bw_m = where(img_bw < 120, 1, 0)
    8pyplot.imshow(img_bw_m)
    9print("Rust ratio is :", sum(img_bw_m) / (hit * wid) * 100, '%')

    結果はいまいち…

    40%ほどが、錆の領域だと判定されましたね。

    この方法はやはり、タピオカの実験と同じような欠点があります。

    画像に影があった場合は?

    では、例えば、この画像に影がさしかかっていたらどうなるでしょうか?

    1## 画像の上半分を暗くする(影がかかっていることをイメージ) ##
    2img_bw = imread('PEI85_sabitakabe_TP_V.jpg', 2)
    3hit, wid = img_bw.shape
    4for i in range(int(hit / 2)):    img_bw[i] = img_bw[i] / 2
    5
    6## 先ほどと同様暗い箇所を抽出
    7img_bw_m = where(img_bw < 120, 1, 0)
    8pyplot.imshow(img_bw_m)
    9print("Rust ratio is :", sum(img_bw_m) / (hit * wid) * 100, '%')

    影=錆になってしまった

    案の定、影の部分も錆として検知されてしまいました。

    HSV を使って検知してみよう

    では、先ほどと同様に、HSV 空間に射影してから「赤っぽいところ」を検知させてみましょう。

    1## カラーで読み込む ##
    2img_bgr = imread('PEI85_sabitakabe_TP_V.jpg', 6)
    3for i in range(int(hit / 2)):    img_bgr[i] = img_bgr[i] / 2
    4img_hsv = cvtColor(img_bgr, COLOR_BGR2HSV)
    5
    6## 赤色の範囲を定義 ##
    7hsv_min = array([0,   64,   0])
    8hsv_max = array([15, 255, 255])
    9
    10## 赤色 ≒ さび色をマスクとして定義する ##   
    11mask = inRange(img_hsv, hsv_min, hsv_max)
    12
    13## マスクの面積率を算出(マスクは0 or 255なので255で割る必要)) ##
    14pyplot.imshow(mask)
    15print("Rust ratio is :", sum(mask) / 255 / hit / wid * 100, '%')

    検知成功!

    今度こそ成功です!

    多少の誤差はありますが、影がかかっていても、ほぼ完璧に検知できていますね。

    さいごに

    今回は、HSV 空間への射影を用いた「opencv」の基本的な使い方を紹介しました。

    画像解析の技術そのものは、産業的にも医療的にも応用先が無限に存在します。

    ぜひ、皆さんの作業効率化やソフト開発にも活用してみてくださいね!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事