ラベル ImageOps の投稿を表示しています。 すべての投稿を表示
ラベル ImageOps の投稿を表示しています。 すべての投稿を表示

2021年12月11日土曜日

【Pillow】ImageOps.expandによる画像枠追加

画像処理ライブラリPillowのPIL.ImageOpsモジュールのImageOps.expandにより画像に枠を追加できる。
Pillow(PIL)を使うためにはインポートが必要。PIL.ImageOpsモジュールは通常以下の形式でインポートされる。

from PIL import ImageOps

例に用いる画像'city.jpg'は以下を使用(フリー写真素材ぱくたそより)。画像サイズは幅600高さ400ピクセル。






1. 書式

expand の書式は以下の通り。

PIL.ImageOps.expand(image, border=0, fill=0)
引数 意味
image 元画像
border 付け加える枠の幅をピクセルで指定。
fill 枠の色の指定。1つの値(グレースケール)または(R, G, B)のタプルで指定。デフォルトは0(黒)


2. expandの例

border=20として上下左右に20ピクセルの枠をつける例。画像サイズは枠が追加された分、(600,400)から(640,440)と増える。fillは指定していないのでデフォルトの黒となる。

from PIL import Image, ImageOps

im = Image.open('city.jpg')  
im_fit = ImageOps.expand(im, border=20)
im_fit.save('city_expand.jpg')

実行結果





fill=(0, 255, 255)として枠の色を黄色にする場合。

from PIL import Image, ImageOps

im = Image.open('city.jpg')  
im_fit = ImageOps.expand(im, border=20, fill=(0, 255, 255))
im_fit.save('city_expand.jpg')

実行結果





3. リファレンス

Pillow (PIL Fork) > ImageOps Module > PIL.ImageOps.expand(image, border=0, fill=0)

使用バージョン:Python 3.8.8 / Pillow 8.2.0

【Pillow】ImageOps.fitによる指定サイズでの画像切り出し

画像処理ライブラリPillowのPIL.ImageOpsモジュールのImageOps.fitにより指定したサイズでの画像切り出しができる。
Pillow(PIL)を使うためにはインポートが必要。PIL.ImageOpsモジュールは通常以下の形式でインポートされる。

from PIL import ImageOps

例に用いる画像'ushi.jpg'は以下を使用(フリー写真素材ぱくたそより)。画像サイズは幅600高さ400ピクセル。






1. 書式

fit の書式は以下の通り。

PIL.ImageOps.fit(image, size, method=3, bleed=0.0, centering=(0.5, 0.5))
引数 意味
image 元画像
size 処理後の画像サイズを(width, height)のピクセル数で指定。処理後のアスペクト比が元画像より横長の場合には、元画像の縦方向がクロップされた画像となる。処理後のアスペクト比が元画像より縦長の場合には、元画像の横方向がクロップされた画像となる。
method オプション。拡大縮小時の画像補完方式。デフォルトの3はPIL.Image.BICUBICが指定される。
bleed オプション。画像の四方をカットする割合。デフォルトは0(カットなし)。1%カットする場合は0.01、10%カットする場合は0.1と指定。
centering オプション。切り出す際の中心位置の指定。デフォルトの(0.5, 0.5)で画像の中心が指定される。


2. sizeの指定

引数sizeには処理後の画像サイズを(width, height)のピクセル数のタプルで指定する。

600x400の元画像に対してsize=(200, 100)としてfitする例。元画像に対して変更後の画像が横長となるため、元画像の上下が切り取られた上で指定サイズに縮小される。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100))
im_fit.save('ushi_fit.jpg')

実行結果





600x400の元画像に対してsize=(100, 200)としてfitする例。元画像に対して変更後の画像が縦長となるため、元画像の左右が切り取られた上で指定サイズに縮小される。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (100, 200))
im_fit.save('ushi_fit.jpg')

実行結果





3. bleedの指定

bleedで指定した割合だけ画像の四方がカットされる。1%カットする場合0.01、10%カットする場合0.1と指定する。

bleed=0の場合(指定しない場合と同じ)。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (100, 200), bleed=0)
im_fit.save('ushi_fit.jpg')

実行結果





bleed=0.1の場合。上下左右10%カットされた上でsizeで指定した100x200ピクセルに切り出される。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (100, 200), bleed=0)
im_fit.save('ushi_fit.jpg')

実行結果





4. centeringの指定

centeringにより切り出し位置が指定できる。デフォルトは(0.5, 0.5)で元画像の中心となる。元画像に対して変更後の画像が縦長となる場合は、元画像の左右に余地があるため幅方向の指定が有効、元画像に対して変更後の画像が横長となる場合は、元画像の上下に余地があるため高さ方向の指定が有効となる。

centering指定なし。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100))
im_fit.save('ushi_fit.jpg')

実行結果





centering=(0, 0)と指定した場合。幅0高さ0で画像の左上角が指定されるが、縦長に切り抜いており高さ方向は余地がないため幅方向のみ左端の指定が有効となる。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100), centering=(0, 0))
im_fit.save('ushi_fit.jpg')

実行結果





centering=(1, 0)と指定した場合。幅1高さ0で画像の右上角が指定されるが、縦長に切り抜いており高さ方向は余地がないため幅方向のみ右端の指定が有効となる。

from PIL import Image, ImageOps

im = Image.open('ushi.jpg')  
im_fit = ImageOps.fit(im, (200, 100), centering=(1, 0))
im_fit.save('ushi_fit.jpg')

実行結果





5. リファレンス

Pillow (PIL Fork) > ImageOps Module > PIL.ImageOps.fit(image, size, method=3, bleed=0.0, centering=(0.5, 0.5))

使用バージョン:Python 3.8.8 / Pillow 8.2.0

2021年11月13日土曜日

【Pillow】ImageOpsモジュールによる画像のネガポジ反転・ポスタリゼーション・ソラリゼーション

 画像処理ライブラリPillowのPIL.ImageOpsモジュールには様々な画像処理機能が用意されている。その中からImageOps.invertによる画像のネガポジ反転、ImageOps.solarizeによるソラリゼーション処理、ImageOps.posterizeによるポスタリゼーション(減色)処理について説明する。
Pillow(PIL)を使うためにはインポートが必要。PIL.ImageOpsモジュールは通常以下の形式でインポートされる。

from PIL import ImageOps

例に用いる画像'sunflower.jpg'は以下を使用(フリー写真素材ぱくたそより)






1. ネガポジ反転(ImageOps.invert)

ImageOps.invertによりネガポジ反転される。各チャンネルの画素値(0~255)を255から引くことでネガポジ反転する。書式は以下の通り。引数は処理する画像を指定するのみ 。

PIL.ImageOps.invert(image)

ImageOps.invertによるネガポジ反転の例

from PIL import Image, ImageOps

# 元画像の読み出し
im = Image.open('sunflower.jpg')  

# invert処理
im_invert = ImageOps.invert(im)

# ファイルの保存
im_invert.save('sunflower_i.jpg', quality=95)

実行結果





2. ソラリゼーション(ImageOps.solarize)

ImageOps.solarizeにより画像がソラリゼーションされる。ソラリゼーションは設定した輝度以上で画素値をネガポジ反転する処理。1つの画像の中にネガ像とポジ像が混在するような効果を与える。
書式は以下。threshold未満の画素はそのまま、threshold以上の画素はネガポジ反転される。thresholdのデフォルト値は128で省略すると128が適用される。

PIL.ImageOps.solarize(image, threshold=128)

ImageOps.solarizeの例。thresholdは128

from PIL import Image, ImageOps

# 元画像の読み出し
im = Image.open('sunflower.jpg')  

# solarize処理
im_solarize = ImageOps.solarize(im, threshold=128)

# ファイルの保存
im_solarize.save('sunflower_s.jpg', quality=95)

実行結果





3. ポスタリゼーション(ImageOps.posterize)

ImageOps.posterizeによりポスタリゼーション(減色処理)される。書式は以下の通り。imageは処理される画像、bitsは各チャンネルの減色後のビット数で1-8の範囲で指定する。元画像がRGBカラーの場合は各チャンネル8ビット(256値)、グレースケールでは1チャンネル8ビット(256値)に対して減色後のビット数に4を指定すると各チャンネル16値、2を指定すると各チャンネル4値に減色される。

PIL.ImageOps.posterize(image, bits)

RGBカラー画像に対してbitsを2とし各チャンネル4値に減色する場合。元画像の256*256*256=16777216色から4*4*4=64色に減色される。

from PIL import Image, ImageOps

# 元画像の読み出し
im = Image.open('sunflower.jpg')  

# posterize処理
im_posterize = ImageOps.posterize(im, 2)

# ファイルの保存
im_posterize.save('sunflower_p.jpg', quality=95)

実行結果





4. リファレンス

Pillow (PIL Fork) > ImageOps Module > PIL.ImageOps.invert(image)
Pillow (PIL Fork) > ImageOps Module > PIL.ImageOps.solarize(image, threshold=128)
Pillow (PIL Fork) > ImageOps Module > PIL.ImageOps.posterize(image, bits)

使用バージョン:Python 3.8.8 / Pillow 8.2.0