

以下のエラーが表示されますが、どこを改善したらいいのかよくわかりません。  
どうやら72行目の `pixels2.append(tmp)` の部分がエラーみたいです。

**エラーメッセージ:**

[code]

    ValueError: not enough values to unpack (expected 3, got 1)
    
[/code]

`# 各フォルダのファイルを1つずつ読み込み、処理してリストへ格納`

ここ以降のコードの意味がよくわからないため、その解説もお願いしたいです。  
よろしくお願いします。

**ソースコード:**

[code]

    #%%
    import cv2
    import numpy as np
    
    import os
    os.chdir("c:\\Users\\ume\\Desktop\\Python演習\\機械学習のための「前処理」入門\\ants")
    os.chdir("c:\\Users\\ume\\Desktop\\Python演習\\機械学習のための「前処理」入門\\bees")
    
    # 画像フォルダの指定
    dirs = ['ants', 'bees']
    
    # 画像のピクセル値とラベルを格納するリストを生成
    pixels = [] # 説明変数
    labels = [] # 目的変数
    
    # 各フォルダのファイルを1つずつ読み込み、処理してリストへ格納
    for i, d in enumerate(dirs):
        # ファイルの取得
        os.chdir("c:\\Users\\ume\\Desktop\\Python演習\\機械学習のための「前処理」入門\\"+ d)
        files = os.listdir("c:\\Users\\ume\\Desktop\\Python演習\\機械学習のための「前処理」入門\\" + d)
    
        for f in files:
            # 画像をグレースケールで読み込み
            img = cv2.imread(f,cv2.IMREAD_GRAYSCALE)
    
            # 画像をリサイズ
            img = cv2.resize(img, (128, 128))
            # ピクセル値の格納
            img = np.array(img).flatten().tolist()
            pixels.append(img)
            
            # 画像のラベルをリストへ格納 
            labels.append(i)
            
    # %%
    import pandas as pd
    
    pixels_df=pd.DataFrame(pixels)
    pixels_df=pixels_df/255
    
    labels_df=pd.DataFrame(labels)
    labels_df=labels_df.rename(columns={0:"label"})
    
    img_set=pd.concat([pixels_df,labels_df],axis=1)
    img_set.head()
    
    #%%
    # 画像のピクセル値とラベルを格納するリストを生成
    pixels2 = [] # 説明変数
    labels2 = [] # 目的変数
    tmp = []
    
    # 各フォルダのファイルを1つずつ読み込み、処理してリストへ格納
    for i, d in enumerate(dirs):
        # ファイルの取得
          os.chdir("c:\\Users\\ume\\Desktop\\Python演習\\機械学習のための「前処理」入門\\"+ d)
          files = os.listdir("c:\\Users\\ume\\Desktop\\Python演習\\機械学習のための「前処理」入門\\" + d)
        
          for f in files:
            # 画像をグレースケールで読み込み
            img2 = cv2.imread(f,cv2.IMREAD_GRAYSCALE)
            # 画像をリサイズ
            img2 = cv2.resize(img2, (128, 128))
            # ピクセル配列をB、G、Rごとに分割
            b, g, r = cv2.split(img2)        
            # ピクセル値の格納
            b = np.array(b).flatten().tolist()
            g = np.array(g).flatten().tolist()
            r = np.array(r).flatten().tolist()
            tmp = b + g + r
            pixels2.append(tmp)
            
            # 画像のラベルをリストへ格納 
            labels2.append(i)
    
[/code]


CC BY-SA 4.0
2022-05-09T07:36:39.647
88723
2023-05-16T09:08:30.963
2022-05-09T08:17:43.633
3060
52536
question
python
ValueError: not enough values to unpack (expected 3, got 1) というエラー


表示されたエラーメッセージは略さずにそのまま提示しないと正しい助言・回答が得られないか、@Takahiro Funahashi
さんがコメントされたように内容確認のやり取りが発生して余計な時間がかかることになります。  
問題は再現するでしょうから、再度実行して表示されたエラーメッセージ内容を略さずにそのままテキストで追記してください。

* * *

そして提示されている分のエラーメッセージの内容では、@Takahiro Funahashi
さんがコメントされたように問題が発生しているのは`pixels2.append(tmp)`ではなく`b, g, r =
cv2.split(img2)`の行だと思われます。

おそらく原因はその上の画像読み込みのコメントおよび処理で示しているように、`img2`データがグレースケールとして読み込まれていることだと思われます。

[code]

    for f in files:
        # 画像をグレースケールで読み込み
        img2 = cv2.imread(f,cv2.IMREAD_GRAYSCALE)
    
[/code]

こんな記事があって、グレースケール画像を入力するとエラーになると書かれています。  
[RGB画像のチャンネル分割 cv2.split()](https://python-debut.blogspot.com/2019/12/rgb-
cv2split.html)

> ここで注意したいのは変数の順番をRGBではなくBGRにすることと、imgにはカラー画像を用いるということです。

>
> cv2.cvtColor()等でグレースケールにした画像をcv2.split()に入れると、画像のチャンネル数が1チャンネルしかないため、エラーになります。

上記にはどのようなエラーになるかの詳細は書かれていませんが、質問のエラーメッセージ内容を考えると、カラー画像なら戻り値は3つになるけれども、グレースケール画像は戻り値が1つだけになるのでしょう。

質問のプログラムのその後の処理もカラー画像データを前提としてプログラムされていると考えられるので、画像ファイル読み取りの際に`cv2.IMREAD_GRAYSCALE`を指定しないようにすれば良いと思われます。

[code]

    for f in files:
        # 画像をカラー(デフォルト)で読み込み
        img2 = cv2.imread(f)
    
[/code]

[OpenCVで画像ファイルの読み書きをしよう
(Python)](https://weblabo.oscasierra.net/python/opencv-image.html)

> cv2.imread() メソッドには、第二引数で読込み方をフラグで指定することができます。 具体的には次のようなフラグを指定できます。

> cv2.IMREAD_COLOR 画像をカラー(RGB)で読込む。 引数のデフォルト値。


CC BY-SA 4.0
2022-05-09T09:59:12.813
88729
2022-05-09T09:59:12.813
26370
88723
answer