6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

メモ:OpenCVやPillowでの画像読み込み時の注意点

Posted at

はじめに

我が家の愛犬の写真を読み込んだ際に、縦長画像の縦横が変わってしまう場合があったので、その原因のメモ。

【before】OpenCVとKerasで画像の読み込み

from keras.preprocessing import image
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

# OpenCVで画像読み込み
img_cv2 = cv2.imread('img/terrier.jpg')

# Kerasで画像読み込み
img_keras = image.load_img('img/terria.jpg')
# PIL形式からnumpy配列に変換
img_keras = image.img_to_array(img_keras)

# matplotlibで可視化
fig = plt.figure()
fig.subplots_adjust(left=0, right=1, bottom=0, top=0.5, hspace=0.05, wspace=0.05)

for i in range(2):
    ax = fig.add_subplot(1, 2, i + 1)
    if i == 0:
        # OpenCVのためBGRからRGBに
        ax.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))
    elif i == 1:
        # img_to_arrayでfloatになっているためintに
        ax.imshow(img_keras / 255)
plt.show()

qiita_01.png

あれ??同じ画像なのに縦横が違う!!!

【after】OpenCVとKerasで画像の読み込み

from keras.preprocessing import image
import cv2
%matplotlib inline
import matplotlib.pyplot as plt

# OpenCVで画像読み込み
# ★変えたのはココ↓
img_cv2 = cv2.imread('img/terria.jpg', cv2.IMREAD_IGNORE_ORIENTATION | cv2.IMREAD_COLOR)

# Kerasで画像読み込み
img_keras = image.load_img('img/terria.jpg')
# PIL形式からnumpy配列に変換
img_keras = image.img_to_array(img_keras)

# matplotlibで可視化
fig = plt.figure()
fig.subplots_adjust(left=0, right=1, bottom=0, top=0.5, hspace=0.05, wspace=0.05)

for i in range(2):
    ax = fig.add_subplot(1, 2, i + 1)
    if i == 0:
        # OpenCVのためBGRからRGBに
        ax.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))
    elif i == 1:
        # img_to_arrayでfloatになっているためintに
        ax.imshow(img_keras / 255)
plt.show()

qiita_02.png

おお!同じになった^^

原因

この画像はiPhoneで撮影したもので、画像に埋め込まれているOrientation属性によるものでした

OpenCVの場合、当該情報を考慮するのがデフォルトのようで、
imreadにcv2.IMREAD_IGNORE_ORIENTATIONを指定することで、
この情報を無視することが出来るようです。

撮影時、iPhoneは縦だったけど、カメラとしては横であったということ、すなわちOrientation属性を考慮するか否かで、デフォルトの画像読み込みによって差が出る、ということです。これは、SNSへアップロードした際にも考慮するか否かにより、意図した向きと変わるということにも関係しています。そのあたりの詳細についてはここでは言及しません。
ちなみに、私が意図していたのは縦なので、撮影する際は注意ですね。

さいごに

撮影した画像からデータセットを作成して機械学習する際、回転を考慮すべき学習データの場合、Orientation属性を考慮するか否かが大事な場面がありそうです。
が、回転を考慮すべき文字認識などで、学習データとなる手書き文字をカメラで撮影して。。。なんてことはしないと思うので、そこまで気にする必要はないかも。

<参考>
stack overflow Image Orientation (python + openCV)
OpenCV Image file reading and writing

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?