2020年11月29日日曜日

Python+Pillowでトイカメラ風に周辺光量落ちさせる その1

最近、お出かけすることが減って、Pythonを勉強しています。
そのPython言語の、Pillowという画像ライブラリを使ったスクリプトです。
Pythonをインストールして、Pillowのライブラリをpipでインストールして
おく必要があります。
記事を書いている時点のPythonは3.8です。

前回までは、描画系のスクリプトを作りましたが、
今回から写真加工するスクリプトです。

【注意】
ファイルを書き出すスクリプトなので、
消えて困るファイルのあるフォルダでは実行しないでください。

以下にスクリプトのコードを書きます。


"""
トイカメラ風に周辺減光させる
Usage :
    python toycamera.py 入力画像 出力画像 塗り残す比率 ぼかし半径
起動パラメータ
    塗り残す比率 : 0.3 から 0.5 程度
    ぼかし半径 : 20 から 50 程度
             大きくすると塗りつぶしの境界がなだらかな調子になります
"""

import os
import sys
from PIL import Image, ImageDraw, ImageFilter

# 起動パラメータ数チェック
if len(sys.argv) < 3 :
    print("usage : python toycamera.py 入力ファイル 出力ファイル  塗り残す比率 ぼかし半径")
    sys.exit()

# 塗り残す範囲の比率
if len(sys.argv) > 3 :
    r_rate = float(sys.argv[3])
else:
    r_rate = 0.5
# ぼかし半径
if len(sys.argv) > 4 :
    blur_radius = int(sys.argv[4])
else:
    blur_radius = 50

if os.path.isfile(sys.argv[1]) is False :
    print("入力ファイル名にファイルではない名前が指定されています。")
    print("実行を中止します。")
    sys.exit()

if os.path.isdir(sys.argv[2]):
    print("出力ファイル名にディレクトリ名が指定されています。")
    print("実行を中止します。")
    sys.exit()

STRENGTH = 120               # 効果の強さ 0(最強)~255(効果なし)

print("以下の条件で処理を行います。")
print(f"入力ファイル {sys.argv[1]}")
print(f"出力ファイル {sys.argv[2]}")
print(f"塗り残す比率 {r_rate}")
print(f"ぼかし半径   {blur_radius}")
print(f"効果の強さ   {STRENGTH}")

inkey = input("よろしいですか?")
if inkey not in ("y", "Y") :
    print("実行を中止します。")
    sys.exit()

if os.path.exists(sys.argv[2]):
    print("\n出力ファイルが存在します。")
    inkey = input("上書きしてよろしいですか?")
    if inkey not in ("y", "Y") :
        print("実行を中止します。")
        sys.exit()

# 塗りつぶし色
# 白く塗りつぶす場合
#fill_color = (255, 255, 255)
# 黒く塗りつぶす場合
fill_color = (0, 0, 0)

# 画像を読み取り
im = Image.open(sys.argv[1])

# 円を描画する開始位置、終了位置を計算する
w,h = im.size
radius = max(w,h) * r_rate
w_start = (w / 2) - radius
w_end = (w / 2) + radius
h_start = (h / 2) - radius
h_end = (h / 2) + radius

# マスク画像を描画する
mask = Image.new("L", (w, h), STRENGTH)
draw = ImageDraw.Draw(mask)
draw.ellipse((w_start, h_start, w_end, h_end), fill=255)
mask_blur = mask.filter(ImageFilter.GaussianBlur(blur_radius))

# 塗りつぶし画像を作成する
plane = Image.new("RGB", (w, h), fill_color)

# 元の画像と、塗りつぶし画像を合成する
im2 = Image.composite(im, plane, mask_blur)
# 画像を表示
im2.show()
im2.save(sys.argv[2], quality=100)


上のスクリプトをUTF-8のエンコーディングで、toycamera.py という
ファイルに保存します。
Windowsだとコマンドプロンプト等を開いて、スクリプトを保存した


フォルダにcdコマンドで移動して、

python toycamera.py 入力画像名 出力画像名 塗り残す比率 ぼかし半径

で実行します。 実行すると、

  以下の条件で処理を行います。
    (中略)
  よろしいですか?

という確認メッセージを表示するので、
Y をキー入力すると、ファイルを加工して出力します。

入力画像の例






出力画像の例



この例は、
塗り残す比率 : 0.4
ぼかし半径 : 40
で作成しました。

スクリプト内の、 STRENGTH を変更すると塗りつぶしの強さが変わります。
また、 fill_color を (0,0,0) から (255,255,255) に変更すると、
周辺を白く加工します。



金曜日の夕方に、近所のハードオフで、Washburn XB200という
エントリクラスのベースギターのジャンク品を\5500で購入しました。

先週の3連休に見つけたものですが、トーンの可変抵抗の
ナットが無く、ボディの中に落ちてしまっているため
ジャンク品ということでした。
お店にチューナーを持っていって、チューニングしてみたところ、
ブリッジを目いっぱい下げているのに、弦の高さがすごく高くて
その時は、購入を見送りました。

でも、持った感じが軽くて弾きやすそうな感じがしたし、
ネック自体はまっすくだったし、
ネックの裏側がグロス仕上げで高級感があったので、
気になっていました。
あと、ブリッジがGOTOH製のものが付いていて、
最悪、部品取りすれば、丸損にはならないというのもあります。

弦高の問題は、ネックとボディのジョイント部分にシムを
入れたら、治るのではと気がついたので、購入に至りました。

金曜の夕方に買って、表面を掃除して、ジョイントを
外すと、メーカーで入れたと思われるシムが既に入っていたの
ですが、ボディ側の木材がシムの形に凹んでいて、
シムを入れた意味が無くなってしまっていました。

手元にあった厚紙を3枚重ねてネックとボディの間に入れたら、
弦高が正常になったのですが、そこに至るまでに、
厚紙の枚数を変えてジョイントのネジを締めて
チューニングを合わせて・・・というのを
4回ぐらいやりました。

あとは、弦、ブリッジ、ボリューム、つまみ、ピックアップを止めるビス、
ピックアップ用クッション、ジャックを交換し、ペグがぐらつくので
グリスを少し入れて現在に至ります。

このベース、前ピックアップと後ピックアップ用に
ボリュームがあるのに、バランス用の可変抵抗も
付いているのが珍しいです。
バランス用の可変抵抗にコンデンサも付いているので、
ハイパスのトーンかと思ったのですが、使ってみると
PUバランスだったという。

2020年11月22日日曜日

Python+PillowでRGBスケールを描画する

 最近、お出かけすることが減って、Pythonを勉強しています。

そのPython言語の、Pillowという画像ライブラリを使ったスクリプトです。

Pythonをインストールして、Pillowのライブラリをpipでインストールしておく

必要があります。

記事を書いている時点のPythonは3.8です。


前回はいろいろな大きさの円形をランダムな位置に描画するスクリプトを作りました、

今回は赤、緑、青、灰色の色スケールを描画するスクリプトです。


以下にスクリプトのコードを書きます。




"""
PillowでRGBスケールを描画する
"""

import random
from PIL import Image, ImageDraw

def main():
    """
    画像作成処理
    """

    BLOCK_WIDTH = 100                  # ブロックの幅
    BLOCK_GAP = 5                      # ブロック間の幅
    IMG_WIDTH = 4*BLOCK_WIDTH + 3*BLOCK_GAP  # 画像の幅
    BLOCK_HEIGHT = 32                   # ブロックの高さ
    BLOCK_STEP = 16                     # ブロックの色の増分
    IMG_HEIGHT = int(BLOCK_HEIGHT*(256/BLOCK_STEP+1))  # 画像の高さ
    BACKGROUND = (255, 255, 255)       # 背景色

    # 画像を作成
    im = Image.new("RGB", (IMG_WIDTH, IMG_HEIGHT), BACKGROUND)
    draw = ImageDraw.Draw(im)

    # 4つの色で繰り返し描画する
    pos_x_st = 0
    for i in range(4):
        if i > 0 :
            pos_x_st = pos_x_st + BLOCK_WIDTH + BLOCK_GAP
        pos_x_en = pos_x_st + BLOCK_WIDTH

        # 色ごとに明るさを変えて描画する
        light = 0
        r = 0
        g = 0
        b = 0
        for j in range(int(256 / BLOCK_STEP + 1)):
            pos_y_st = j * BLOCK_HEIGHT
            pos_y_en = (j+1) * BLOCK_HEIGHT

            # 各色 36から255の乱数を生成
            if i == 0 :
                # 赤スケール
                r = light
            elif i == 1 :
                # 緑スケール
                g = light
            elif i == 2 :
                # 青スケール
                b = light
            else :
                # 白黒スケール
                r = light
                g = light
                b = light

            # 1つのブロックを描画する
            draw.rectangle((pos_x_st, pos_y_st, pos_x_en, pos_y_en), (r,g,b))

            # 次のブロックの明るさを計算する
            light = light + BLOCK_STEP
            if light > 255 :
                light = 255

    # 画像を保存
    im.save("rgb_scale.png")

    # 画像を表示
    im.show()

if __name__ == '__main__':
    # 画像作成処理を実行
    main()




上のスクリプトをUTF-8のエンコーディングで、拡張子 .py のファイルにして保存します。

Windowsだとコマンドプロンプト等を開いて、スクリプトを保存したフォルダにcdコマンドで移動して、


python スクリプトファイル名


で実行します。 実行すると、



こんな感じの画像が表示されると思います。


スクリプトの中の、BLOCK_HEIGHT を 32 から 4 に、

BLOCK_STEP を 16 から 2 に変更して、実行すると、

こんな感じの画像になります。



出力画像の大きさが少し変わってしまうのは、ご愛敬ということで。


まじめにディスプレイの調整をしたいのであれば、

https://www.eizo.co.jp/eizolibrary/other/itmedia04/

こちらのページから、いろいろな確認用の画像が入手できます。


2020年11月15日日曜日

ご近所のヒガンバナ

9月29日のお散歩写真です。

ご近所の緑地まで歩いてきました。



ご近所の公園の植え込みのヒガンバナ。



緑地に移動しました。

木が茂っていて、昼でも薄暗いので、撮りにくいです。

この緑地の中に、白い花と赤い花が植えてあるのですが、

今年は、ここの赤い花は状態が良くなかったです。



緑地内を移動中に見つけました。





緑地の逆側にも、少しだけヒガンバナが咲くので、それを撮りました。

Panasonic DMC-GX7, SIGMA MACRO 105mmF2.8 EX, Nikon F-M4/3アダプタ

ストロボ Pansonic PE-36S


2020年11月8日日曜日

Python+Pillowでいろいろな大きさの円を描く

最近、お出かけすることが減って、Pythonを勉強しています。 
そのPython言語の、Pillowという画像ライブラリを使ったスクリプトです。 
Pythonをインストールして、Pillowのライブラリをpipでインストールしておく
必要があります。 
記事を書いている時点のPythonは3.8です。

前回は同じ大きさの円形を並べて描画するスクリプトを作りましたが、 
今回はランダムな位置に、違う大きさの円形を描画します。 
円形を描画するには、Pilowの ImageDraw.Drawクラスの ellipse メソッド を使います。 以下にスクリプトのコードを書きます。

"""
Pillowで大きさを変えた円を多数描画する
"""

import random
from PIL import Image, ImageDraw

def main():
    """
    画像作成処理
    """

    IMG_WIDTH = 640                    # 画像の幅
    IMG_HEIGHT = 640                   # 画像の高さ
    BLOCK_SIZE = 15                    # 円の直径
    BLOCK_MIN = 10                     # 円の直径の最小値
    BACKGROUND = (255, 255, 255)       # 背景色
    NUM_CIRCLES = 100                  # 描画する円の個数

    # 画像を作成
    im = Image.new("RGB", (IMG_WIDTH, IMG_HEIGHT), BACKGROUND)
    draw = ImageDraw.Draw(im)

    # 円を繰り返し描画する
    for i in range(NUM_CIRCLES):
        pos_x = int(random.random() * IMG_WIDTH)
        pos_y = int(random.random() * IMG_HEIGHT)

        block = int(((NUM_CIRCLES - i) / NUM_CIRCLES) * BLOCK_SIZE) ** 2 + BLOCK_MIN
        # 各色 36から255の乱数を生成
        r = int(random.random()*256)
        g = int(random.random()*256)
        b = int(random.random()*256)
        draw.ellipse((pos_x - block, pos_y - block, pos_x + block, pos_y + block), (r,g,b))

    # 画像を表示
    im.show()

if __name__ == '__main__':
    # 画像作成処理を実行
    main()

上のスクリプトをUTF-8のエンコーディングで、拡張子 .py のファイルにして保存します。
 Windowsだとコマンドプロンプト等を開いて、スクリプトを保存したフォルダにcdコマンドで移動して、 

python スクリプトファイル名 

で実行します。 実行すると、




 こんな感じの画像が表示されると思います。

2020年11月1日日曜日

Python+Pillowで小さな円を並べて描画する

 最近、お出かけすることが減って、Pythonを勉強しています。

そのPython言語の、Pillowという画像ライブラリを使ったスクリプトです。

Pythonをインストールして、Pillowのライブラリをpipでインストールしておく必要があります。


前回は1ピクセルごとに色を設定する処理を繰り返して四角形を

作りましたが、今回は円形を描画します。

円形を描画するには、Pilowの?ImageDraw.Drawクラスの ellipse メソッド

を使います。

以下にスクリプトのコードを書きます。


"""
Pillowで小さな円を並べた画像を生成する
"""

import random
from PIL import Image, ImageDraw

def main():
    """
    画像作成処理
    """

    IMG_WIDTH = 640                    # 画像の幅
    IMG_HEIGHT = 640                   # 画像の高さ
    BLOCK_SIZE = 64                    # 円の直径
    BACKGROUND = (255, 255, 255)       # 背景色
    width = int(IMG_WIDTH / BLOCK_SIZE) * BLOCK_SIZE
    height = int(IMG_HEIGHT / BLOCK_SIZE) * BLOCK_SIZE

    # 画像を作成
    im = Image.new("RGB", (width+1, height+1), BACKGROUND)
    draw = ImageDraw.Draw(im)

    # 小さな円を繰り返し描画する
    start_pos = int(BLOCK_SIZE/2)
    for i in range(0, width, BLOCK_SIZE):
        for j in range(0, height, BLOCK_SIZE):
            r = int(random.random()*256)
            g = int(random.random()*256)
            b = int(random.random()*256)
            draw.ellipse((i,j,i+BLOCK_SIZE,j+BLOCK_SIZE), (r,g,b))

    # 画像を表示
    im.show()

if __name__ == '__main__':
    # 画像作成処理を実行
    main()

上のスクリプトをUTF-8のエンコーディングで、拡張子 .py のファイルにして保存します。

Windowsだとコマンドプロンプト等を開いて、スクリプトを保存したフォルダにcdコマンドで移動して、


python スクリプトファイル名


で実行します。

実行すると、




こんな感じの画像が表示されると思います。