皆さまこんにちは、にどねゆうきです。

双子育児に追われつつ、なんとかブログ更新を続けております。
毎日があっという間すぎて、もう何が何やら状態ですが、皆さんはどうお過ごしでしょうか?


さて、今回は細かすぎるテーマです。
先日、スタジオアリスの新春お年玉キャンペーンで子供たちの写真を撮ってもらいました。
初アリスだったのですが、素晴らしい写真を撮って頂けただけでなく、子供たちにとっても、私たちにとっても、祖父母にとっても楽しい思い出になりました。年末の予約戦争が激戦ですが、毎年の家族の恒例行事に出来たらとてもすてきだな...と思っています。

そんな素晴らしいスタジオアリスのお写真。
撮影の特典として、データ購入とは別でSNS用画像を頂くことが出来るのですが、そちらの解像度が2025年としてはまあまあ低めになっています(770*1000)

もちろんSNS用の画像として頂いているわけで、用途の通りにSNSで見る分には十分なんですが、手元で印刷しようとすると、どうしてもモヤッとした感じになってしまいます。
写真を使ってカレンダーでも作ってみようかなと思ったりすると、そもそも解像度が1500*1500以上でないとダメですよ、などとアラートが出てしまったりしてなかなか厳しい。とはいえ今すぐデータ購入をするほどでもない(スタジオアリスは1年後に安価で購入が出来るため)。
写真のプリントはお願いしているので、それをスキャンしたりしてもよいのですが、そもそも1/10時点ではお正月に撮った写真がまだ手元にない。

データをもとにちょっとしたものを印刷ぐらいはしたい。
でも(すぐに)データ購入をしてすごく高画質なものが欲しいというほどでもない。
もちろん高画質化に追加でお金をかけたいほどでもない。
そして怪しい「AIで高画質化!」みたいなサービスは利用したくない。
そして高性能な写真加工ソフトを持っているわけでもない。


そんな中途半端な悩みを解決すべく、無料で使えるPythonでプログラミングをして画像を綺麗にしてみました。自分用のコードですが、何かのお役に立てばと思い共有させて頂きます。

実際にRecraftで生成した家族写真っぽいデータ(770*963,293KB)を高画質化=アップスケーリングしたもの(1500*1875,3.1MB)です。画質としてはほとんど変わらずに、画像サイズを大きくできているのが分かるかと思います。

<元の画像(770*963,293KB)※スタジオアリスっぽい画像>

sample770

<高画質化(1500*1875,3.1MB)※GoogleコラボのコピペPythonで高画質化>

upscaled_image (2)


 

注意点:

1.高画質化とはいえ、どちらかというと画質を荒くせずに解像度を高くする(画像を大きくする)という感じなので、すごくきれいになった!!みたいなことは別にないです。

2.そもそもすごくきれいになるわけでもないのでデータ購入とは全く違う話ですが、

スタジオアリスさんがご厚意でプレゼントしてくださっているSNSデータですので、節度を守って個人用にご使用下さい。使用目的に合わせてきちんと購入し、お代をお支払いするのが本来だと思います。

 


プログラミングと聞くと「これは自分とは関係ないな...」という方も多いかと思いますが、基本的にGoogleドライブにファイルを作ってコピペして実行するだけで終わりなのでよろしければぜひお試しください。

怪しいAI高画質化サイトにアクセスする必要もなく、しかも無料でできる方法になりますので、何かお役に立ちましたら幸いです。

まずはGoogle Colabで高画質化に挑戦!コピペでOKのPythonコード

「だいたい事情は分かるので、さっそくコードを」という方は、まずはこちらを試してみてください。
以下のコードは、Google Colab(Googleコラボ)という環境で、そのまま動かせます。
1行も書き換えなくても、実行するとアップロードのボタンが表示され、そこから画像ファイルを読み込んで、高画質化し、保存してくれます。


今回の方法の最大のメリットは、

  • 怪しいAI高画質化サイトにアクセスする必要がなく、自分のPythonコードを使うので、安全・安心であること
  • コピペするだけ
  • 無料で使えること
になるかと思います。デメリットとしてはそもそもPythonとか関わりたくない、という方は厳しいかと思います。

以下のコードは、Google Colabで使用することを想定しています。
Google Colabは、Googleドライブ上で動作するため、Googleアカウントをお持ちであれば、すぐに利用できます。
(※もし、Google Colabの使い方がわからない!という方は、 Googleドライブの始め方を参考に、 Googleアカウントを作成し、Googleドライブを開いてください)

Googleドライブを開いたら、左上の「新規」ボタンをクリックし、「その他」から「Googleコラボラトリー」を選択すると、Google Colabの新規ノートブックを作成できます。
(※もちろんGoogleコラボにアクセスして、そこから新規ノートブックを作っても大丈夫です)

Googleドライブ側から、Google Colab用のファイルが作れるので、ぜひ試してみてください。

Google Colab

開いたノートブックに、下記のコードをコピペして、コードの左側にある実行ボタン(ビデオの再生みたいな右向きの▲)を押せばOKです。


#@title 画像アップスケーリング (Super Resolution) - 最小1500x1500ピクセル

# 必要なライブラリのインストール
!pip install opencv-python numpy scikit-image pillow

import cv2
import numpy as np
import os
from google.colab.patches import cv2_imshow
from skimage.metrics import peak_signal_noise_ratio as psnr
from PIL import Image
import io

# アップロードされた画像の表示
from google.colab import files
uploaded = files.upload()
image_name = list(uploaded.keys())[0]

# アップロードされた画像の読み込み
image_pil = Image.open(io.BytesIO(uploaded[image_name]))
image_rgb = np.array(image_pil)
image_rgb_cv2 = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2BGR)
print("元の画像")
cv2_imshow(image_rgb_cv2)


# 画像のアップスケーリングを行う関数 (ここではバイキュービック補間を使用)
def upscale_image(image, scale_factor):
  """画像を指定した倍率でアップスケールする関数

  Args:
      image: アップスケールする画像(OpenCV形式)
      scale_factor: アップスケール倍率(例: 2 なら2倍)
  Returns:
      アップスケールされた画像(OpenCV形式)
  """
  height, width = image.shape[:2]
  new_height = int(height * scale_factor)
  new_width = int(width * scale_factor)
  upscaled_image = cv2.resize(image, (new_width, new_height), interpolation = cv2.INTER_CUBIC)
  return upscaled_image


# アップスケール倍率を計算する関数
def calculate_scale_factor(image, min_size=1500):
    """画像をアップスケールする倍率を計算する関数
    Args:
        image: アップスケールする画像(OpenCV形式)
        min_size: 最小の画像の辺の長さ(ピクセル)
    Returns:
        アップスケール倍率
    """
    height, width = image.shape[:2]
    scale_height = min_size / height if height < min_size else 1
    scale_width = min_size / width if width < min_size else 1
    scale_factor = max(scale_height, scale_width)  # 短い方の辺を基準に計算
    return scale_factor

# アップスケール倍率を計算
scale_factor = calculate_scale_factor(image_rgb_cv2)

# 画像のアップスケールを実行
upscaled_image = upscale_image(image_rgb_cv2, scale_factor)
print("\nアップスケール後の画像")
cv2_imshow(upscaled_image)


# 結果の画像をファイルに保存
cv2.imwrite("upscaled_image.png", upscaled_image)

# ファイルをダウンロード
files.download("upscaled_image.png")

print("完了。アップスケールされた画像がダウンロードされます。")
  

コードを実行すると、アップロード画面が表示されるので、高画質化=アップスケールしたい画像を選択してください。 処理が終わると、アップスケールされた画像が自動でダウンロードされます。

本当にそれだけなので、正直なところ以上でこの記事は終わりなのですが、「何も分からずに使うの怖い...」という方、この機会にちょっと勉強してみたいという方向けに、PythonやGoogleコラボなどについて説明させて頂ければと思います。

Python、Google Colab、ライブラリって何?

ここからは、少しだけ技術的な話になります。

  1. Pythonとは?

    Python(パイソンと読みます)は、プログラミング言語の一つです。
     「プログラミング言語」というのはコンピュータに何かをさせるための命令を書くための言葉のことです。 人間が日本語や英語を話すように、コンピュータはプログラミング言語を理解します。

    Pythonの特徴はコードが読みやすく、書きやすいことで、初心者でも比較的学びやすい言語として人気です。 ちなみに、PythonはWeb開発、AI開発、データ分析、機械学習など、いろんな分野で使われています。これには、Pythonはプログラマーでなくても(例えば機械学習をする数学者)比較的簡単に使えるので選ばれているという背景があります。

  2. Google Colabとは?

    Google Colab(Google Colaboratory)は、Googleが提供する無料のクラウド環境のことです。
    クラウドをものすごくざっくり言うと、インターネット上にあるコンピュータのことです。
    普段、自分のパソコンでプログラミングをするには、いろいろな準備が必要なのですが、Google Colabを使えば、ブラウザ上で手軽にプログラミングを始めることができます。(なのでコピペするだけで使える)

    しかも、Google Colabは、GPU(画像処理に特化したプロセッサ)を無料で使えることもあるので、画像処理のような重たい処理もサクサクできます。

  3. 今回使っているライブラリについて

    Pythonには、様々な機能が詰まった「ライブラリ」というものがたくさんあります。 今回は、その中でも画像処理に特化したライブラリをいくつか使っています。

    • OpenCV (cv2): 画像処理のライブラリとして、デファクトスタンダードです。 画像の読み込み、書き出し、リサイズなどの基本的な処理から、 フィルター処理、顔認識など、高度な処理まで幅広く対応しています。

    • NumPy: 数値計算を効率的に行うためのライブラリです。 Pythonのリスト(配列)を拡張したNumPyの配列(ndarray)を使うことで、 大量の数値計算を高速に行うことができます。 NumPyは、画像データを効率的に扱うためにも使用されています。

    • scikit-image: 画像処理のためのライブラリで、OpenCVよりも少し高度な処理が可能です。 画像処理アルゴリズム、画像解析、特徴抽出などの機能が豊富です。 今回は、画像の画質を評価するために使用しています。

    • Pillow: Pythonで画像ファイルを扱うためのライブラリです。 画像の読み込み、保存、サイズ変更、形式変換などの機能があります。

これらのライブラリを組み合わせることで、今回の画像アップスケール処理を実現しています。
 

そもそも画像の高画質化(アップスケール処理)とは?

さて、今回のメインテーマである「画像のアップスケール」について、もう少し詳しく説明します。 アップスケールとは、簡単に言うと、画像の解像度を上げて、画像を大きくすることです。 低解像度の画像を無理やり拡大すると、画像がぼやけてしまうことがありますよね。
これは、画像の情報が不足しているために起こります。

そこで今回は「バイキュービック補間」という手法を使っています。
これは、画像の周りのピクセルの情報から、足りないピクセルを推測して補間する手法です。 少し複雑な計算をしているのですが、今回はPythonのライブラリがやってくれるので、 細かいことは気にしなくても大丈夫です。

もちろん、この手法にも限界はあります。 元の画像の情報が少なすぎると、どうしても少しぼやけた感じになります。 それでも、何もせずに拡大するよりは、ずっと綺麗になるのではないかと思います。

ローカル環境で実行したい場合

「ローカルのPCで実行したい!」という方向けに、ローカルで実行する場合のコードと手順を解説します。 ローカル環境で実行する場合は、事前に以下の準備が必要です。

  1. Pythonのインストール: Python公式サイト からPythonをダウンロードし、インストールしてください。

  2. 必要なライブラリのインストール: ターミナルやコマンドプロンプトで、以下のコマンドを実行し、必要なライブラリをインストールしてください。

    pip install opencv-python numpy pillow scikit-image

(補足:Path環境変数について)
ローカル環境でPythonを実行する際に、 「`python`コマンドが見つからない」というエラーが出ることがあります。 これは、Path環境変数にPythonのインストール先が登録されていないことが原因です。

Path環境変数は、コマンドを実行するときに、どの場所(フォルダ)を探しに行くかを設定するものです。 Path環境変数にPythonのインストール先を追加することで、 ターミナルやコマンドプロンプトから `python` コマンドを実行できるようになります。

Path環境変数の設定方法は、OSによって異なりますので、以下のリンクを参考に設定してください。



準備ができたら、以下のコードを `main.py` という名前で保存してください。 そして、アップスケールしたい画像ファイルの名前を`input_image.png`に変更して、`main.py`と同じフォルダに保存してください。 あとは、ターミナルやコマンドプロンプトで `python main.py` を実行すればOKです。
実行すると、アップスケールされた画像が `upscaled_image.png` というファイル名で保存されます。


# ローカル実行用の画像アップスケーリング (Super Resolution) - 最小1500x1500ピクセル

# 必要なライブラリのインポート
import cv2
import numpy as np
import os
from skimage.metrics import peak_signal_noise_ratio as psnr
from PIL import Image

# ファイルパスを指定 (アップスケールしたい画像のパスをここに記述)
image_path = "input_image.png" # 例: "path/to/your/image.jpg"

# アップロードされた画像の読み込み
try:
    image_pil = Image.open(image_path)
except FileNotFoundError:
    print(f"エラー: 指定されたパスに画像ファイルが見つかりません: {image_path}")
    exit()

image_rgb = np.array(image_pil)
image_rgb_cv2 = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2BGR)

# 元の画像の表示(ローカル環境ではcv2.imshowを使う)
cv2.imshow("Original Image", image_rgb_cv2)
cv2.waitKey(0)
cv2.destroyAllWindows()



# 画像のアップスケーリングを行う関数 (ここではバイキュービック補間を使用)
def upscale_image(image, scale_factor):
  """画像を指定した倍率でアップスケールする関数

  Args:
      image: アップスケールする画像(OpenCV形式)
      scale_factor: アップスケール倍率(例: 2 なら2倍)
  Returns:
      アップスケールされた画像(OpenCV形式)
  """
  height, width = image.shape[:2]
  new_height = int(height * scale_factor)
  new_width = int(width * scale_factor)
  upscaled_image = cv2.resize(image, (new_width, new_height), interpolation = cv2.INTER_CUBIC)
  return upscaled_image


# アップスケール倍率を計算する関数
def calculate_scale_factor(image, min_size=1500):
    """画像をアップスケールする倍率を計算する関数
    Args:
        image: アップスケールする画像(OpenCV形式)
        min_size: 最小の画像の辺の長さ(ピクセル)
    Returns:
        アップスケール倍率
    """
    height, width = image.shape[:2]
    scale_height = min_size / height if height < min_size else 1
    scale_width = min_size / width if width < min_size else 1
    scale_factor = max(scale_height, scale_width)  # 短い方の辺を基準に計算
    return scale_factor

# アップスケール倍率を計算
scale_factor = calculate_scale_factor(image_rgb_cv2)

# 画像のアップスケールを実行
upscaled_image = upscale_image(image_rgb_cv2, scale_factor)


# アップスケール後の画像の表示(ローカル環境ではcv2.imshowを使う)
cv2.imshow("Upscaled Image", upscaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 結果の画像をファイルに保存
output_path = "upscaled_image.png" # 出力ファイルパスを指定
cv2.imwrite(output_path, upscaled_image)

print(f"完了。アップスケールされた画像が {output_path} に保存されました。")
  



スッキリわかるPython入門 第2版 スッキリわかるシリーズ
株式会社フレアリンク
インプレス
2023-11-06



まとめ

今回のブログ記事では、Pythonを使って、低解像度の画像を綺麗にする方法を紹介しました。
ローカルで実行するほうが色々と便利だったりもするのですが、Path環境変数などやはり少しハードルが高い部分はあるかと思いますので、まずはGoogle Colabでの実行がお手軽かと思います。

Googleコラボコピペであれば怪しいAI高画質化サイトにアクセスすることなく、無料で高画質化できますので、よろしければぜひお試しください。

プログラミングは、ちょっととっつきにくいイメージがあるかもしれませんが、 実は、意外と簡単に、いろんなことができるようになります。 私もまだまだ勉強中ではありますが、今回の記事をきっかけに、プログラミングに興味を持ってくれる人がいたら嬉しいです。