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

2022年4月24日日曜日

【Pillow】Image.effect_spreadによる画像のぼかし

 画像処理ライブラリPillowのImage.effect_spreadは画像の各画素の座標を指定した距離に応じてランダムな座標に置換する。処理された画像が曇りガラスを通したように見える効果がある。

 Pillow(PIL)を使うためにはインポートが必要。PIL.Imageモジュールは通常以下の形式でインポートされる。

from PIL import Image

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




1. Image.effect_spread

 Image.effect_spreadの書式は以下。引数は画素の移動距離をピクセル数で指定するdistanceのみで、大きいほど画像がぼける。

Image.effect_spread(distance)

 distance5, 10, 50で処理する例。

from PIL import Image

im = Image.open('esports.jpg')  

im_spread = im.effect_spread(5)      
im_spread.save('effect_spread5.jpg')

im_spread = im.effect_spread(10)      
im_spread.save('effect_spread10.jpg')

im_spread = im.effect_spread(50)      
im_spread.save('effect_spread50.jpg')

'effect_spread5.jpg'


'effect_spread10.jpg'


'effect_spread50.jpg'


2. リファレンス

Pillow (PIL Fork) > The Image Class > Image.effect_spread(distance)

使用バージョン:Python 3.8.12 / Pillow 9.0.0

2022年4月23日土曜日

【Pillow】RGB色空間とHSV色空間の変換(convert)

 画像処理ライブラリPillowのImage.convertにより画像の色空間が変更できる。RGB色空間からHSV色空間、またその逆の変換について説明する。

 Pillow(PIL)を使うためにはインポートが必要。PIL.Imageモジュールは通常以下の形式でインポートされる。

from PIL import Image

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




1. RGB→HSV、HSV→RGB変換

 RGB色空間はR(赤)、G(緑)、B(青)の3チャンネルからなり各チャンネルは256値をとる。一方HSV色空間はH(Hue:色相)、S(Satulation:彩度)、V(Value:明度)の3チャンネルからなり各チャンネルは256値をとる。

 色空間の変換にはImage.convertメソッドを用い、引数に変換後のモード(色空間)を指定する。


 HSV色空間への変換

Image.convert('HSV')

 RGB色空間への変換

Image.convert('RGB')


2. HSV色空間のチャンネル操作

 RGB色空間では、画像の色合いを変えずに彩度や明度を調整するのは難しいため、HSV色空間に変換しHを変えずにSやVを調整することで画像の鮮やかさや明るさの調整ができる。

 調整法のひとつとしてガンマカーブによる調整がある。ガンマカーブは規格化された入力xと出力yが以下式の関係となるもの。



 彩度Sに適用する場合のガンマカーブは以下式となる。



 γ=0.5、γ=1、γ=2の場合のカーブ形状。γ<1では変換後に値が上がり、γ>1では変換後に値が下がる補正がされる。なおかつ画素値0は変換後も0、画素値255は変換後も255となるため、返還後も画素値の範囲は0~255で維持され飽和が生じない。




 画像をHSV変換し、S(彩度)にγ=0.5の変換をかける例。画像が鮮やかになる。HSV色空間では出力ができないため調整後に再びRGB色空間に変換している。

from PIL import Image

im = Image.open('pond.jpg')  
width, height = im.size
im_hsv = im.convert('HSV')

gamma = 0.5

for y in range(height):
    for x in range(width):
        h, s, v = im_hsv.getpixel((x, y))
        im_hsv.putpixel((x, y), (h, 
                                 int((s/255)**(gamma)*255),
                                 v))
        
im_rgb = im_hsv.convert('RGB')
        
im_rgb.save('pond_s05.jpg')

実行結果




 画像をHSV変換し、V(明度)にγ=0.5の変換をかける例。画像が明るくなり暗い部分が良く見えるようになる。

from PIL import Image

im = Image.open('pond.jpg')  
width, height = im.size
im_hsv = im.convert('HSV')

gamma = 0.5

for y in range(height):
    for x in range(width):
        h, s, v = im_hsv.getpixel((x, y))
        im_hsv.putpixel((x, y), (h, 
                                 s,
                                 int((v/255)**(gamma)*255)))
        
im_rgb = im_hsv.convert('RGB')
        
im_rgb.save('pond_v05.jpg')

実行結果




3. リファレンス

Pillow (PIL Fork) > The Image Class > Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)
Pillow (PIL Fork) > Concepts > modes

使用バージョン:Python 3.8.12 / Pillow 9.0.0

2022年4月22日金曜日

【Pillow】linear_gradient, radial_gradientによるグラデーション画像生成

 画像処理ライブラリPillowのImage.linear_gradientにより上から下に向けて黒から白に変化するグラデーション画像が生成される。また、Image.radial_gradientにより中心から外に向けて同心円状に黒から白に変化するグラデーション画像が生成される。

 Pillow(PIL)を使うためにはインポートが必要。PIL.Imageモジュールは通常以下の形式でインポートされる。

from PIL import Image



1. Image.linear_gradient

 Image.linear_gradientの書式は以下。引数はmodeのみで、'L'(8ビット1チャンネル)を指定する。

PIL.Image.linear_gradient(mode)

 生成される画像のサイズは256x256。y=0が黒(画素値0)、y=255が白(画素値255)になる。

from PIL import Image

im = Image.linear_gradient('L')

im.save('linear_gradient.jpg')



 生成されたグラデーション画像を、'RGB', 'RGBA', 'HSV'等の多チャンネルモードの1チャンネルとして使うことで様々なグラデーション画像を作成できる。またImage.compositeのマスク画像として用いることで、2つの画像をグラデーションを付けて合成できる。

 'HSV'モードのH値(色相)にグラデーション画像を反時計回りに90°回した画像(左が黒、右が白)を割り当て、S値(彩度)にグラデーション画像を180°回した画像(下が黒、上が白)を割り当て色相と彩度のマップを作成する例。'HSV'モードのままでは出力できないので'RGB'モードに変換してファイルに保存する。

from PIL import Image

grad = Image.linear_gradient('L')
v = Image.new('L', (256, 256), 255)

im = Image.merge('HSV', [grad.transpose(Image.ROTATE_90), 
                         grad.transpose(Image.ROTATE_180), 
                         v])
rgb = im.convert('RGB')

rgb.save('hsmap.jpg')




2. Image.radial_gradient

 Image.radial_gradientの書式は以下。Image.linear_gradient同様に引数はmodeのみで、'L'(8ビット1チャンネル)を指定する。

PIL.Image.radial_gradient(mode)

 生成される画像のサイズは256x256。中央が黒(画素値0)、四隅が白(画素値255)の同心円状のグラデーション画像になる。

from PIL import Image

im = Image.radial_gradient('L')

im.save('radial_gradient.jpg')



 グラデーション画像をマスクにして2つの画像をImage.compositeで合成する例。マスクが白い箇所では1つ目の画像、マスクが黒い個所では2つ目の画像が描画され、マスクが中間の画素値の場合はそれに応じて2つの画像がブレンドされる。

 使用する画像 'redsty.jpg', 'kuchikomi.jpg'(幅256ピクセルx高さ256ピクセル)は以下(フリー写真素材ぱくたそより)

'redsty.jpg'





'kuchikomi.jpg'





from PIL import Image

image1 = Image.open('redsty.jpg')
image2 = Image.open('kuchikomi.jpg')
mask = Image.radial_gradient('L')

out = Image.composite(image1, image2, mask)
out.save('composite.jpg')




3. リファレンス

Pillow (PIL Fork) > Image Module > PIL.Image.linear_gradient(mode)
Pillow (PIL Fork) > Image Module > PIL.Image.radial_gradient(mode)

使用バージョン:Python 3.8.12 / Pillow 9.0.0

2022年4月17日日曜日

【Pillow】Image.histogramによる画像ヒストグラムの作成

 画像処理ライブラリPillowのImage.histogramを使うと、画像の輝度vs画素数からなるヒストグラムを作成できる。

 Pillow(PIL)を使うためにはインポートが必要。PIL.Imageモジュールは通常以下の形式でインポートされる。

from PIL import Image

 またヒストグラムを求める画像 'tulip.jpg'(幅400ピクセルx高さ267ピクセル)は以下(フリー写真素材ぱくたそより)


'tulip.jpg'





1. グレースケール画像からのヒストグラム作成

 グレースケール画像に対してImage.histogramを適用すると、0~255の画素値それぞれのピクセル数が得られる。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')
gray = im.convert('L')

hist = gray.histogram()

plt.plot(hist)
plt.show()



2. カラー画像からのヒストグラム作成

 RGB3チャンネルからなるカラー画像に対してImage.histogramを適用した場合、Rチャンネル(256値)、Gチャンネル(256値)、Bチャンネル(256値)が連続して出力されてしまう。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')

hist = im.histogram()

plt.plot(hist)
plt.show()



 RGB3チャンネルが連続して出力されたヒストグラムをインデックス0~255、256~511、512~766の3つの範囲に分離し、RGB各チャンネル別に表示するとわかりやすい。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')

hist = im.histogram()

plt.plot(hist[0:256], c='red', label='R')
plt.plot(hist[256:512], c='green', label='G')
plt.plot(hist[512:767], c='blue', label='B')

plt.legend()
plt.show()



3. マスクによる特定範囲のヒストグラム作成

 ヒストグラムを作成する画像と同じサイズのマスク画像を用意すると、マスク画像の画素値が0以外の座標のみからヒストグラムが作成される。
 下の 'mask.jpg' をマスク画像に用いる場合。サイズは'tulip.jpg'と同じ幅400ピクセルx高さ267ピクセル、画像モードは'1'の二値画像で黒い箇所は画素値0、白い箇所は画素値1。

'mask.jpg'



 マスク画像の黒い部分(画素値0)は採用されず、白い部分(画素値1)のみ採用される。大半がチューリップとなるためR(赤)の輝度が高い画素のカウント数が多くなる。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')
mask = Image.open('mask.jpg')

hist = im.histogram(mask=mask)

plt.plot(hist[0:256], c='red', label='R')
plt.plot(hist[256:512], c='green', label='G')
plt.plot(hist[512:767], c='blue', label='B')

plt.legend()
plt.show()


4. リファレンス

Pillow (PIL Fork) > Image Module > Image.histogram(mask=None, extrema=None)

使用バージョン:Python 3.8.12 / Pillow 9.0.0