91139


**問題**  
私はある温度分布を予測して、その出力が本来の温度分布とどれだけ誤差があるのか調べたいと思っています。例として日本の陸地の温度を予測したいとします。添付する画像において上の画像が本来の画像、下の画像が予測した画像だとします。黒いところが26度、灰色のところが25度、非常に分かりにくいですがその右の薄い灰色を24度と考えてください。すると誤差があると思います。これが単位を温度としてどれだけの誤差があるのかを数値化しようと考えているのですが、その方法が分かりません。尚その誤差を出す時に、海の部分は誤差を出す際に計算に入れないようにして、陸地部分のみでの誤差を出したいです。

**これまでに試した事**  
取り敢えず類似率を出しました。類似率は1以下とし、全く同じ場合は1が出力される様にしました。同じ場合でない場合は例えば0.56869といった様な出力がされる様にしました。該当コードを以下に記述します。

[code]

    import cv2
    import os
    
    TARGET_FILE = '05.png'
    IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/images/'
    IMG_SIZE = (200, 200)
    
    target_img_path = IMG_DIR + TARGET_FILE
    target_img = cv2.imread(target_img_path)
    target_img = cv2.resize(target_img, IMG_SIZE)
    target_hist = cv2.calcHist([target_img], [0], None, [256], [0, 256])
    
    print('TARGET_FILE: %s' % (TARGET_FILE))
    
    files = os.listdir(IMG_DIR)
    for file in files:
        if file == '.DS_Store' or file == TARGET_FILE:
            continue
    
        comparing_img_path = IMG_DIR + file
        comparing_img = cv2.imread(comparing_img_path)
        comparing_img = cv2.resize(comparing_img, IMG_SIZE)
        comparing_hist = cv2.calcHist([comparing_img], [0], None, [256], [0, 256])
    
        ret = cv2.compareHist(target_hist, comparing_hist, 0)
        print(file, ret)
    
[/code]

しかしこれでは誤差の単位が無く、これを全体的にどれだけの温度の誤差があるのか（例えばこの2枚を比較した際に0.27788度誤差があるの様に）を出力する様にしたいと考えています。

**実現したい事**  
下の2枚の画像において陸地部分の温度の誤差がどれだけあるか、誤差の単位を温度で出力する方法をご教示いただけますでしょうか。それには先ず黒いところが26度、灰色のところが25度、薄い灰色が24度であるという事を含めないといけないと思います。無知で大変申し訳ございませんが、よろしくお願いいたします。  
＊今回は一例として示す為に以下から画像を取得しました。[リンク](https://www.jma.go.jp/jma/kishou/know/suikei_kishou/kaisetsu.html)この画像をグレースケール画像に変換したものを、添付した画像としています。この添付した画像での温度の誤差を示したいと考えてください。  
[![本来の画像](https://i.stack.imgur.com/Na1a9.png)](https://i.stack.imgur.com/Na1a9.png)

[![予測した画像](https://i.stack.imgur.com/T4iTE.png)](https://i.stack.imgur.com/T4iTE.png)

**補足情報（FW/ツールのバージョンなど）**  
言語：Python  
環境：Windows10  
ブラウザ：Google Chrome（Google Colaboratory)  
＊ノートパソコンです。全て最新バージョンです。プログラミング中はcolab以外のタブ、アプリは開いていません。  
＊急を要する為、こちらのサイトでも同内容の質問をしています。  
<https://teratail.com/questions/aerlw5zu94r2gm>


CC BY-SA 4.0
2022-09-04T12:17:25.193
90923
2022-09-17T01:07:53.070
2022-09-12T11:06:52.867
48040
48040
question
python google-colaboratory 画像処理
温度分布画像予測の誤差の単位を温度に対応させたい


自己解決です。以下に2値化画像取得プログラムと誤差取得プログラムを示します。  
1：2値化

[code]

    import cv2
    import numpy as np
    from pylab import * #imshowが無いというエラー防止
    
    img = cv2.imread("/content/drive/MyDrive/mask_before.png",0)
    
    ret, thresh = cv2.threshold(img, 168, 255, cv2.THRESH_BINARY)#1つめの数以上の画素値は２つ目の数の画素値にする
    thresh[thresh > 0] = 255 # 0以外は255に
    cv2.imwrite("/content/drive/MyDrive/mask.png", thresh)
    
[/code]

2：誤差

[code]

    import cv2
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    
    TARGET_FILE = 'target.PNG'
    #print(TARGET_FILE)
    IMG_DIR = os.path.abspath(os.path.dirname("__file__")) + '/drive/MyDrive/images/'#imagesフォルダの中にあるファイルが比較対象
    print(IMG_DIR)
    #IMG_SIZE = (312, 312)
    
    target_img_path = IMG_DIR + TARGET_FILE #比較対象を足す
    target_img = cv2.imread("/content/drive/MyDrive/images/target.PNG",0)
    print(target_img)
    #target_img = cv2.resize(target_img, IMG_SIZE)
    #target_hist = cv2.calcHist([target_img], [0], None, [256], [0, 256]) #ヒストグラムを出す際に使う
    
    #target_img = int(target_img_origin)
    target_img[target_img <= 36] = 26
    target_img[((target_img >= 37) & (target_img <= 139))] = 25
    target_img[((target_img >= 140) & (target_img <= 224))] = 24
    target_img[target_img >= 225] = 23
    
    print('TARGET_FILE: %s' % (TARGET_FILE)) #%sは文字列出力に使う、ターゲットファイルはどのpngファイルか
    
    #img_diff = cv2.diff(TARGET_FILE, IMG_DIR) #diffで差分の計算を行う
    #plt.imshow(img_diff)
    
    #img_diff = cv2.cvtColor(img_diff, cv2.COLOR_BGR2GRAY)
     
    mask_img = cv2.imread("/content/drive/MyDrive/mask.png",0)
    print(mask_img) #Noneが返ってきたらファイルが存在していないので、これで確かめる
    mask_img[mask_img > 0] = 1 # 0以外は1に
    files = os.listdir(IMG_DIR) #ディレクトリとファイルの一覧を取得
    for file in files:
        if file == '.DS_Store' or file == TARGET_FILE:
            continue
    
        comparing_img_path = IMG_DIR + file
        comparing_img = cv2.imread(comparing_img_path,0)
    
        comparing_img[comparing_img<=36] = 26
        comparing_img[((comparing_img>=37) & (comparing_img<=139))] = 25
        comparing_img[((comparing_img>=140) & (comparing_img<=224))] = 24
        comparing_img[comparing_img>=225] = 23
    
        img_diff = target_img.astype(int) - comparing_img.astype(int)
        print(img_diff.max())
        print(img_diff.min())
    
        print((img_diff * mask_img).sum() / mask_img.sum())
        print(np.average(img_diff, weights=mask_img))
    
        print(np.abs(img_diff * mask_img).sum() / mask_img.sum())
        print(np.average(np.abs(img_diff), weights=mask_img))
    
[/code]


CC BY-SA 4.0
2022-09-17T01:07:53.070
91139
2022-09-17T01:07:53.070
48040
90923
answer