■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、下記 URL からダウンロードできます。
https://---------------------------------------------------------------

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

はじめに画像の加工や補正が必要なシーンは増えています。GIF から PNG へなどのファイルフォーマッ
ト変更、ページレイアウトに合わせたリサイズや切り出し、色調の調整、画像をレイヤ化してからの重畳、あるいはキャプションやウォーターマークの焼き込みといった作業です。数点なら画像編
集アプリケーションで手作業もできますが、枚数が増えれば、手に負えません。
そこで自動化を考えます。使用する言語は、汎用的でありながら手軽に使え、利用者も情報も多く、実行環境を問わない Python が昨今では一般的でしょう。各種追加機能（外部のライブラリ）も豊富なので、いろいろな目的に利用できます。
しかし、画像プログラミングは数式が多かったりと、敷居が高いのが問題です。
その点、本書で紹介する Pillow は簡単です。他の画像処理ライブラリと比較すると、次のような特徴があります。
● 用途別に関数が用意されており、調整するパラメータが他より少ない。たとえば、リサイズだ

けで 8 種類あり、コントラストや輝度の調整もテレビのスライダ風にそれぞれの目的に応じて関数化されています。
● 画像表現に行列（Numpy）を使わなくてもよい（便利ですが、必須ではありません）。
● 対応可能な画像ファイルフォーマットが多い（現在 40 種類）。
● 他の画像処理ライブラリとの画像交換方法が完備している。
● 軽い（インポートが早い）。

半面、高度な画像処理機能は用意されていません。画像中の文字や顔の所在を特定したり、数値のリストからグラフを描くなどはできません。しかし、そうした処理はそれを得意とするライブラ
リに任せればよいのです。根幹部分は簡単な Pillow で記述し、高機能部分はネットに置かれているコードをコピペすれば、目的は達成できます。本書ではそうした使い方を念頭に、以下のライブ
ラリとの連携方法に 1 章を割きます。
● tkinter － Python にバンドルされている GUI ライブラリ。
● OpenCV －画像処理ライブラリ。
● matplotlib －グラフ描画ライブラリ。
● pywin32（win32api）－ Windows API ライブラリ（の画像関連のごく一部）。

iii

Pillow はもとは PIL（Python Imaging Library）と呼ばれていました。しかし、PIL は 1995 年の最初のリリースから 6 年後に開発が停止してしまいました。以降、同機能は Alex Clark がフォークし、修正と機能追加を行っている Pillow に移行しました。ネットで PIL とあるものは、（今は廃れた Python 2 関係の古い情報でなければ）ほぼ間違いなくこの Pillow を意味しています。
本書は Python を用いて画像の加工、補正、編集のスクリプト（プログラム）を書こうと考えるプログラマや Web デザイナ、あるいは簡単なところから画像処理を学ぼうと考える学生を対象にしています。Python については、ある程度なら書ける知識と経験があることを前提にしています。
リスト内包表記やラムダ式などやや凝った記法も本書では使いますが、複雑なものは付録 B にま
とめて概説を加えました。トリビアかも知れませんが、不如意なときは参照してください。
2022 年 7 月
豊沢 聡

iv

注意事項
本書の表記や使用するサンプルファイルなどで注意すべき点を説明します。

パッケージ名
Pillow のパッケージ名は PIL ですが、本書では省きます。たとえば、マニュアルの関数定義は

PIL.Image.open() のように PIL から書き起こしていますが、from PIL import Image, ImageOps のようにインポートすることを念頭に、本書では Image.open() や ImageOps.scale() とモジュール名
から書きます。

Numpy も、慣例に従って import numpy as np と別名でインポートするので、それに合わせて np.ndarray のように np からスタートします（マニュアルは numpy.ndarray と書いています）。

tkinter も同様で tk.Canvas() のように書きます。

関数定義
関数定義は初出の時点で、次のように示します。
Image.show()# 戻り値なし

tuple[str] = Image.getbands()# 文字列のタプルを返す

Image = Image.open(fp, formats=None)# Imageオブジェクトを返す

マニュアルに記載された関数引数には、用途によっては使わないものも数多くあります。本書では、説明範囲内のもののみ記載します。たとえば、上記の Image.open() 関数のマニュアル上の引数は (fp, mode='r', formats=None) ですが、mode はデフォルトの r 以外は指定できない仕様なので省きます。

左辺は戻り値の型を示します。1 行目のように未記載の関数には戻り値はありません（強いて代入すると None が得られる）。2 行目は Image オブジェクト、3 行目は文字列を要素としたタプルをそれぞれ返します。[] はコンテナタイプの内側の型を示します。たとえば、list[list] はリストのリスト、list[tuple[int]] は整数を要素としたタプルのリストです。
Python 本体の組み込み関数や標準ライブラリの定義は示しません。

Numpy や OpenCV など Pillow 以外のライブラリについては、関数定義は掲載しますが、必須引数のみ記述します。オプション引数はとくに断りがない限りデフォルトで使用します。

v

詳細はそれぞれのマニュアルを参照してください。マニュアルの URL は付録 D にまとめて示しました。

用例
本書では、簡単な用例は Python のインタラクティブモードから示します。
>>> from PIL import Image>>> img = Image.open('Dachshund.jpg')>>> hex(id(img))'0x176abdd6110'# テスト用画像を読み込み# オブジェクトIDを確認>>> はインタラクティブモードのプロンプトです。# から始まる文は、筆者が原稿に加えたコメ

ントで、実行時に記述が必要なものではありません。

要素数の多いリストや行数のある出力結果は一部省略（... や︙）、あるいは読みやすい箇所で改行しています。次の例ではリストの要素を省略しています。
# web_mediumの中身>>> JpegPresets.presets['web_medium']{'subsampling': 2, 'quantization': [[16, 11, 11, 16, 23, 27, 31, 30, ..., 64]]}

この例では、横に長いエラー出力に改行を入れています。
Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "C:\tools\python3.10.2\lib\site-packages\PIL\Image.py",line 519, in __getattr__

raise AttributeError(name)# ここと# ここはもとは1行

AttributeError: filename

コンソール（あるいはコマンドプロンプトやターミナル）からの実行例は Windows のものを掲載しています。他 OS のユーザは当該操作に該当する操作に読み替えてください。

vi

# Windowsコマンドプロンプト

C:\temp>dir new*︙

2022/03/13
2022/03/13

11:25
11:29

1,157,653 new.gif

324,934 new.webp# 約2/7

ファイルパスの区切り文字は Unix スタイルの /（フォーワードスラッシュ）を用います。ただし、Windows のコマンドプロンプトでは（当然ですが）Windows の \（バックスラッシュ）を用います。

日本語環境の Windows コマンドプロンプトでは、\ は ¥ で表示されます。

サンプルスクリプト
まとまった用例はスクリプトにまとめました。文中では、次のように「リスト●ファイル名」という見出しをつけて記載しました。
リスト 0.1 ● pil_paste_mask.py
1
2

from PIL import Image
from sys import argv

︙

本書掲載のスクリプトは、すべて本書扉裏に示した URL からダウンロードできます。

サンプル画像本書で用いたサンプル画像は、筆者自作のものを除いて、いずれも Pixabay から入手した「商用利用無料、帰属表示は必要ありません」のものです。これら画像は付録 C にまとめて掲載しました。

サンプル画像はサンプルスクリプトを置いたディレクトリ下の Images ディレクトリに収容してあります。本書扉裏に示した URL からダウンロードできます。

vii

開発環境
Python も Pillow も、そして本書で取り上げる数点のライブラリもマルチプラットフォーム対応
なので、開発環境は問いません。
ただし、OS 依存性のあるものについては、本書の記述はすべて Windows を対象とします。た

とえば、画像を表示する Image.open() 関数のデフォルト画像表示アプリケーションは Windowsの「フォト」アプリだと述べ、このデフォルトを変更するためのクラスは Image.WindowsViewer だ

けを説明します。

Python およびライブラリの導入方法は付録 A で説明します。

WSL
Windows にデフォルトで搭載されている Unix 仮想マシンの WSL（Windows Subsystem forLinux）でも Pillow は動作しますが、画像表示はできません。仮想マシンには物理的なディスプレ
イがないからです。
Windows 側に X Window System のディスプレイを提供するアプリケーションを用意すれば表示できますが、本書の範囲を超えています。WSL での開発では、画像を一時保存し、Windows のエクスプローラから開くのが迂路ですが、簡単です。もちろん、画像表示なしのバッチ処理なら、WSL も有効です。

オンライン環境
Google Colaboratory や replit など、オンライン Python 実行環境でも Pillow は実行できますが、本書で多用するコマンドライン引数からのファイルの指定、ファイル読み込みおよび描き出し、画像表示には、その環境にのっとった操作を行わなければなりません。オンライン環境は本書では扱わないので、利用に際してはそれぞれのマニュアルを参照してください。
オンライン環境では、Pillow がインストールされていたとしても、バージョンは古いのが通例です（2022 年 7 月 22 日現在、Google Colaboratory は 7.1.2、replit は 8.3.2 でした。どちらの環境でも win32api はインストールされていません）。

バージョン
対象は Python 3 です。マイナーバージョンは問いません。ただし、3.7 未満はサポートがすでに終了（End of life）しています。Python 2 も 2020 年 1 月に退役しています。

viii

Pillow は年に 4 回、1 月、4 月、7 月、10 月の月初めにアップデートされます。アップデート
されると、基本的にはマイナーバージョン（x.y.z の y の数字）が 1 つ繰り上がります。これまでの仕様（API）との互換性がなくなるとメジャーバージョン（x）の数字が繰り上がります。パッチリリース（z）はバグやセキュリティ上の問題が生じたときに不定期にリリースされます。
本書執筆時点の最新バージョンは 9.2.0（2022 年 7 月 1 日）です。本書は、バージョン 9 を対象としています。バージョン 9 の最初のリリースである 9.0.0 は 2022 年 1 月 3 日リリースなので、それ以前にインストールしているのなら、アップグレードを推奨します。
バージョン 9 内では、特に次の 2 点の変更点に注意が必要です。

定数の指定方式
Pillow 9.1.0（2022 年 4 月 1 日リリース）から定数の指定方法が変わりました。たとえば、

Image.NONE は Image.Dither.NONE に、Image.NEAREST は Image.Resampling.NEAREST となりました。

旧版で新しい定数を用いると、Attribute エラーが上がります。
>>> import PIL>>> from PIL import Image>>> PIL.__version__# 2022年2月13日の版>>> Image.NONE# 古い定数はある>>> Image.Dither.NONE# 新しいのはまだない'9.0.1'0

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "/home/foo/.local/lib/python3.8/site-packages/PIL/Image.py",line 65, in __getattr__

raise AttributeError(f"module '{__name__}' has no attribute '{name}'")AttributeError: module 'PIL.Image' has no attribute 'Dither'

逆に、最新版で古い定数を指定すると、DeprecationWarning が上がります。警告なので、値は得られ、スクリプト等は続行できます。
>>> import PIL>>> from PIL import Image>>> PIL.__version__# 2022年4月1日の版>>> Image.Dither.NONE# 新しい定数はある'9.1.0'ix

<Dither.NONE: 0>>>> Image.NONE# 古いのは警告<stdin>:1: DeprecationWarning: NONE is deprecated and will be removed0

in Pillow 10 (2023-07-01). Use Resampling.NEAREST or Dither.NONE instead.

定数の変更は、マニュアルの［Deprecations and removals］セクションの Constants の箇所に書かれています。
本書では、本文および関数定義では新しい記述方法を用います。スクリプトファイルやインタラ

クティブモードでの用例では、相互運用性を鑑みて直値（たとえば Image.Dither.NONE と Image.

NONE なら 0）を指定します。

フォントメトリックス関数
Pillow 9.2.0（2022 年 7 月 1 日リリース）から、フォントのサイズ等メトリックス関係の関数が一部非推奨となりました。たとえば、ImageFont.getsize() 関数は非推奨となったので、ImageFont.getbbox() または ImageFont.getlength() を使います。
>>> import PIL>>> PIL.__version__'9.2.0'# 2022年7月1日の版>>> from PIL import ImageFont>>> f = ImageFont.truetype('C:/Windows/Fonts/Arial.ttf', size=18)>>> f.getsize('Hello World')<stdin>:1: DeprecationWarning: getsize is deprecated and# 非推奨警告が上がる

will be removed in Pillow 10 (2023-07-01). Use getbbox or getlength instead.

(93, 17)>>> f.getbbox('Hello World')# こちらは使える>>> f.getlength('Hello World')# 同上(0, 4, 93, 17)92.71875

フォントメトリックス関数の変更は、マニュアルの［Deprecations and removals］セクションの Font size and offset methods の箇所に書かれています。

9.2.0 以前のバージョンでも ImageFont.getbbox() は利用できるので、本書ではそちらを使います。

xその他ライブラリ
他の画像関連ライブラリは Pillow との関連でのみ扱います。主として Numpy は第 4 章、その他は第 9 章で触れます。ただ、説明は最低限に留めているので、詳細は公式ドキュメントあるいは関連書籍を参照してください（付録 D）。
これらについてもバージョンは問いませんが、今からインストールするのなら最新版がお勧めです。

文字エンコーディング
Python のデフォルトエンコーディングはバージョン 3.0 から UTF-8 です（PEP 3120）。掲載したスクリプトファイルの文字エンコーディングも BOM（Byte Order Marker）なしの UTF-8 です。
Windows コマンドプロンプトのデフォルト文字エンコーディングは Shift-JIS なため、UTF-8 日

本語文字列を表示すると文字化けします。正しく表示させるには、chcp コマンドから、コマンド

プロンプトのコードページを Shift-JIS（932）から UTF-8（65001）に変更します。
C:\temp>chcp

現在のコード ページ: 932
C:\temp>chcp 65001

Active code page: 65001# Shift-JIS# UTF-8

コードページは Windows（もともとは IBM）の文字コーディングの管理方法で、上記のように文字エンコーディング名が数値に対応しています。コードページの一覧は次の Microsoft Docs から確認できます。
https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiersxiPillow の作者について
Pillow の保守管理者である Alex Clark はロックンローラーでもあるそうです。彼のミュージッ
クビデオは次の YouTube チャネルから視聴できます。
https://www.youtube.com/user/aclark4life

彼のブログはこちらです。
https://blog.aclark.net/

xii

目

次

目次

はじめに........................................................................................................... iii

第1章
1.1
1.2
1.3

1.4
1.5
1.6
1.7
1.8
1.9

第2章
2.1

2.2
2.3

用語............................................................. 1
画像の構成............................................................................................. 1
ピクセル値............................................................................................. 3
カラーピクセル..................................................................................... 5
1.3.1

RGB..............................................................................................................................5

1.3.2

HSV..............................................................................................................................6

1.3.3

CMYK..........................................................................................................................8

1.3.4

アルファ....................................................................................................................9

1.3.5

カラーパレット.................................................................................................... 10

バンド..................................................................................................12
モード..................................................................................................14
画像ファイルフォーマット.................................................................15
マスク画像...........................................................................................16
バウンディングボックス.....................................................................17
フレーム...............................................................................................19

画像ファイルの入出力.................................. 21
画像ファイルを開いて表示.................................................................21
2.1.1

画像ファイルを開く........................................................................................... 23

2.1.2

画像を表示............................................................................................................. 24

2.1.3

大きな画像............................................................................................................. 26

2.1.4

画像オブジェクトを閉じる............................................................................. 27

2.1.5

データの強制読み込み...................................................................................... 27

画像表示アプリケーションの変更......................................................28
画像ファイルフォーマット.................................................................32
2.3.1

画像ファイルリスト........................................................................................... 35

xiii

2.4

第3章
3.1
3.2
3.3
3.4
3.5

第4章
4.1
4.2

4.3

4.4

xiv

画像ファイルの保存............................................................................37
2.4.1

JPEG で保存.......................................................................................................... 38

2.4.2

JpegPresets........................................................................................................... 40

2.4.3

GIF で保存.............................................................................................................. 41

2.4.4

WebP で保存......................................................................................................... 43

2.4.5

GIF から WebP への変換.................................................................................. 44

2.4.6

画像ファイルフォーマット一括変換........................................................... 46

画像の属性 ................................................. 49
Image 属性.........................................................................................49
属性取得関数.......................................................................................51
統計情報...............................................................................................53
画像ヒストグラム................................................................................56
3.4.1

最頻値...................................................................................................................... 57

3.4.2

エントロピー........................................................................................................ 58

Exif......................................................................................................61
3.5.1

Exif を用いた画像回転...................................................................................... 65

画像の生成 ................................................. 69
新規生成...............................................................................................69
シーケンスと画像................................................................................71
4.2.1

バイトから画像.................................................................................................... 71

4.2.2

画像からバイト.................................................................................................... 76

4.2.3

シーケンスの取得............................................................................................... 77

4.2.4

シーケンスのセット........................................................................................... 79

Numpy と画像...................................................................................814.3.1

画像から Numpy................................................................................................. 81

4.3.2

Numpy から画像................................................................................................. 84

4.3.3

いろいろなパターン........................................................................................... 89

コピーとペースト................................................................................93
4.4.1

コピー...................................................................................................................... 93

4.4.2

矩形領域のコピー............................................................................................... 94

4.4.3

ペースト................................................................................................................. 96

4.4.4

マスキング............................................................................................................. 98

4.5

第5章
5.1

5.2

5.3

5.4

5.5

特殊関数............................................................................................ 101
4.5.1

グラデーション................................................................................................. 102

4.5.2

ガウスノイズ..................................................................................................... 103

4.5.3

マンデルブロ..................................................................................................... 108

色 ............................................................ 113
色の指定............................................................................................ 113
5.1.1

RGB........................................................................................................................ 114

5.1.2

色名対応表.......................................................................................................... 115

5.1.3

色名対応表拡張................................................................................................. 116

5.1.4

カラーチャート................................................................................................. 119

5.1.5

HSV........................................................................................................................ 122

5.1.6

CMYK.................................................................................................................... 123

5.1.7

RGBA..................................................................................................................... 124

5.1.8

色数....................................................................................................................... 126

カラーパレット................................................................................ 128
5.2.1

カラーパレット取得........................................................................................ 129

5.2.2

GIF の透過化...................................................................................................... 130

5.2.3

カラーパレットの変更................................................................................... 131

5.2.4

GIF への変換...................................................................................................... 138

色調補正............................................................................................ 140
5.3.1

モノクロ化.......................................................................................................... 140

5.3.2

反転....................................................................................................................... 141

5.3.3

画像調整.............................................................................................................. 142

5.3.4

ポスタリゼーション........................................................................................ 147

モード変換........................................................................................ 149
5.4.1

モノクロ変換..................................................................................................... 149

5.4.2

ディザ化.............................................................................................................. 150

5.4.3

カラー間変換..................................................................................................... 153

5.4.4

GIF への変換...................................................................................................... 154

5.4.5

RGBA との相互変換........................................................................................ 156

5.4.6

RGB の RGBA 化................................................................................................ 156

バンド単位の操作............................................................................. 158
5.5.1

バンド分解.......................................................................................................... 159

5.5.2

バンド抽出.......................................................................................................... 160

5.5.3

バンド合成.......................................................................................................... 161

5.5.4

ポスタリゼーション再訪.............................................................................. 164

xv

第6章
6.1
6.2
6.3
6.4

6.5

6.6
6.7

6.8

第7章
7.1

7.2

xvi

グラフィックス描画 ................................... 167
描画オブジェクト............................................................................. 168
点....................................................................................................... 169
線分................................................................................................... 171
6.3.1

線分....................................................................................................................... 171

6.3.2

折れ線................................................................................................................... 172

多角形............................................................................................... 173
6.4.1

長方形................................................................................................................... 173

6.4.2

正多角形.............................................................................................................. 175

6.4.3

多角形................................................................................................................... 176

6.4.4

回転図形.............................................................................................................. 177

円・楕円............................................................................................ 179
6.5.1

楕円....................................................................................................................... 179

6.5.2

円弧....................................................................................................................... 180

6.5.3

混色図................................................................................................................... 182

透過画像............................................................................................ 186
文字列............................................................................................... 187
6.7.1

デフォルトフォント........................................................................................ 188

6.7.2

TrueType フォント.......................................................................................... 188

6.7.3

テキストサイズ................................................................................................. 192

6.7.4

アンカー.............................................................................................................. 195

6.7.5

キネティックテキスト................................................................................... 198

まとめて描画.................................................................................... 200

画像処理 .................................................. 205
拡大縮小............................................................................................ 205
7.1.1

リサイズ.............................................................................................................. 206

7.1.2

再標本化方法..................................................................................................... 208

7.1.3

モザイク化.......................................................................................................... 211

7.1.4

アスペクト比保存リサイズ.......................................................................... 212

7.1.5

サムネイル.......................................................................................................... 214

回転、反転、アフィン変換.............................................................. 219
7.2.1

回転....................................................................................................................... 219

7.2.2

転置....................................................................................................................... 222

7.2.3

アフィン変換..................................................................................................... 225

7.2.4

7.3
7.4

第8章
8.1

8.2
8.3
8.4

8.5
8.6

第9章
9.1

9.2

はみ出しの折り返し........................................................................................ 228

ピクセル操作.................................................................................... 229
7.3.1

全体処理.............................................................................................................. 231

フィルタリング................................................................................ 235
7.4.1

畳み込み演算..................................................................................................... 236

7.4.2

フィルタ処理..................................................................................................... 237

7.4.3

ImageFilter のフィルタ行列........................................................................ 239

7.4.4

フィルタコンストラクタ.............................................................................. 241

7.4.5

自作フィルタ..................................................................................................... 246

7.4.6

爆裂効果.............................................................................................................. 249

画像の合成 ............................................... 251
画像の加算........................................................................................ 252
8.1.1

単純加算.............................................................................................................. 252

8.1.2

輝度補正付き加算............................................................................................ 255

8.1.3

2 色刷り............................................................................................................... 256

画像の差分........................................................................................ 258
画像の乗算........................................................................................ 261
特殊合成機能.................................................................................... 262
8.4.1

スクリーン.......................................................................................................... 262

8.4.2

オーバーレイとハードライト..................................................................... 264

8.4.3

ソフトライト..................................................................................................... 265

8.4.4

比較....................................................................................................................... 265

アルファ合成.................................................................................... 266
まとめ............................................................................................... 269

他ライブラリとの連携................................ 271
tkinter............................................................................................. 271
9.1.1

画像表示.............................................................................................................. 272

9.1.2

画像表示その 2................................................................................................. 276

9.1.3

Tk による画像の格子状の配列................................................................... 277

OpenCV.......................................................................................... 279
9.2.1

画像表示.............................................................................................................. 280

9.2.2

凝った画像処理................................................................................................. 281

9.2.3

日本語文字列の描画........................................................................................ 283

xvii

9.2.49.3

9.4

OpenCV の画像表示........................................................................................ 286

9.2.5

ビデオから GIF.................................................................................................. 287

9.2.6

GIF からビデオ.................................................................................................. 290

matplotlib...................................................................................... 293
9.3.1

グラフプロット................................................................................................. 293

9.3.2

Image 画像を matplotlib で開く................................................................ 297

9.3.3

ヒストグラムを描く........................................................................................ 299

Windows........................................................................................ 302
9.4.1

クリップボード................................................................................................. 302

9.4.2

スクリーンキャプチャ................................................................................... 303

9.4.3

ディスプレイサイズ........................................................................................ 304

付録............................................................... 307

付録 A

インストール................................................................................ 307

付録 B

Python Tips.............................................................................. 313

付録 C

使用画像....................................................................................... 331

付録 D

参考文献....................................................................................... 335

付録 E

関数リスト.................................................................................... 338

付録 F

サンプルスクリプトリスト.......................................................... 344

索  引 .......................................................................................................... 347

xviii

用 語

第1章

1

用語

本章では、画像関連の用語の定義を示します。
Pillow に固有な用語は、通常ならチャネル（channel）と呼ぶモノクロ画像の重なりをバンド（band）と言い換えている以外はほとんどないので、画像の扱いに慣れた読者は飛ばしても構いません。
用例は Pillow のクラスや関数から示します。これらの利用方法は第 2 章以降で順次取り上げるので、ここではそんな機能があるとだけ思って、コード部分は斜め読みしてください。

1.1 画像の構成
1 枚の画像を構成する 1 つ 1 つの点をピクセル（pixel）と言い、次の図のように横に W 個、縦に H 個が格子状に並びます。

1

1

用 語

図 1.1 ●画像の構成

横（列） - Wピクセル

高さ（行） - Hピクセル

P(0, 0)P(1, 0)P(W-1, 0)P(0, 1)P(1, 1)

P(W-1, 1)

W×H

P(0, H-1)

P(1, H-1)

P(W-1, H-1)

このとき、画像のサイズ（size）が W × H、あるいはタプルで (W, H) であると言います。
この格子状の画像座標系では、左上の隅が位置 (0, 0) で、横方向の x 軸は左から右に画像の横幅−1（W − 1）まで、縦方向の y 軸は上から下に高さ−1（H − 1）まで伸びています。座標系の個々のピクセルの位置は (x, y) のタプルで示されます。

Pillow の画像オブジェクト Image の横幅 W と高さ H は Image.width および Image.height 属性

から、サイズは Image.size 属性からそれぞれ取得できます（3.1 節）。
>>> from PIL import Image# Imageモジュールの導入>>> img.width# 横幅のピクセル数>>> img = Image.open('Goat.jpg')1280>>> img.height# 高さのピクセル数>>> img.size# タプル表記のサイズ

961(1280, 961)

2

# 画像を読む（モノクロ）

1.2 ピクセル値

画像処理では、数値計算モジュールである Numpy をしばしば使います（4.3 節）。格子状に並ん1だ数値の羅列である画像は、数学の行列で表現できるからです。ただ、行列では縦横の順序が画像と入れ替わるところには注意が必要です。画像では横幅が先で高さが続きます。これに対し、行列2ではその名称の通り行（縦方向）、続いて列（横方向）です。そのため、サイズが (1280, 961) の画像は、Numpy では (961, 1280) と表現されます。

3# 上記インタラクティブモードからの続き>>> import numpy as np# Numpyパッケージの導入

4>>> arr.shape# 行列のサイズを取得

5# 上記の画像を行列に変換>>> arr = np.array(img)# 縦横の順序が入れ替わる(961, 1280)

6

画像の回転などで用いる角度は、Pillow では角度（°）です。たとえば、π（3.14...）ではなく

7

180°
です。

8

角度の正負は関数によって異なります。関数定義から方向を確認してください。

910

1.2 ピクセル値
ピクセルには、色や明るさなどの情報を示す値が書き込まれています。これをピクセル値と言います。しばしば P(x, y) = z のように位置 (x, y) の関数として表記されます。z がピクセル値です。
ピクセル値は 0 から 255 の 8 ビット符号なし整数で表現されます。Pillow は 32 ビットの整数
あるいは浮動小数点数もサポートしていますが、本書では扱いません。
ピクセル値は、一般にそのピクセルの明るさ（光の強度）を示します。モノクロ画像なら、次の図に示すように 0 は黒（ブラックアウト）で、値が大きくなるにつれて明るく、つまり白っぽくなっていき、最大値の 255 に達したところで真っ白（ホワイトアウト）になります。
図 1.2 ●モノクロピクセルの値と明るさ

0

32

64

96

128

160

192

224

255

付 録

ピクセル値
明るさ

3

1

用 語

所定の位置のピクセル値は Image.getpixel() 関数で取得が、Image.putpixel() で上書きができます（7.3 節）。上書きすれば、そこの点だけ画像が変化します（画像の 1 ピクセルが変わっても見た目にはわかりませんが）。
# ...続き>>> img.getpixel((0, 0))# P(0, 0)の値を読む>>> img.putpixel((0, 0), 255)

# P(0, 0)を255で上書きする

0# ピクセル値は0

画像外側の位置の操作には IndexError エラーが上がります。たとえば、サイズ (1280, 961) の画像に対して、(2000, 1000) の位置を指定すると次のようにエラーとなります。
# ...続き# 画像の外側の位置(2000, 1000)からピクセル値を読み出そうとすると例外が上がる>>> img.getpixel((2000, 1000))

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "C:\tools\python3.10.2\lib\site-packages\PIL\Image.py",line 1411, in getpixel

return self.im.getpixel(xy)IndexError: image index out of range

ただし、ImageDraw モジュール（第 6 章）から利用する各種の描画関数は、範囲外に描画を試みてもエラーにはなりません。その代わり、範囲外の操作は無視されます。
# ...続き>>> from PIL import ImageDraw# ImageDrawのインポート>>> draw.line((0, 0, 2000, 1000), fill=255)# 範囲外に線を描く。エラーなし。

>>> draw = ImageDraw.Draw(img)4# 描画準備1.3 カラーピクセル

1.3 カラーピクセル

1

モノクロ画像のピクセルに割り当てられる数値は 1 つだけですが、カラー画像では 3 つの値が2

割り当てられます。P(x, y) の値はこのとき (r, g, b) のようにタプルで表現されます。

3

これら 3 つの値の解釈は用いるカラーモードで異なります。どのカラーモードで画像を表現していても、Pillow は画像オブジェクトを適切に表示できます。

4

以下、個々のカラーモードを説明します。

5

1.3.1 RGB6

RGB モードは最も一般的なカラーモードです。ピクセル値は (r, g, b) の 3 要素タプルで示され、1 番目の要素が赤の、2 番目が緑の、3 番目が青の明るさ（強度）をそれぞれ示します。モノクロ7

同様、値の範囲はいずれも 0 から 255 です。
# ...続き>>> img_color = Image.open('BlackCat.jpg')# カラー画像を読み込む(105, 100, 97)# 赤=105、緑=100、青=97>>> img_color.getpixel((0, 0))8# (0, 0)のピクセル値はタプル

910

それぞれの強度を示す赤、緑、青の値を混ぜれば、いろいろな色が表現できます。下図に示すよ
うに、赤と青を混ぜれば紫が、赤と緑を混ぜれば黄色が、全部混ぜれば白が得られます。混色のパターンは全部で 256 × 256 × 256 あるので、これで 16,777,216（約 1,600 万）色が表現できます。これを TrueColor と言います。
図 1.3 ● RGB の混色

付 録

5

1

用 語

Pillow の RGB モードでは、整数要素 3 つのタプル以外にも、HTML で用いる色名や #123456などの # で始まる 16 進数表記の文字列からも色を指定できます（5.1 節）。タプル表記と 16 進表
記は、次のようにリスト内包表記を使えば 1 行で交互に変換できます。

# 16進表記からタプル>>> html = '#F0F8FF'>>> tuple([int(html[i:i+2], 16) for i in range(1, len(html), 2)])
(240, 248, 255)

# タプルから16進表記>>> rgb = (240, 248, 255)>>> '#' + ''.join([f'{c:02X}' for c in rgb])'#F0F8FF'

リスト内包表記はループを簡潔に書けるのでとても便利です（付録 B.1）。

f'...' はフォーマット済み文字リテラルで、変数を含んだ文字列を生成する表記です（付録 B.2）。

1.3.2 HSV
HSV モードのピクセル値タプルは (h, s, v) です。1 番目の要素が色相（Hue）の円環上の角度を、
2 番目と 3 番目がそれぞれ彩度（Saturation）と値（Value）の割合を示します。
色相は、0°から 360°の角度で示されます。色の配分は下図に示すように、時計で 12 時に位置する 0°の赤から始まり、角度が進むにつれ橙、黄、緑、シアン（この辺で 180°）、青、紫と変遷し、360°
でもとの赤に戻ります。虹と同じ順番です。

6

1.3 カラーピクセル

図 1.4 ● HSV の色相

1
2
3
4
5

ただし、角度値は 0 ～ 255 にスケーリングされます。たとえば、180°のシアンはちょうど中間

6なので 127（255*180//360）です。

7

除算結果の小数点以下の切り捨ては int() もよいですが、整数除算の // もシンプル

8で素敵です（付録 B.3）。

9

彩度と値で用いられる割合は 0% ～ 100% の範囲ですが、こちらも 0 ～ 255 にスケーリングされます。たとえば、50% は 127 です。

10# ...続き# 彩度、値共に100%のシアンで全体を染めた100×100の画像を生成。
# この色はRGBモードでは(0, 255, 255)。

>>> img_RGB = Image.new('RGB', (100, 100), color='cyan')>>> img_RGB.getpixel((0, 0))(0, 255, 255)

# 上記をHSVに変換し、同じ位置のピクセル値を確認。
# (180°、100%、100%)は(127, 255, 255)になる。
>>> img_HSV = img.convert('HSV')>>> img_HSV.getpixel((0, 0))(127, 255, 255)

付 録

新規に画像を生成する Image.new() 関数は 4.1 節で、カラーモードを変換する Image.convert()

関数は 5.4 節でそれぞれ説明します。

7

1

用 語

色名は利用できません。名称に対応する RGB のタプルの並びを、そのまま HSV と解釈するからです。たとえば、シアンは RGB では (0, 255, 255) ですが、この並びを HSV で解釈すると色相が0°（つまり赤）、彩度と値が 100% でとても明るくて鮮やかという意味になります。
# ...続き# いきなりHSVを作成。色はCyanなので (0, 255, 255) のタプル>>> img_wrongcolor = Image.new('HSV', (100, 100), color='cyan')# H=0, S=255, V=255 は赤。試してください。
>>> img_wrongcolor.show()

1.3.3 CMYKCMYK モードのピクセル値のタプルは (c, m, y, k) の 4 要素です。それぞれ C（シアン）、M（マゼンタ）、Y（イエロー）、K（キー）です。値は RGB と同じく強度を示します。CMY がいずれも強度 0 なら白、すべて 255 なら黒が得られます（RGB と逆です）。
図 1.5 ● CMYK の混色

CMYK は実際にインクを混ぜる印刷関係で用いられます。カラープリンタのインクカートリッジにシアンとマゼンタと黄色と黒があるのは、CMYK カラーモデルを採用しているからです。理論上、C と M と Y の 3 要素をすべて混ぜれば、上図の 3 色の重なりが示すように漆黒が得られます。しかし、実際の印刷では、いろいろな絵の具を混ぜたとき同じように、汚い濃い色になるだけでピュアな黒にはなりません。そこで、黒の値だけは第 4 の色の K で表現するようになりました。
バーチャル世界のコンピュータグラフィックスの混色式には K が含まれていないため、RGB や
HSV から CMYK に変換しても、K バンドにデータは生成されません。

8

1.3 カラーピクセル# ...続き1# 1.3.1節のRGBカラー画像のimg_colorをCMYKに変換>>> img_cmyk = img_color.convert('CMYK')

2# CMYKのうちKだけを取り出し、その最小最大値を見る。

# どちらも0なので、すべてのデータが0ということがわかる。

3(0, 0)

4

上記の例で、カラー画像から K のデータだけを抜き出す Image.channel() 関数は 5.5.2 節で、画5>>> img_cmyk.getchannel('K').getextrema()

像からピクセルの最小値と最大値を取得する Image.getextrema() 関数は 3.3 節でそれぞれ説明し6ます。

グラフィックス的には、K は HSV の V と同じような働きをします。K が小さいほど色が明るく、7大きくなるにつれ次第に濃くなっていき、最後の 255 ではどんな色が指定されていても真っ黒になります（全体を黒インクで塗りつぶすから）。

8

1.3.4

アルファ

9

前景画像を背景画像に重畳したとき前景から背景が透けて見える透過画像には、前景画像に透過情報が備わっています。透過情報もピクセル単位なので、それだけで 1 色と同じ情報が必要です。

10

したがって、透過付きカラー画像のピクセル値 P(x, y) に割り当てられるタプルは、(r, g, b, a) のよ
うに 4 要素です。
# ...続き>>> img_alpha = Image.open('Smily-RGBA.png')# 透過PNGを読み込む# 4要素のタプルが得られる。

# 末尾の要素の値が0なので、位置(0, 0)のピクセルはもとが白でも完全に透過。
>>> img_alpha.getpixel((0, 0))(255, 255, 255, 0)

透過情報は一般にアルファチャネルと呼ばれますが、後述の事情から、Pillow の用語ではアルファ「バンド」となります。
付 録

値は透過の度合を割合から示します。最小値の 0% は完全な透過（下が完全に透けて見える）、
最大値の 100% が完全な不透過（下が完全に覆われる）です。値が大きいほど下が見えないので、

9

1

用 語

透過率（transparency）よりは不透過率（opacity）と言った方がしっくりくるでしょう。タプル
中の値は HSV の割合同様、0 から 255 にスケーリングされます。

1.3.5

カラーパレット

カラー画像は 1 ピクセルあたり (r, g, b) のように 3 要素、1 要素 1 バイトを占有するので、計 3バイトを消費するのが一般的です。画像全体分なら image.width * image.height * 3 バイトです。
GIF はこれとは異なる方法でピクセル値を管理することでデータ量をおよそ 2/3 に削減します。

これには、まず色 (r, g, b) とそれを指し示すインデックス番号のテーブルを用意します。そして、ピクセルには色そのものではなくこのインデックス番号を書き込みます。表示時にはインデックス
番号に対応する色を参照して描画します。
テーブルの例を示します。
表 1.1 ● GIF カラーパレットの例
番号色（RGB 順）0(2, 2, 2)

1(127, 129, 22)2(137, 137, 137)

︙

︙

254

(255, 245, 218)

255

(154, 154, 154)

インデックス番号は値 1 つだけ、1 ピクセルあたり 1 バイトしか使わないので、通常の 3 色 3バイトの 1/3 しかメモリを占有しません。その代わり、使える番号が 0 から 255 までなため、表現できる色が（どのような色の組み合わせでも構いませんが）最大 256 色に制限されます。
この「インデックス番号 = 色」の対応表をカラーパレット（color palette）と言います。他所ではカラーテーブル（color table）とも呼ばれます。GIF 以外では、PNG にもカラーパレットを用いるモードがあります（インデックス番号が 8 ビットものはしばしば PNG-8 と呼ばれます）。
Pillow にはカラーパレット操作の属性や関数がいくつか用意されています。これらを使えば、背景を透過にしたり、アルファバンドに頼らずとも背景色だけ入れ替えることができます（5.2節）。

10