こちらの画像処理100本ノックを行う際にエラーが出て困った。
というよりかはimread()の使い方の問題であったが。
コードとエラーは以下の通り。
コード
import cv2
img = cv2.imread("imori.jpg")
red = img[:, :, 2].copy()
エラー内容
TypeError: 'NoneType' object is not subscriptable
ディレクトリ構造
Gasyori100knock ← ワークスペース
│
├─Question_01_10
│ │
│ ├─imori.jpg ← 読み込みたい画像
│ ├─question1.py ← 実行ファイル
NoneTypeと出ている。img箇所がうまく読み込めていないらしい。
結論
パス指定が間違っていたため、画像がうまく読み込めなかった。
理由
gitからプロジェクトをクローンしてきて、クローンしたフォルダをそのままワークスペースに設定した。
どうやら実行時のディレクトリが基準のパスになるみたい。今回はPythonファイルを実行するのにワークスペースから実行していた。つまり、画像の読み込みはワークスペースから見た相対パスを指定するか、絶対パスで指定しなければならない。
ディレクトリ構造
Gasyori100knock ← ワークスペースであるここが基準
│
├─Question_01_10
│ │
│ ├─imori.jpg ← ワークスペースから見て./Question_01_10/imori.jpgと指定しなければいけない。
│ ├─question1.py ← 実行ファイルを基準に考えるわけではないみたい。
対策
常にワークスペースから実行するのであれば相対パスである./Question_01_10/imori.jpg
で良いけど、それはプログラム的にどうなのか?と思ったので少し書き換える。
コード(修正後)
import cv2
import os
img_path_name = "imori.jpg" # 対象画像の名前
bace = os.path.dirname(os.path.abspath(__file__)) # 実行ファイルのディレクトリ名
target_path = os.path.join(bace, img_path_name) # パスの連結
img = cv2.imread(target_path)
red = img[:, :, 2].copy()
os.path.abspath(__file__)で実行ファイル(.pyまで)の絶対パスを取得。os.path.dirname()でディレクトリ名に変換。