PythonのOpenCVで歯列の変化の検知を試みたが…
矯正の成果を可視化するため、たまに歯列の写真を撮っています。
1クール目の3週間分くらい溜まったので、 少しでも変化があるか、
趣味で弄っているPythonのOpenCVで検知できないか試してみました。
結論として、上手くいかなかったので再チャレンジします!涙
また、お見苦しい歯列の写真が出てきます…ので写真を含む内容は「続きを読む」から。
環境
- windows10
- python3.6
やったこと
- 画像ファイルの読み込み
今回は、試しに1クール目1日目、2日目、21日目 - 画像データをグレースケールに変換
- 画像データの差を表示
1日目-2日目、1日目-21日目
Pythonソース
import cv2 import os import matplotlib.pyplot as plt %matplotlib inline # 画像を読み込む # ※すべての画像は同じh×wである必要がある image_01 = cv2.imread('./comparison/_20190915_103530.JPG') image_02 = cv2.imread('./comparison/_20190916_125042.JPG') image_final = cv2.imread('./comparison/_20191006_172343.JPG') # 比較しやすいようにグレースケールに変換する g_01 = cv2.cvtColor(image_01, cv2.COLOR_RGB2GRAY) g_02 = cv2.cvtColor(image_02, cv2.COLOR_RGB2GRAY) g_final = cv2.cvtColor(image_final, cv2.COLOR_RGB2GRAY) # 確認のため表示する # ※画像自体はグレースケールに変換されているが、表示の際に調整がかかるため、cmap='gray'でグレーを指定する plt.imshow(g_01, cmap='gray') plt.imshow(g_02, cmap='gray') plt.imshow(g_final, cmap='gray') # 画像の差を絶対値で取得 diff_01_02 = cv2.absdiff(image_01,image_02) diff_01_final = cv2.absdiff(image_01,image_final) # 保存 cv2.imwrite('./comparison/diff_01_02.jpg', diff_01_02) cv2.imwrite('./comparison/diff_01_final.jpg', diff_01_final) # 表示 # ※差が大きいほど白で表示される plt.imshow(diff_01_02) plt.imshow(diff_01_final)
画像
まずは、比較する元の画像たちです。
・1日目
・2日目
・21日目
私は、右の上の歯が引っ込んでいるのを特に気にしています。
パッと見はまだ全然変化がないですね。
これらをすべてグレースケール化し、比較します。
・1日目と2日目(diff_01_02)
めっちゃ怖いし、全然比較できていないなあ…。
画像の白い部分が、差が大きいところになりますが、
1日目と2日目の比較なので、期待値としてはまったく差がないことなのですが、
変なところが白くなっているなあ。
・1日目と21日目(diff_01_final)
元の画像があまりよくないからか、
期待していない箇所が、差が大きいように見えてしまいますね。
通常であれば、
adsdiffで差分を取ったあと、結果を二値化して、差が大きい箇所を検知するみたいです。
今の時点ではこれ以上進めることが出来なさそうなので、
今後、元の写真を何らかの方法で比較しやすく加工したり、
もっと矯正が進んでから、改めて挑戦してみます。
ここまで読んで頂き、有難う御座いました!