
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜〜〜

マイケル
今日はPythonの Pillow というライブラリを使って
いろんな画像フィルタをかけてみるよ!
いろんな画像フィルタをかけてみるよ!

エレキベア
画像フィルタって何クマ??

マイケル
たとえばこのエレキベアを…

マイケル
グレーにしたり

マイケル
モザイクをかけたり

マイケル
いろいろな効果をかけることなんだ!

エレキベア
(人の画像で遊ぶなクマ・・・)
なるほどクマ
ペイントソフトとかでかけれるやつ クマね
なるほどクマ
ペイントソフトとかでかけれるやつ クマね

マイケル
Photoshop等ペイントソフトでかけるフィルタも、
内部で変換する処理を行なっている からね!
内部で変換する処理を行なっている からね!

マイケル
今回はその画像フィルタの中でも、簡単でスタンダードな
・ネガポジ反転
・グレースケール
・エッジ検出
・モザイク
の処理を実装していくよ!
・ネガポジ反転
・グレースケール
・エッジ検出
・モザイク
の処理を実装していくよ!

エレキベア
それは楽しみクマ〜〜〜〜
参考書籍

マイケル
今回、画像フィルタの実装をするにあたって
参考にした参考書はこちらになります!
参考にした参考書はこちらになります!

マイケル
この本ではJavaScriptでの実装ですが、
数学理論等、グラフィックス描画の基礎から書かれているので
読んでるだけでも勉強になります!
数学理論等、グラフィックス描画の基礎から書かれているので
読んでるだけでも勉強になります!

エレキベア
表紙もかわいいクマね
読んでみるクマ
読んでみるクマ

マイケル
画像フィルタの話はおまけで載っているレベルだったけど、
目から鱗の内容でした!
目から鱗の内容でした!
ピクセルとは

マイケル
画像フィルタの実装に入る前に、ピクセルについて理解しておこう!

エレキベア
ピクセルって何クマ??

マイケル
説明しよう!
ピクセルとは
- コンピュータで画像を扱う際の、色の最小単位 のことである!

エレキベア
色の最小単位クマ?

マイケル
その通り!
例えば下のイルカの画像では、青や赤といった色をピクセル単位で表示しているんだ!
例えば下のイルカの画像では、青や赤といった色をピクセル単位で表示しているんだ!
↑イルカの画像(20px * 20px)

エレキベア
(イルカ・・・・???)

マイケル
よくみる画像サイズの「px」は、言い換えれば縦横のピクセル数のことなんだね

エレキベア
なるほどクマ
画像は全てピクセル単位で色を表示しているクマね
画像は全てピクセル単位で色を表示しているクマね

マイケル
今回行う画像フィルタは、ピクセル単位で色を取得して変換 という流れで処理を行うよ!
ピクセルの概念は基本になるので覚えておきましょう!
ピクセルの概念は基本になるので覚えておきましょう!

エレキベア
楽しみクマ〜〜〜〜
画像フィルタの実装

マイケル
それじゃ早速実装してみよう!
今回画像フィルタを行う対象は、ラーメン豚山のラーメン画像です!
今回画像フィルタを行う対象は、ラーメン豚山のラーメン画像です!
↑ラーメン豚山はとてもおいしい

エレキベア
(なんでこれを選んだクマ・・・)
全体の処理

マイケル
フィルタ4種類を全て実装したソースは以下になります!
image_filter()メソッドにフィルタの種類を渡して変換する 処理にしています!
image_filter()メソッドにフィルタの種類を渡して変換する 処理にしています!

エレキベア
「画像フィルタ処理」の部分で変換しているクマね

マイケル
その通り!
一つ一つ内容を見ていこう!
一つ一つ内容を見ていこう!
ネガポジ反転

マイケル
まずはネガポジ反転!
名前の通り色を反転させるフィルタで、かけた結果は以下のようになるよ!
名前の通り色を反転させるフィルタで、かけた結果は以下のようになるよ!
↑ネガポジ反転後のラーメン

エレキベア
(まずそうクマ・・・。)

マイケル
処理の流れとしては、
1. 画像からRGBAとサイズ(縦横のピクセル数)を取得
2. 「255からRGB値を引いて設定し直す」処理をピクセル分繰り返す
となっています!
1. 画像からRGBAとサイズ(縦横のピクセル数)を取得
2. 「255からRGB値を引いて設定し直す」処理をピクセル分繰り返す
となっています!

マイケル
RGB値は0〜255で表されるから255から引くことで反転できる、ということだね!
↑RGB値は0〜255で表すことができる

エレキベア
ピクセル一つ一つに対して反転処理を行うクマね
グレースケール

マイケル
そして2つ目はグレースケール!
これも名前の通り、モノトーン色のみにするフィルタだね!
これも名前の通り、モノトーン色のみにするフィルタだね!
↑グレースケール後のラーメン

エレキベア
(なんか悲しいクマ・・・。)

マイケル
ラーメンが泣いている・・・!

マイケル
どういう時に白黒になるかというと、
実はRGB値が全て同じ値の時に白黒になるんだ!
実はRGB値が全て同じ値の時に白黒になるんだ!
↑RGB値が同一の場合に白黒になる

エレキベア
それは知らなかったクマ

マイケル
これを利用して、RGBの合計値を3で割ることで平均値を設定してあげます!

マイケル
これだけでグレースケール化することができます!

エレキベア
こんな簡単にできるクマね
感動クマ・・・。
感動クマ・・・。
エッジ検出

マイケル
そして3つ目はエッジ検出!
これはラプラシアンフィルターを使用して色の差分が大きい箇所のみ目立たせることで処理できるよ!
これはラプラシアンフィルターを使用して色の差分が大きい箇所のみ目立たせることで処理できるよ!
↑エッジ検出後のラーメン

エレキベア
これは難しそうクマ・・・。
どうやるクマ??
どうやるクマ??

マイケル
これは対象ピクセルの色と周りのピクセルの色に差分があるかをチェックすることで処理するよ!

マイケル
上の図のように、周りのピクセル(上下左右)の色の合計から中央ピクセルの色を4倍した値を引いた差分を設定するんだ!
その結果、差分が大きいほど白色に近い値になるから強調されるということだね!
その結果、差分が大きいほど白色に近い値になるから強調されるということだね!

エレキベア
なるほどクマ・・・!
こんな方法でエッジ検出していたクマね
こんな方法でエッジ検出していたクマね

マイケル
ちなみに上下左右の4ピクセルのチェックを行う方法は4近傍法といって、
斜めも含めた8ピクセルをチェックする8近傍法という方法もあるよ!
斜めも含めた8ピクセルをチェックする8近傍法という方法もあるよ!

エレキベア
処理の負荷と精度の考慮が必要ということクマね
モザイク

マイケル
そして最後はモザイク!
これは分かりやすくモザイクです!
これは分かりやすくモザイクです!
↑モザイク後のラーメン

エレキベア
モザイククマ

マイケル
これは、モザイクにするブロック数をあらかじめ決めておいて、
そのブロック範囲を全て同じ色で塗りつぶすことで実現できるよ!
そのブロック範囲を全て同じ色で塗りつぶすことで実現できるよ!

エレキベア
これは割と分かりやすいクマね

マイケル
ブロック数で割った結果をインデックスとして扱う、というシンプルな処理だね!
モザイクはよく使いそうだから覚えておいて損はなさそうだ!
モザイクはよく使いそうだから覚えておいて損はなさそうだ!
おわりに

マイケル
というわけで4種類の画像フィルタの実装について紹介しました!
どうだったかな?
どうだったかな?

エレキベア
いつも使うフィルタの実装内容が分かって楽しかったクマ〜〜〜〜

マイケル
画像フィルタはまだまだたくさんある!
興味をもったらぜひ他のフィルタの実装方法も調べてみましょう!
興味をもったらぜひ他のフィルタの実装方法も調べてみましょう!

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜〜〜〜〜〜
【Python】Pillowを使ってピクセル操作!画像フィルタをかけてみる 〜完〜