

タイトルの件、原因がわからず行き詰ってしまいましたのでご質問させて頂きました。

### 質問事項

Pythonで、以下2つのHSV値を比較するプログラムを書いています。

  * pyautogui.screenshotで取得した画像に対して、np.arrayに変換 → cv2.cvtColor でHSVに変換して値を取得
  * 上記をRGBで保存したファイルに対して、np.fromfileで読込 → cv2.imdecode → cv2.cvtColor でHSVに変換して値を取得

両方とも元は同一画像のため、HSV値も同一値を想定したのですが、結果として差異が出てしまっています。  
読込、変換の仕方なのか、仕様として差異がでるものなのか、について、ご存じの方がいらっしゃいましたら教えていただきたいと考えています。

### 環境

Python 3.8.8  
cv2. **version** '4.5.3'  
np. **version** '1.20.1'  
pyautogui. **version** '0.9.53'

### ソース

hsvList1 と hsvList2 で差異が出てしまう

[code]

    import pyautogui
    import cv2
    import numpy as np
    
    #取得座標の設定
    x = 1000
    y = 1000
    width = 1000
    hight = 1000
    
    #スクリーンショットを取得
    sc = pyautogui.screenshot(region=(x, y, width, hight))
    
    #np.arrayに変換
    sc_im = np.array(sc, dtype = 'uint8')
    
    #BGRからHSVに変換
    sc_im = cv2.cvtColor(sc_im, cv2.COLOR_BGR2HSV)
    
    #HSVの最大値と最小値を取得
    h_min_1 = sc_im.T[0].flatten().min()
    h_max_1 = sc_im.T[0].flatten().max()
    
    s_min_1 = sc_im.T[1].flatten().min()
    s_max_1 = sc_im.T[1].flatten().max()
    
    v_min_1 = sc_im.T[2].flatten().min()
    v_max_1 = sc_im.T[2].flatten().max()
    
    hsvList1 = [h_min_1, h_max_1, s_min_1, s_max_1, v_min_1, v_max_1]
    print(str(hsvList1))
    
    #RGBに変換して保存する
    sc = sc.convert('RGB')
    sc.save("test.jpg")
    
    #保存したファイルを読込み
    n = np.fromfile("test.jpg", np.uint8)
    file_im = cv2.imdecode(n, flags=cv2.IMREAD_COLOR)
    
    #HSVに変換
    file_im = cv2.cvtColor(file_im, cv2.COLOR_BGR2HSV)
    
    #HSVの最大値と最小値を取得
    h_min_2 = file_im.T[0].flatten().min()
    h_max_2 = file_im.T[0].flatten().max()
    
    s_min_2 = file_im.T[1].flatten().min()
    s_max_2 = file_im.T[1].flatten().max()
    
    v_min_2 = file_im.T[2].flatten().min()
    v_max_2 = file_im.T[2].flatten().max()
    
    hsvList2 = [h_min_2, h_max_2, s_min_2, s_max_2, v_min_2, v_max_2]
    print(str(hsvList2))
    
[/code]

### printの出力例

[code]

    [0, 176, 0, 255, 2, 255]
    [0, 179, 0, 255, 0, 255]
    
[/code]


CC BY-SA 4.0
2021-09-25T15:36:54.287
82684
2022-08-10T06:20:43.890
2022-08-10T06:20:43.890
3060
48365
question
python opencv numpy 画像 pyautogui
pyautoguiで取得した時点と、同一画像を保存後に再読み込み時のHSV値で差が出てしまう


ご回答頂き解決しました。原因および対応は以下となります。  
◆原因  
JPEG 形式(非可逆圧縮)で保存した画像を読み込んでいたため、スクリーンショット取得時と差異が出ていた。（仕様通り）

◆対策  
画像をPNG形式で保存し、読込を行う。（差異がないことは確認済み）

◆補足  
ソースコード上、画像読込後、「cv2.COLOR_BGR2HSV」となっていましたが、「cv2.COLOR_RGB2HSV」が正しいです。  


CC BY-SA 4.0
2021-09-27T03:58:22.843
82705
2021-09-27T03:58:22.843
48365
82684
answer