前提
私はある温度分布を予測して、その出力が本来の温度分布とどれだけ誤差があるのか調べたいと思っています。今回は日本の陸地の温度を予測したいとします。添付する画像において上の画像が本来の画像、下の画像が予測した画像だとします。黒いところが26度、灰色のところが25度、非常に分かりにくいですがその右の薄い灰色を24度と考えてください。すると誤差があると思います。これが単位を温度としてどれだけの誤差があるのかを数値化しようと考えているのですが、その方法が分かりません。尚その誤差を出す時に、海の部分は誤差を出す際に計算に入れないようにして、陸地部分のみでの誤差を出したいです。その際に行き詰ってしまいました。
実現したいこと
下の2枚の画像において陸地部分の温度の誤差がどれだけあるか、誤差の単位を温度で出力する方法をご教示いただけますでしょうか。それには先ず黒いところが26度、灰色のところが25度、薄い灰色が24度であるという事を含めないといけないと思います。無知で大変申し訳ございませんが、よろしくお願いいたします。
*今回は一例として示す為に以下から画像を取得しました。
URL:https://www.jma.go.jp/jma/kishou/know/suikei_kishou/kaisetsu.html
この画像をグレースケール画像に変換したものを、添付した画像としています。この添付した画像での温度の誤差を示したいと考えてください。1番下の画像が2値化したものです(海を黒、それ以外を255にしただけで境界線等は黒のままです)
発生している問題・エラーメッセージ
問題は上記に示した通りです。エラーはありません。
該当のソースコード
以下に2値化画像取得、及び誤差を求めるプログラムを示します。これが解決した際に訂正したコードです。
①2値化画像取得プログラム
Python
1import cv2 2import numpy as np 3from pylab import * #imshowが無いというエラー防止 4 5img = cv2.imread("/content/drive/MyDrive/mask_before.png",0) 6 7ret, thresh = cv2.threshold(img, 168, 255, cv2.THRESH_BINARY)#1つめの数以上の画素値は2つ目の数の画素値にする 8thresh[thresh > 0] = 255 # 0以外は255に 9cv2.imwrite("/content/drive/MyDrive/mask.png", thresh)
②誤差を求めるプログラム
Python
1import cv2 2import os 3import numpy as np 4import matplotlib.pyplot as plt 5 6TARGET_FILE = 'target.PNG' 7#print(TARGET_FILE) 8IMG_DIR = os.path.abspath(os.path.dirname("__file__")) + '/drive/MyDrive/images/'#imagesフォルダの中にあるファイルが比較対象 9print(IMG_DIR) 10#IMG_SIZE = (312, 312) 11 12target_img_path = IMG_DIR + TARGET_FILE #比較対象を足す 13target_img = cv2.imread("/content/drive/MyDrive/images/target.PNG",0) 14print(target_img) 15#target_img = cv2.resize(target_img, IMG_SIZE) 16#target_hist = cv2.calcHist([target_img], [0], None, [256], [0, 256]) #ヒストグラムを出す際に使う 17 18#target_img = int(target_img_origin) 19target_img[target_img <= 36] = 26 20target_img[((target_img >= 37) & (target_img <= 139))] = 25 21target_img[((target_img >= 140) & (target_img <= 224))] = 24 22target_img[target_img >= 225] = 23 23 24print('TARGET_FILE: %s' % (TARGET_FILE)) #%sは文字列出力に使う、ターゲットファイルはどのpngファイルか 25 26#img_diff = cv2.diff(TARGET_FILE, IMG_DIR) #diffで差分の計算を行う 27#plt.imshow(img_diff) 28 29#img_diff = cv2.cvtColor(img_diff, cv2.COLOR_BGR2GRAY) 30 31mask_img = cv2.imread("/content/drive/MyDrive/mask.png",0) 32print(mask_img) #Noneが返ってきたらファイルが存在していないので、これで確かめる 33mask_img[mask_img > 0] = 1 # 0以外は1に 34files = os.listdir(IMG_DIR) #ディレクトリとファイルの一覧を取得 35for file in files: 36 if file == '.DS_Store' or file == TARGET_FILE: 37 continue 38 39 comparing_img_path = IMG_DIR + file 40 comparing_img = cv2.imread(comparing_img_path,0) 41 42 comparing_img[comparing_img<=36] = 26 43 comparing_img[((comparing_img>=37) & (comparing_img<=139))] = 25 44 comparing_img[((comparing_img>=140) & (comparing_img<=224))] = 24 45 comparing_img[comparing_img>=225] = 23 46 47 img_diff = target_img.astype(int) - comparing_img.astype(int) 48 print(img_diff.max()) 49 print(img_diff.min()) 50 51 print((img_diff * mask_img).sum() / mask_img.sum()) 52 print(np.average(img_diff, weights=mask_img)) 53 54 print(np.abs(img_diff * mask_img).sum() / mask_img.sum()) 55 print(np.average(np.abs(img_diff), weights=mask_img)) 56
試したこと
上記のコードを書きました。これを全体的にどれだけの温度の誤差があるのか(例えばこの2枚を比較した際に0.27788度誤差があるの様に)を出力する様にしたいと考えていました。この誤差は図全体での平均での温度誤差に対応します。つまり1つの数値のみ出れば良いという考え方です。
以下に実際に出力されたものを示します(printの部分を変えているので、出力が一部足りないところがあると思います。最終的な出力が最後の4つになります)。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
/content/drive/MyDrive/images/
[[ 0 90 37 ... 176 255 255]
[190 226 225 ... 176 255 255]
[226 1 146 ... 176 255 255]
...
[168 168 168 ... 164 255 255]
[168 168 168 ... 167 255 255]
[168 168 168 ... 188 255 255]]
TARGET_FILE: target.PNG
3
-3
[[ 0 0 0 ... 255 255 255]
[255 255 253 ... 255 255 255]
[255 0 2 ... 255 255 255]
...
[ 0 0 0 ... 2 254 255]
[ 0 0 0 ... 0 254 255]
[ 0 0 0 ... 255 255 255]]
0.10114034578226946
0.10114034578226946
0.21099301078391514
0.21099301078391514
補足情報(FW/ツールのバージョンなど)
言語:Python
環境:Windows10
ブラウザ:Google Chrome(Google Colaboratory)
*ノートパソコンです。全て最新バージョンです。プログラミング中はcolab以外のタブ、アプリは開いていません。
*急を要する為、こちらでも同じ質問をさせていただいています。しかし1週間近く経過しても回答が無かった為、teratailでも質問させていただいてます。https://ja.stackoverflow.com/questions/90923/%e6%b8%a9%e5%ba%a6%e5%88%86%e5%b8%83%e7%94%bb%e5%83%8f%e4%ba%88%e6%b8%ac%e3%81%ae%e8%aa%a4%e5%b7%ae%e3%81%ae%e5%8d%98%e4%bd%8d%e3%82%92%e6%b8%a9%e5%ba%a6%e3%81%ab%e5%af%be%e5%bf%9c%e3%81%95%e3%81%9b%e3%81%9f%e3%81%84

回答2件
あなたの回答
tips
プレビュー