Pythonで画像処理:PILの基本操作

画像処理

Pillow

今回はPillowというライブラリを使用しythonで画像処理をする方法を紹介します。PillowはPythonで画像処理をするライブラリの中でも扱いやすいライブラリです。インストールされていない場合は先にインストールしておきましょう。

画像の情報を取得する

今回はこちらの画像を使用していきます。

まず、画像を読み込みます。

##画像の読み込み
from PIL import Image
origin_image  = Image.open("sweets.jpg")
print(type(origin_image))
コードを実行した結果


Pillowを読み込むときはPILとして読み込みます。
まず、画像を読み込み型を表示してみると、<class ‘PIL.JpegImagePlugin.JpegImageFile’>になっています。

次に、読み込んだ画像のプロパティを表示してみましょう。

##読み込んだ画像の情報表示
print("幅:{}".format(origin_image.width))
print("高さ:{}".format(origin_image.height))
print("幅、高さ:{}".format(origin_image.size))
print("ファイル名:{}".format(origin_image.filename))
print("カラーモード:{}".format(origin_image.mode))
print("画像のフォーマット:{}".format(origin_image.format))
コードを実行した結果

プロパティはこのように取得することができます。
widthが幅、heightで高さ、sizeで(幅,高さ)のタプル、filenameでファイル名、modeでカラーモード、fotmatで画像のフォーマットが取得できます。簡単にさまざまな情報が取得できますね。

さらに、ピクセル単位で色情報を取得することができます。

##ピクセル単位で色を取得
print(origin_image.getpixel((0, 0)))
print(type(origin_image.getpixel((0, 0))))
コードを実行した結果

(44, 43, 51)という形が返ってきました。これは(0,0)ピクセル(一番左上)のRBG値が(44, 43, 51)であることを表しています。上記のプロパティで表示したとおりこの画像はRGB(赤緑青)の数値を0〜255の数値で表す方法が使われています。つまり真っ暗なようでいて赤が44、緑が43、青が51の数値になっているのです。

画像ソフトでも確認してみましたが確かに同じ数値ですね。

次に画像を表示してみましょう。

##画像を表示

#画像ソフトで開く
origin_image.show()
#noteに表示
display(origin_image)
コードを実行した結果

show()を使用するとデフォルトの画像ソフトで画像が開きます。
ちなみに、displayを使用するとGoogleColabやJupyterLabでは画像を表示することができます。

次に新しい名前で保存します。

##画像の保存
origin_image.save("new_sweets.jpg")
origin_image.save("new_sweets.png")

フォルダを開くと画像が保存されています。Pillowは画像ファイルの拡張子で保存してくれるので読み込んだ画像がjpgでも、拡張子をpngにするとそのままpngで保存できます。

画像をリサイズしてみよう

まずは画像のリサイズを試してみましょう

##画像のリサイズ
resize_image = origin_image.resize((300, 300))
print("リサイズ後の幅、高さ:{}".format(resize_image.size))
display(resize_image)
コードを実行した結果

リサイズにはresizeを使用します。引数は変換後の幅と高さを指定しています。しかし、900×675だった画像をそのまま300×300にリサイズしたので縦横比がおかしなことになっています。
次に縦横比を保ったままリサイズする方法をご紹介します。

##画像のリサイズ
resize_image = origin_image.resize((origin_image.width//2, origin_image.height//2))
print("リサイズ後の幅、高さ:{}".format(resize_image.size))
display(resize_image)
コードを実行した結果

このコードでは、オリジナル画像の幅と縦を1/2にし、半分のサイズになるようにリサイズしています。

##画像のリサイズ
width  = 600

#高さの計算
height = width * origin_image.height // origin_image.width
#リサイズした画像を取得
resizeimage = origin_image.resize((width, height))
print("リサイズ後の幅、高さ:{}".format(resize_image.size))
display(resize_image)

#リサイズ後の画像を保存
resize_image.save("resiza_sweets.jpg")
コードを実行した結果

こちらのコードでは、幅を600pxに指定し、比率を求めて高さを計算しています。(高さを求める計算に「//」を使用しているのはresizeの引数が整数型でなければならないためです)これで縦横比を保ったまま任意の幅にリサイズすることができました。

画像をトリミングしてみよう

トリミングにはcropを使用します。使用する際に始点と終点を指定します。
Pillowでは左端の一番上が0,0となっておりx軸は右に行くほど数値が高く、y軸は下に行くほど高くなっています。cropでは(始点のx座標、始点のy座標、終点のx座標、終点のy座標)の順で指定します。

##画像の切り抜き
crop_image = origin_image.crop((0,0,300,300))
print("切り抜き後の幅、高さ:{}".format(crop_image.size))
display(crop_image)
コードを実行した結果

こちらのコードでは左上0地点からからx=300、y=300の地点までをトリミングしています。

##画像の切り抜き
crop_image = origin_image.crop((100,100,300,300))
print("切り抜き後の幅、高さ:{}".format(crop_image.size))
display(crop_image)
コードを実行した結果

こちらでは始点をx=100、y=100終点は先ほどと同じくx=300、y=300を指定しました。終点は同じですが画像の端が切り取られているのがわかります。画像サイズも先ほどより100px小さい200pxとなっています。

##画像サイズを半分にし中心付近だけ切り取る

x_start = origin_image.width // 4
x_end = x_start*3
y_start = origin_image.height // 4
y_end = y_start*3
crop_image = origin_image.crop((x_start,y_start,x_end,y_end))
print("切り抜き後の幅、高さ:{}".format(crop_image.size))
display(crop_image)
コードを実行した結果

画像の中心部分だけを切り抜くには中心付近の始点と終点を求めて引数として渡します。
オリジナルの画像と比べて画像サイズが半分になり、中心部分だけトリミングされていますね。

今回は画像処理ライブラリPillowの紹介をしましました。Pillowは別の記事でもすでに取り上げてあります。画像処理だけではなく、他のライブラリと連携することでいろんな用途に使えますね。

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