Chapter 03

用意したものがこちら[画像の準備]

eetann / えーたん
eetann / えーたん
2020.12.19に更新

この章の概要

モザイクアートに使う画像を用意するプログラムを書きます。

画像の取得について

モザイクアートでブロックとして置き換えに使用する画像(以下、ブロック画像)は、大量の画像が必要です。ブロック画像が少ないと同じ画像が何度も使用され、モザイクアートのクオリティが下がるためです。
モザイクアートの説明

ここでは、メトロポリタン美術館が公開している The Met Collection API で画像を取得します。
"The Met Collection API" は、約40万以上ものCC0の作品を自由にダウンロードすることができます。しかも登録不要です。

モザイクアート化画像の取得

Susan Walker Morse (The Muse)

↑の画像[1]は"The Met Collection API"で見つけたものです。
この画像をモザイクアート化します。
以下は、指定したURLの画像を取得し、matplotlibで表示するプログラムです。

import matplotlib.pyplot as plt
import numpy as np
import skimage.io
I = skimage.io.imread("https://images.metmuseum.org/CRDImages/ad/web-large/DT69.jpg")
plt.imshow(I)
plt.show()

最初に書くプログラムなので、実行後のスクリーンショットも載せておきます。
最初の実行画面

skimage.io.imreadは、指定したURLの画像を読み込むことができます。
読み込んだ画像は、3次元のnumpy配列です。1次元目(行)が画像の縦、2次元目(列)が画像の横、3次元目(奥行き)がRGBです。
RGB画像のイメージ

ブロック画像の取得

次は、実際にAPIを叩いて画像のURLの一覧を取得します。これらはブロック画像として利用します。
以下のプログラムで、"flowers"で検索してパブリックドメインである画像最大500個を取得します。

import requests
import json
import time
url = "https://collectionapi.metmuseum.org/public/collection/v1/"

def getObjectList(params):
    data = requests.get(url + "search", params=params).json()
    return data["objectIDs"]

def getPrimaryImage(objectID):
    data = requests.get(url + "objects/" + str(objectID)).json()
    if "primaryImageSmall" in data:
        return data["primaryImageSmall"]
    return None

def getImageURLs(objectList):
    images = []
    num = 0
    for objectID in objectList:
        image = getPrimaryImage(objectID)
        if image:
            images.append(image)
            num += 1
        if num >= 500:
            break
        time.sleep(1)
    return images

params = {
    "hasImages" : "true",
    "isPublicDomain" : "true",
    "q" : "flowers"
}
objList = getObjectList(params)
imageURLs = getImageURLs(objList)

本筋ではないためAPIに関わる部分の説明はしません。
そこそこ時間がかかります。

以下のプログラムimageURLsの一番最初の画像を見てみましょう。

plt.imshow(skimage.io.imread(imageURLs[0]))
plt.show()

画像が表示されていれば成功です。

脚注
  1. title : Susan Walker Morse (The Muse)
    artist : Samuel F. B. Morse
    APIで取得した情報 : https://collectionapi.metmuseum.org/public/collection/v1/objects/11605 ↩︎