パスに中国語が含まれる画像は cv2.imread で直接読み込むとエラーが報告されるのですが、前回、偉い人が cv2.imdecode を使えば普通に読み込めるという話を見たので、ちょっと気になったので今日は2 つの使用法と違いを記録します。
目次
1. 2つの画像読み取り方法の比較
- cv2.imread は通常どおり画像を読み取ります
import cv2
path = '/data/北京/beijing.png'
img = cv2.imread(path)
上記のコードを実行するとエラーが報告されます。
- cv2.imdecode はメモリから画像を読み取ります
import cv2
path = '/data/北京/beijing.png'
arr = np.fromfile(path, dtype=np.uint8)
img = cv2.imdecode(arr, flags=cv2.IMREAD_COLOR)
上記のコードを実行すると、成功しました。
また、imdecode で得られる画像バンドの順序が BGR ではなく RGB である点が opencv との違いです。
機能の説明:
np.decode は メモリ内のバッファから画像を読み取ります
np.fromfile は、 テキストまたはバイナリ ファイル内のデータを配列に構築します。
2. 2つの画像保存方法の比較
- cv2.imwrite は通常どおり画像を読み取ります
import cv2
out_path = '/data/北京/beijing.png'
cv2.imwrite(out_path,img)
上記のコードを実行するとエラーが報告されます。
- cv2.imdecode はメモリから画像を読み取ります
import cv2
out_path = '/data/北京/beijing.png'
arr = cv2.imencode('png',img)
out[1].tofile(out_path)
上記のコードを実行すると、成功しました。
機能の説明:
cv2.encode は 画像をメモリ バッファにエンコードします。
np.tofile は、 配列内のデータをバイナリ形式でファイルに書き込みます