PythonPillowのいくつかの興味深いトリック

ジャストインタイムスニペット、Python画像操作ライブラリ。

UnsplashのMatthewFassnachtによる写真

フォトダニエルMarcinkowskiにUnsplash

画像操作は基本的に、デジタル化された画像を目的の画像に変換するプロセスです。ほとんどの場合、人々が画像操作について考えるとき、フォトショップが頭に浮かぶものです。これは、画像を変更および改善するために最も一般的に使用されているツールの1つです。ただし、この投稿はPython画像操作ライブラリ、正確には枕に焦点を当てています。

The Hitchhiker's Guide to Pythonによると、ほとんどの画像処理および操作技術は、Python Imaging Library(PIL)とOpen Source Computer Vision(OpenCV)の2つのライブラリを使用して効果的に実行できます。

Pillowは、PIL(Python Image Library)のフォークであり、AlexClarkとContributorsによって開始および保守されています。元々はPILコードに基づいていましたが、PILのより優れた、最新の、より使いやすいバージョンに進化しました。多くの異なるファイル形式の画像のオープンと操作をサポートします。

Pythonプログラミング言語に精通している場合は、Pillowに出くわし、おそらくすでに使用している可能性があります。

基本的なインストール

まず、Pythonをマシンにインストールする必要があります。また、python pip(Python Package Index)がインストールされ、最新であることを確認してください。枕を取り付けるには、以下のコマンドを実行します。

$ pip install Pillow

グレースケールに変換(白黒)

以下のスニペットは、画像(test_image.jpg)を基本的なグレースケールに変換します。新しい画像(test_image_grayscale.jpg)として保存します。

from PIL import Image
# open colour image
img = Image.open("test_image.jpg")
# convert image to black and white
img = img.convert("1")
# save new image
img.save("test_image_grayscale.jpg")
# show image in preview
img.show()

      
Photo by Ina Sonne on Instagram

多くの場合、いくつかの画像をすばやくサムネイル化する必要があります。以下のスニペットがそのトリックを行います。

from PIL import Image
# open image
img = Image.open("test_image.jpg")
# set the maximum width and height for the thumbnail
max_thumbnail_size = (200, 200)
# applying size for thumbnail
img.thumbnail(max_thumbnail_size)
# creating thumbnail
img.save("test_image_thumb.jpg")
# show image in preview
img.show()

      
Photo by Ishan @seefromthesky on Unsplash

以下のコードは、すべての白いピクセルを置き換え、それらを黄色に置き換えます。複数の色の画像を調整するには、さらに微調整が必​​要です。それでも、以下のスニペットは、背景色が無地の画像でうまく機能します。

from PIL import Image
# open image
img = Image.open("test_image.jpg")
img = img.convert("RGB")
datas = img.getdata()
new_image_data = []
for item in datas:
    # change all white (also shades of whites) pixels to yellow
    if item[0] in list(range(190, 256)):
        new_image_data.append((255, 204, 100))
    else:
        new_image_data.append(item)
# update image data
img.putdata(new_image_data)
# save new image
img.save("test_image_altered_background.jpg")
# show image in preview
img.show()

      
Image from Google Spreadsheet API

これは、画像に適用される境界線の色とサイズを受け入れます。境界線は5などの整数値にすることができます。これは、すべての境界線(左、上、右、下)のサイズが同じであることを示します。また、タプル、つまり(5、10、5、10)を受け入れ、それぞれの側で異なる値を持ちます。

from PIL import Image, ImageOps
# open image
img = Image.open("test_image.jpg")
# border color
color = "green"
# top, right, bottom, left
border = (20, 10, 20, 10)
new_img = ImageOps.expand(img, border=border, fill=color)
# save new image
new_img.save("test_image_result.jpg")
# show new bordered image in preview
new_img.show()

Google SpreadsheetAPIからの画像

ぼやけたエッジを追加する

このセクションは、前の例に関するいくつかのステップで構成されています。最初の部分では、ぼやけた画像(マスク)を作成し、その画像を元の画像のマスクとして使用する必要があります。ぼやけたエッジ画像を作成する方法の手順と手順は、以下に詳しく説明されています。

from PIL import Image, ImageFilter
# blur radius and diameter
radius, diameter = 20, 40
# open an image
img = Image.open("test_image.jpg")
# Paste image on white background
background_size = (img.size[0] + diameter, img.size[1] + diameter)
background = Image.new('RGB', background_size, (255, 255, 255))
background.paste(img, (radius, radius))
# create new images with white and black
mask_size = (img.size[0] + diameter, img.size[1] + diameter)
mask = Image.new('L', mask_size, 255)
black_size = (img.size[0] - diameter, img.size[1] - diameter)
black = Image.new('L', black_size, 0)
# create blur mask
mask.paste(black, (diameter, diameter))
# Blur image and paste blurred edge according to mask
blur = background.filter(ImageFilter.GaussianBlur(radius / 2))
background.paste(blur, mask=mask)
background.save("test_image_blurred.jpg", quality=100))
# show blurred edged image in preview
background.show()

      
Photo by Ina Sonne on Instagram

透かしの使用は、画像を著作権侵害から保護するために使用される本の中で最も古いトリックの1つです。画像の透かしを回避するためのいくつかの新しいアプローチがありますが(興味があるかどうかを調べてください)、それでも非常に効率的です。以下のコードサンプルは、画像全体に連続した透かしを追加する方法を示しています。

from PIL import Image, ImageDraw, ImageFont
# open image to apply watermark to
img = Image.open("watermark_test.jpg")
img.convert("RGB")
# get image size
img_width, img_height = img.size
# 5 by 4 water mark grid
wm_size = (int(img_width * 0.20), int(img_height * 0.25))
wm_txt = Image.new("RGBA", wm_size, (255, 255, 255, 0))
# set text size, 1:40 of the image width
font_size = int(img_width / 40)
# load font e.g. gotham-bold.ttf
font = ImageFont.truetype(path.format("gotham-bold.ttf"), font_size)
d = ImageDraw.Draw(wm_txt)
wm_text = "Kuma Kum"
# centralize text
left = (wm_size[0] - font.getsize(wm_text)[0]) / 2
top = (wm_size[1] - font.getsize(wm_text)[1]) / 2
# RGBA(0, 0, 0, alpha) is black
# alpha channel specifies the opacity for a colour
alpha = 75
# write text on blank wm_text image
d.text((left, top), wm_text, fill=(0, 0, 0, alpha), font=font)
# uncomment to rotate watermark text
# wm_txt = wm_txt.rotate(15,  expand=1)
# wm_txt = wm_txt.resize(wm_size, Image.ANTIALIAS)
for i in range(0, img_width, wm_txt.size[0]):
    for j in range(0, img_height, wm_txt.size[1]):
        img.paste(wm_txt, (i, j), wm_txt)
# save image with watermark
img.save("watermark-image.jpg")
# show image with watermark in preview
img.show()

      
Photo by Kuma Kum on Unsplash

ピローライブラリをさらに多く使用できます。上記は、私が頻繁に使用し、特に役立つと考える基本的なサンプルのほんの一部です。自分で試してみてください。完全なコードスニペットなどは、ここをクリックして見つけることができます。

提案された投稿

私が最もよく使用するコーディング リソース

私が最もよく使用するコーディング リソース

今週、毎日のメールリストのメンバーからメールを受け取りました。彼らは次のことを知りたかったのです。毎日、毎週、毎月どのリソースにアクセスしていますか? 素晴らしい質問です!私のワークフローと使用している主なリソースについての洞察を共有したいと思います。

ハイパーモダンなターミナル ツールボックス

ハイパーモダンなターミナル ツールボックス

ターミナル、シェル、コマンドライン ツールが 2023 年の標準を設定します。すべての開発者はターミナルを使用します。ワークフロー全体がターミナルである人もいます この投稿では、ハイパーモダン ターミナル ツールボックスを紹介します — ターミナル、シェル、コマンドライン ツールが 2023 年の標準を設定します ターミナル エミュレータとしての Kitty Kitty はターミナル エミュレータです — それは GNOME ターミナルの代替品です、Alacritty または Windows ターミナル。

関連記事

お子様向けの初めてのハイになる本

お子様向けの初めてのハイになる本

(警告 - これは風刺であり、大喜びで破壊的な意図があります - 絶対に子供向けではありません) あなたは、お母さんとお父さんがキッチンに隠れて臭いタバコを吸っているのを見たことがあるでしょう。彼らはあなたに言います。

24 年度に炭素除去に資金を提供

経路全体にわたる Carbon180 の割り当てリクエストの内訳

24 年度に炭素除去に資金を提供

アリソン・リー著、マネージング政府問題顧問 連邦政府の年次歳出プロセスは、二酸化炭素除去 (CDR) に資金を提供する取り組みの中心です。毎年、Carbon180 は、来年の資金がどこに流れるかの指針となるよう、さまざまな議会事務所に要望書を提出しています。

脅威ハンティングのための OSINT の収集

脅威ハンティングのための OSINT の収集

サイバー愛好家の皆さん、こんにちは!OSINT for Threat Hunting シリーズへようこそ。最初の記事では、OSINT の概要と脅威ハンティングにおけるその重要性について説明しました。

ドメイン名に関する情報の検索

Brian P. Hogan 著『Small, Sharp Software Tools』からの抜粋

ドメイン名に関する情報の検索

facebook.com にリクエストを送信すると、コンピュータはドメイン名を検索してそのドメイン名を IP アドレスに変換し、コンピュータが接続できるようにします。