はじめに
がちもとさんアドベントカレンダー15日目の記事です。
今日は、DALLE2を用いて横スクロールの画像を無限に生成していきます。
開発環境
- Windows 11 PC
- Python 3.11
導入
1.ライブラリのインストール
pip install pillow
pip install opencv-python
pip install requests
pip install openai
2.OpenAIのAPIキーを取得
3.正方形画像を用意
4.プログラムを作成
from PIL import Image
from io import BytesIO
import numpy as np
import cv2
import requests
from openai import OpenAI
client = OpenAI(api_key="<INSERT-YOUR-API-KEY>")
# 画像を読み込む
image = cv2.imread("hokusai.png", cv2.IMREAD_UNCHANGED)
height, width = image.shape[:2]
image = cv2.resize(image, (1024,1024))
height, width = image.shape[:2]
# アルファチャンネルを追加(もし存在しなければ)
if image.shape[2] == 3:
# RGBからRGBAに変換
image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)
result = image.copy()
for _ in range(10):
# 右半分のROIを切り取る
right_half_roi = image[:, width // 2:, :]
mask = np.zeros((1024, 1024, 4), dtype=np.uint8)
# 左半分にコピー
mask[:, :width // 2, :] = right_half_roi
_, mask_enc = cv2.imencode('.png', mask)
mask_bytes = mask_enc.tobytes()
# 画像生成APIを呼び出し
response = client.images.edit(
model="dall-e-2",
image=mask_bytes,
mask=mask_bytes,
prompt="続きを書いてください。",
n=1,
size="1024x1024"
)
image_url = response.data[0].url
# 生成された画像をダウンロード
response = requests.get(image_url)
if response.status_code == 200:
generated_image = np.array(Image.open(BytesIO(response.content)))
generated_image = cv2.cvtColor(generated_image, cv2.COLOR_RGBA2BGRA)
cv2.imshow("image", generated_image)
cv2.waitKey(100)
right_half_roi = generated_image[:, width // 2:, :]
result = np.concatenate((result, right_half_roi), axis=1)
image = generated_image.copy()
cv2.imwrite("result.png", result)
コード解説
1.必要なライブラリのインポート: プログラムは、PIL(Python Imaging Library)、NumPy、OpenCV、requestsなどのライブラリを使用します。
2.画像の読み込み: cv2.imreadを使用して、指定されたファイルから画像を読み込みます。また、画像のサイズを1024x1024にリサイズします。
3.アルファチャンネルの追加: もし画像がRGB形式であれば、アルファチャンネルを追加してRGBA形式に変換します。
4.画像生成ループ: 生成された画像を10回生成するためのループがあります。各ステップでは次のことが行われます:
a. 右半分のROI(Region of Interest)の切り取り: 画像の右半分をROIとして切り取ります。
b. マスクの作成: マスク画像を作成し、左半分にROIをコピーします。
c. DALL·E 2.0モデルのAPIを呼び出し: 生成された画像の続きをDALL·E 2.0モデルに依頼し、新しい画像を生成します。
d. 生成された画像の取得: 生成された画像をダウンロードして表示します。
e. 生成された画像の右半分を切り取り、結果画像に連結します。
f. ループを繰り返します。
5.結果の画像の保存: ループが終了したら、生成された結果の画像を "result.png" というファイルに保存します。
実行結果
お疲れさまでした。