質問: [255, 0, 0] cv2.imwrite("a.jpg", img) ``` ### 試したこと 上記のソースコードにおいて7行目で変更したい画素値を指定します。上の例であれば(145~150,145~150,145~150)の色となっております。インターネットで調査した結果、「Python 以上 以下」と調べて3.のソースコードの様に<=を使って表現すると書いていましたが、エラーメッセージが出て上手くいきませんでした。ダメもとで145~155、145~155、145-155の3通りを試しました。しかし2つ目の例では全角が含まれるのでエラーになり、その他の例でも上手くいきませんでした。 *追加情報 ⓵print(im.format, im.size, im.mode) を実行すると 「JPEG (256, 256) L」と出力されます。 ⓶print(img.shape) を実行するとエラーメッセージが次の様に出ます。 「'NoneType' object has no attribute 'shape'」 尚画像は存在する筈なのですが・・・ ### 補足情報(FW/ツールのバージョンなど) 言語:Python 環境:Windows10 ブラウザ:Google Chrome(Google Colaboratory) *ノートパソコンです。全て最新バージョンです。プログラミング中はcolab以外のタブ、アプリは開いていません。
回答: 処理の内容が合ってるかどうかわからないけど, とりあえずエラー出ないようにするには ... まず, NumPyでは(たいてい) N-d Array 単位で演算処理を行うので, `(145 <= img[..., 0] <= 150)` という記述(複数の比較の連結) は受け付けないようです。 質問の条件をそのまま置き換えた形 ``` cond_p = ((145 <= img[..., 0]) & (img[..., 0] <= 150) & (145 <= img[..., 1]) & (img[..., 1] <= 150) & (145 <= img[..., 2]) & (img[..., 2] <= 150)) ``` (追記) RGB (RGBAではなく) 3つの要素で, 実際に(質問のように)値の範囲がすべて同じなら, 次のようにも可能(なはず) ``` cond_p = np.all((145 <= img) & (img <= 150), axis=-1) ``` あと注意点として, 何の(何系の)画像処理か不明だけど, 厳密に値の範囲指定する場合, JPEG形式は向いていないかも? (不可逆圧縮であり, また, 読み込むライブラリーによっては値が異なることも) ### コメント受けての(質問での)エラーの件確認 以下を colabなどで実行すると何が出ますか? また, `img = cv2.imread(〜)` 後の, `img.shape` を表示した場合何が出ますか? ... 以上を, 質問に追記してみて下さい ``` from PIL import Image im = Image.open('sample.jpg') print(im.format, im.size, im.mode) ```