これら 7 つの Python のトリックにより、Photoshop のサブスクリプションを再考しました

in tech

Python を使ったことがある人なら、おそらくデータ作業、スクリプト作成、または自動化に Python を使用したことがあるでしょう。しかし、画像編集についてはおそらく知らなかったでしょう。 Python は、Photoshop が行うことの驚くべき量を、予想よりもはるかに少ないコードで処理できることがわかりました。これには、サイズ変更やトリミング、背景の削除、さらには静止画像を GIF にアニメーション化することも含まれます。ここでは、Python を使用して画像を編集およびアニメーション化する 7 つの方法を紹介します。開始に役立つコード スニペットも共有します。

ここでの例のほとんどは、画像処理に最適な Python ライブラリである Pillow というライブラリを使用しています。いくつかのセクションでは NumPy と rembg を使用します。それらについては、そこに到達したときに説明します。ターミナルで次のコマンドを実行して、必要なライブラリをインストールします。

pip install Pillow numpy rembg

Python を使用して画像のサイズ変更、トリミング、回転を行う

画像編集者が必ず行う 3 つの基本操作

これらは画像に対して実行できる最も基本的な操作ですが、Pillow ライブラリを使用すると、これらの操作が恥ずかしいほど簡単になります。 Image モジュールをインポートして 2 行のコードを記述するだけで完了です。これがコードでどのように見えるかについての基本的な考え方は次のとおりです。

from PIL import Image  # Import the Image module from the Pillow library

img = Image.open("photo.jpg")  # Load photo.jpg from disk into an Image object (original is untouched in memory)

# --- RESIZE ---
resized = img.resize((800, 600))  # Create a new Image object scaled to 800x600px (non-destructive, img is unchanged)
resized.save("resized.jpg")  # Write the resized image to disk as resized.jpg

# --- CROP ---
cropped = img.crop((100, 100, 500, 400))  # Cut a rectangle from img: starts at (100,100), ends at (500,400) → gives a 400x300px image
cropped.save("cropped.jpg")  # Write the cropped image to disk as cropped.jpg

# --- ROTATE ---
rotated = img.rotate(45)  # Create a new Image rotated 45° counter-clockwise; corners are clipped and filled black (canvas size unchanged)
rotated.save("rotated.jpg")  # Write the rotated image to disk as rotated.jpg

「photo.jpg」をコンピュータ上にある任意の画像へのパスに置き換えるだけです。

Python を使用して退屈な作業を自動化する AL SWEIGART 著

著者

アル・スワイガート

ジャンル

プログラミング

タイトル

Python で退屈な作業を自動化する

Al Sweigart 著『Automate the Boring Stuff with Python』は、実際のタスクの自動化に Python を使用するための初心者向けのガイドです。ファイル名の変更、Web サイトのスクレイピング、フォームへの記入、電子メールの送信、スプレッドシートの操作などの繰り返し作業を処理するスクリプトの作成方法を学びます。

以前のコーディング経験は必要ありません。


Python を使用して画像上にテキストや図形を描画する

プログラムで画像に注釈を付ける

猫の写真に Hello How To Geek Readers ボックスを追加する Pillow ImageDraw テキスト注釈。

Pillow には、基本的に画像をキャンバスに変える ImageDraw と呼ばれるモジュールがあります。テキスト、四角形、円、線など、あらゆるものを、指定した位置に既存のピクセルの上に直接ペイントできます。

from PIL import Image, ImageDraw, ImageFont  # Also import ImageFont to load a proper font

img = Image.open("photo.jpg")
draw = ImageDraw.Draw(img)  # Draw object bound directly to img — modifications are in-place

# Draw a red rectangle
draw.rectangle((50, 50, 300, 150), outline="red", width=3)  # Rectangle from (50,50) to (300,150), red border, 3px thick

# Load a proper font (change path/size to suit your needs)
font = ImageFont.truetype("arial.ttf", size=32)  # Load a TTF font at 32px — use any .ttf file available on your system

# Add white text at position (60, 60)
draw.text((60, 60), "Hello, World!", fill="white", font=font)  # Write text using the loaded font

img.save("annotated.jpg")

ImageDraw.Draw(img) 行は、描画ツールを画像にリンクするものです。その後、draw.rectangle() またはdraw.text() を呼び出すたびに、文字通り、それらの座標の画像に新しいピクセル値が書き込まれます。保存すると、それらの変更が焼き付けられます。

テキストが表示されない場合は、「arial.ttf」フォントがシステムにロードされていないことが原因である可能性があります。これをシステム上にあるフォントに置き換えれば、機能するはずです。

Python を使用してピクセルを直接操作する

画像は 1 と 0 の単なるグリッドであることを思い出させます

Jupyter での NumPy ピクセル反転により、猫の写真がカラーネガとして表示されます。

これには、ちょっとした精神的な変化が必要です。コンピューター上に表示される画像は、単なる数字の格子です。すべてのピクセルには 3 つの値があります。1 つは赤、1 つは緑、1 つは青で、それぞれ 0 ~ 255 の間です。完全に赤いピクセルは (255, 0, 0)、白いピクセルは (255, 255, 255)、黒は (0, 0, 0) です。

NumPy ライブラリを使用すると、画像を 3 次元配列 (高さ × 幅 × カラー チャネル) としてロードし、それらの数値に対して直接計算できるようになりました。これは、255 からすべてのピクセル値を減算して画像の色を反転する簡単な例です。

from PIL import Image  # Import Pillow's Image module for loading and saving images
import numpy as np  # Import NumPy — allows treating the image as a grid of numbers for direct pixel math

img = Image.open("photo.jpg")  # Load photo.jpg from disk into an Image object

pixels = np.array(img)  # Convert the Image object into a NumPy array — each pixel becomes a number (0–255) representing its brightness/color value

# --- INVERT ---
inverted = 255 - pixels  # Subtract every pixel value from 255 — this flips the colors (0 becomes 255, 255 becomes 0, etc.)

result = Image.fromarray(inverted.astype(np.uint8))  # Convert the NumPy array back into a Pillow Image object — astype(np.uint8) ensures values stay in the valid 0–255 range
result.save("inverted.jpg")  # Write the inverted image to disk

画像を単なる 0 と 1 であると考えると、色の調整、明るさの調整、白黒へのしきい値処理など、多くの画像編集オプションが開かれます。結局のところ、それらはすべて数字のグリッド上の単なる計算にすぎません。

python-seaborn-logo-chartython のロゴを、バー、波のような線、散在するドットで構成される様式化された Seaborn チャート上に表示し、データの視覚化を表します。

NumPy が Python データ分析の基盤である理由

NumPy は統計計算を大幅に強化します。

Python を使用してフィルターと色調整を適用する

ここから写真編集のような気分になります

ここからは、実際の写真編集に少し似てきたように感じます。 Pillow では、ImageFilter と ImageEnhance の 2 つのモジュールを通じて、ブラー、シャープ、グレースケール変換を適用し、さらに明るさとコントラストを調整できます。これらすべては、NumPy を必要とせず、手動でピクセルを変更することなく実行できます。

その仕組みの基本的な概要は次のとおりです。

画像をぼかすと、各ピクセルの値がその周囲のピクセルの平均値に置き換えられます。これにより、すべてが柔らかくぼやけて見えます。

研ぎは逆効果です。隣接するピクセル間のコントラストを増幅します。

同様に、グレースケールではカラー チャネル (赤、緑、青) が取り除かれ、単一の輝度値 (各点の明るさ) にまとめられ、色の情報は残りません。

from PIL import Image, ImageFilter, ImageEnhance  # Import Image for loading, ImageFilter for blur/sharpen effects, ImageEnhance for brightness/contrast adjustments

img = Image.open("photo.jpg")  # Load photo.jpg from disk into an Image object (original stays unchanged throughout)

# --- GRAYSCALE ---
gray = img.convert("L")  # Convert img to grayscale — "L" is Pillow's mode for 8-bit black & white; returns a new Image object
gray.save("grayscale.jpg")  # Write the grayscale image to disk

# --- BLUR ---
blurred = img.filter(ImageFilter.BLUR)  # Apply a simple box blur to img — returns a new Image object, img is unchanged
blurred.save("blurred.jpg")  # Write the blurred image to disk

# --- SHARPEN ---
sharpened = img.filter(ImageFilter.SHARPEN)  # Apply a sharpening filter to img — enhances edges; returns a new Image object
sharpened.save("sharpened.jpg")  # Write the sharpened image to disk

# --- BRIGHTNESS ---
enhancer = ImageEnhance.Brightness(img)  # Create a Brightness enhancer object bound to img — similar to ImageDraw, but read-only (non-destructive)
bright = enhancer.enhance(1.5)  # Apply 1.5x brightness (1.0 = original, <1.0 = darker, >1.0 = brighter) — returns a new Image object
bright.save("brighter.jpg")  # Write the brightened image to disk

上記のコードでは、各効果は元の画像に個別に適用されるため、効果を積み重ねることはありません。ただし、それらを連鎖させたい場合は、ある操作の出力を次の操作の入力として渡すだけです。

Python を使用して画像から背景を削除する

与えることもあれば奪うこともできる

白い背景に分離された猫とタブレットを示す rembg 背景除去結果。

これは、純粋な幾何学や数学ではなく、内部で小さな機械学習モデルを使用しているため、その仕組みの点で奇妙なものです。このライブラリは rembg と呼ばれ、画像を取得し、被写体と背景が何であるかを判断し、背景を透明に置き換えた PNG を返します。

コードは、この記事全体の中で最も単純です。

from rembg import remove  # Import the remove function from rembg — a third-party library that uses an AI model (U2Net) to detect and remove image backgrounds
from PIL import Image  # Import Pillow's Image module for loading and saving images

input_image = Image.open("photo.jpg")  # Load photo.jpg from disk into an Image object

output_image = remove(input_image)  # Pass the image through the AI model — detects the foreground subject, removes the background, returns a new Image object with a transparent background
output_image.save("no_background.png")  # Save as PNG — must use PNG (not JPG) because JPG doesn't support transparency; the transparent areas would be lost

rembg ライブラリは、初めて実行するときに事前トレーニングされたセグメンテーション モデルをダウンロードし (そのため、最初の実行には少し時間がかかります)、その後はマシン上でローカルに実行されます。出力はアルファ チャネルを含む PNG ファイルです。つまり、背景は完全に透明です。これを任意のデザイン ツールにドロップしたり、前のセクションの方法を使用して別の画像と合成したりできます。

被写体がはっきりしていて、背景が適度にはっきりしている画像に最適です。人物、物、動物の写真はよく写る傾向があります。ただし、非常に混雑した背景や、被写体が周囲に溶け込んでいる画像では、問題が発生する可能性があります。

ここでエラーが発生する場合があります。通常、「onnxruntime」がインストールされていないことが原因です。 rembg は自動的にインストールしますが、インストールされない場合は、単に実行してください pip install onnxruntime これでエラーが修正されるはずです。

Python を使用して 2 つの画像を合成する

コードを使用してレイヤーを使用する方法は次のとおりです

オリジナルの猫の写真と半透明のカラーネガオーバーレイをブレンドした枕コンポジット。

合成とは、ある画像を別の画像の上に配置することを意味します。これは Photoshop のレイヤーのようなものだと考えてください。背景があり、その上の特定の位置に何かを貼り付けます。

Pillow は、paste() メソッドを使用してこれを処理します。オーバーレイ イメージに透明度がある場合 (アルファ チャネルを含む PNG)、透明な領域が背景を上書きしないように、それをマスクとして渡すことができます。これは、透かし、ピクチャ イン ピクチャ、UI モックアップの生成などの基礎となります。

from PIL import Image

background = Image.open("photo.jpg").convert("RGBA")  # Convert to RGBA to support transparency
overlay = Image.open("logo.png").convert("RGBA")  # Convert to RGBA — logos often have transparent areas

# Resize overlay to desired size before pasting
overlay = overlay.resize((200, 100))  # Scale the logo to 200x100px — adjust to suit your needs

# Paste the overlay at position (50, 50)
background.paste(overlay, (50, 50), mask=overlay)  # mask=overlay uses the overlay's alpha channel to blend edges cleanly — without this, transparent areas paste as black

background.save("composited.png")  # Save as PNG to preserve transparency

past() メソッドには引数マスク= があります。画像名。これは、オーバーレイ イメージのアルファ チャネルを使用して、どのピクセルを貼り付け、どのピクセルを透明のままにするかを決定するように Pillow に指示します。これがないと、透明性のない硬い長方形のペーストができてしまいます。

Python を使用して 1 つの画像をアニメーション化して GIF にする

それは生きています…

猫の写真を 20 フレーム以上ゆっくりと押し込む枕ズームイン アニメーション GIF。-anim

技術的には使えない ただ Python を使用して、猫が起き上がって動き始めるという意味で、画像をアニメーション化します。それは不可能です。ただし、ズームイン効果を追加したり、ある画像から別の画像にゆっくりと移行したりすることは可能です。 Python は、画像に小さな増分変更を適用することでコード内に多数のフレームを生成し、それらすべてのフレームを 1 つの GIF ファイルにつなぎ合わせます。

これは、ゆっくりとしたズームイン効果を作成する例です。各フレームで画像のサイズがわずかに大きくなり、その後中心から元のサイズに切り取られるため、カメラが押し込まれているように見えます。

from PIL import Image

img = Image.open("photo.jpg").convert("RGBA")  # Load image and convert to RGBA — needed for consistent pixel handling across frames

frames = ()  # Empty list to store each frame of the animation

for i in range(20):  # Loop 20 times — each iteration generates one frame of the zoom effect
    scale = 1 + i * 0.02  # Calculate scale factor for this frame — starts at 1.0 (100%), increases by 2% each frame up to 1.38 (138%)
    new_width = int(img.width * scale)  # Calculate new width based on scale factor
    new_height = int(img.height * scale)  # Calculate new height based on scale factor
    resized = img.resize((new_width, new_height))  # Resize the image to the new dimensions — makes it slightly larger each frame

    # --- CROP BACK TO ORIGINAL SIZE FROM CENTER ---
    left = (resized.width - img.width) // 2  # Calculate how many pixels to trim from the left to center the crop
    top = (resized.height - img.height) // 2  # Calculate how many pixels to trim from the top to center the crop
    frame = resized.crop((left, top, left + img.width, top + img.height))  # Crop the resized image back to the original dimensions from the center — this creates the zoom-in illusion
    frames.append(frame)  # Add the cropped frame to the frames list

# --- SAVE AS GIF ---
frames(0).save(
    "zoom.gif",           # Output filename
    save_all=True,        # Tell Pillow to save all frames, not just the first one
    append_images=frames(1:),  # Attach frames 2–20 after the first frame
    duration=50,          # Each frame displays for 50 milliseconds — lower = faster animation
    loop=0                # 0 = loop forever; set to 1 for play-once, 2 for twice, etc.
)

ループは 20 フレームを生成し、それぞれが最後より 2% 拡大してズームインします。次に、save_all=True を指定した save() は、それらすべてを 1 つのアニメーション GIF にパックするように Pillow に指示します。同じ原理が、パン、フェード、カラー サイクリングなど、フレームごとの一連の小さな変化として表現できるあらゆる効果にも当てはまります。

また、猫が動いているバースト ショットがある場合、Python を使用してそれらの各ショットを技術的につなぎ合わせて、動き回る猫のほぼストップモーション アニメーションを作成できることにも言及しておきます。

Stable Diffusion で説明されているビデオ カメラ。

安定した拡散を使用して AI GIF とビデオを作成する方法

オスカーを獲得することはできませんが、アニモーフを作ることはできます。


Python はとんでもない可能性を広げます

ご覧のとおり、コードを使用した画像編集は実際に可能であり、さらに、実際にはそれほど複雑でもコード量も多くありません。しかし、なぜ Photoshop の代わりにこれを使用するのでしょうか?コードを使用して画像を操作できるようになると、自動化の可能性が大きく広がります。たとえば、私は最近、壁紙画像に毎日のタスクをオーバーレイするオートメーションを作成しました。これは素晴らしいプロジェクトであり、プログラムによる画像操作なしでは不可能でした。

日々のタスクが刻まれたデスクトップの壁紙。

クロードにデスクトップの壁紙を変更してもらいました。今では期限を守ることはありません (プロンプトあり)

生産性への不安を壁紙に任せましたが、正直に言って、とても順調です。

このテーマについてさらに詳しく知りたい方は以下をご覧ください

完全ガイドはこちら

関連記事

前の投稿
アカウントまたはデバイスがハッキングされた 9 つの微妙な兆候
次の投稿
すべての Shokz ユーザーが知っておくべき 5 つのハック

関連記事