Googleフォトの高画質バックアップって画質落ちてるの?

タイトルの通りです。わたし、気になります!

スポンサーリンク

Google さんの回答

Google フォト ヘルプによると…

無料、容量無制限
・容量を節約するために、写真が圧縮されます。写真のサイズが 16 MP を上回る場合は、16 MP まで縮小されます。

Google フォト ヘルプ – https://support.google.com/photos/answer/6220791

ということですから、約 1,600 万画素までなら圧縮されないのかと誤解を招きそうですが、そうではないんですよね。どのサイズでも圧縮されますが、16MP を上回る場合は圧縮だけでなくサイズも縮小されるということらしいです。

Python で違いを見てみる

Anaconda3 上の Jupyter Notebook で OpenCV 使って画像の差をとったらなんかわかりそうです。

パッケージの準備

matplotlib, numpy, OpenCV は予め入れてあります。OpenCV は結構入れるのがめんどくさかったと記憶しているのですが、いつの間にか非公式のパッケージができていたので簡単に入りました。

$ pip install matplotlib
$ pip install numpy
$ pip install opencv-python

Jupyter Notebook の起動

Jupyter も予め入れてあります。

$ pip install jupyter
# 設定が必要かもしれないけど割愛
$ jupyter notebook

立ち上がったらパッケージを読んでおきます。

import matplotlib.pyplot as plt
import numpy as np
import cv2

Anaconda の仮想環境で Jupyter Notebook を動かしても、仮想環境にインストールされているパッケージを読んでくれなかったので、パッケージのパスを追加して実行しました。

[Python] No module named エラーの解決
Python 環境で pip install したモジュールを import しようとしたら ModuleNotFoundError: No module named 'xxx' と怒られてしまうときに役立ちそうなことを書き残しておこうと...

画像を読み込んで差を出力

def read_img(name):
    img = cv2.imread(name)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    return img

original_img = read_img('original.jpg')
google_photos = read_img('google-photos.jpg')

plt.imshow('original_img')
plt.imshow('google_photos')
二つの画像をGIFにして差を見てみた

上のソースコードでは二つの画像が別々に表示されるだけですが、違いがわかりにくいので GIF にしてみるとこんな感じになります。よく見ると、いくらの辺りが Google フォトの画像は少し白くなっているのがわかると思います。

次に、この二つの画像の差分をとってみます。

diff_img = original_img - google_photos
plt.imshow(diff_img)
二つの画像の差分の画像

RGB それぞれの値の差を画像にしているので、差が小さい部分は黒に近く、差が大きい部分は白に近くなります。

画像を比較してみたときに特に変化が大きかったいくらの辺りは全体的に青くなっているのがわかります。圧縮したときに色が淡くなったようです。

最後に

見た目でそんなに変わらないのであまり差がないものかと思いましたが、画像にしてみると画像全体に変更が及んでいるようです。この画像ではデータのサイズが 1/3 くらいになっていました。

専門ではないので詳しく知りませんが、近い色どうしが隣接している方がデータサイズは小さくなるっぽいので、圧縮するときにそのような処理をかけているんでしょうか。

Comments

タイトルとURLをコピーしました