日本語pathのファイルをopenCVが読んでくれないのでPILで読んでから渡した
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
おしまい
Author And Source
この問題について(日本語pathのファイルをopenCVが読んでくれないのでPILで読んでから渡した), 我々は、より多くの情報をここで見つけました https://qiita.com/studio_haneya/items/204b83df29110e1d909e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .