python環境の画像処理にopenCVを使っているんですが、cv2.imread()は日本語パスのファイルを開いてくれません。そこでPILで読んできてopenCVで扱えるように並べ替えることにしました。
実行環境
python 3.6.4
opencv-python == 4.0.0.21
Pillow == 5.0.0
openCVで読んだ場合
まずopenCVで読んだらどうなるか確認しておきます。
import cv2
import matplotlib.pyplot as plt
img_cv = cv2.imread('./tomato.jpg')
plt.imshow(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB))
plt.show()
cv2.imread()で読むとnumpy.ndarrayになっているので、そのままで値が見えます。
img_cv[0][:5]
array([[53, 67, 19],
[53, 69, 16],
[47, 64, 7],
[48, 66, 5],
[53, 74, 11]], dtype=uint8)
これが再現できればOKです。
PILで読み込み
PILで同じファイルを開いてみます。
from PIL import Image
img = Image.open('./tomato.jpg')
img
これをnumpy.arrayに変換します。
img_arr = np.array(img)
img_arr
array([[19, 67, 53],
[16, 69, 53],
[ 7, 64, 47],
[ 5, 66, 48],
[11, 74, 53]], dtype=uint8)
numpy.arrayにはできましたが、先ほどcv2.imreadで読んだものとは順番が違います。PIL.Image.open()はRGB、cv2.imread()はBGRの順で読んできますので、並べ替えてやる必要があります。
img_arr2 = img_arr[:,:,::-1]
img_arr2[0][:5]
array([[53, 67, 19],
[53, 69, 16],
[47, 64, 7],
[48, 66, 5],
[53, 74, 11]], dtype=uint8)
同じになりました。
まとめ
openCVで読む場合
import cv2
img = cv2.imread('./tomato.jpg')
img
PILで読んで並べ替える場合
from PIL import Image
img = Image.open('./tomato.jpg')
img_arr = np.array(img)
img_arr = img_arr[:,:,::-1]
img_arr
おしまい