第31回 (2015/7/11) MPS 定例ミーティング
Python で画像処理をやってみよう!
第1回 - ヒストグラムと濃度変換 -
金子純也
(Morning Project Samurai 代表)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
目次
• Morning Project Samurai (MPS) とは
• 画像認識とは
• ディジタル画像の基礎知識
• ヒストグラム
• 濃度変換
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
Morning Project Samurai (MPS)
• Morning

- 土曜の朝を有意義に
• Project

- プロジェクト指向
• Samurai

- 謙虚に学習

- プロジェクトをバッサバッサ

と斬りまくる
プロジェクト
リーダー
シップ
メンバー
シップ
成果
人脈
UP!
UP!
UP!
キャリア
知識・技術
UP!
UP!
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
これまでに行った活動
• 勉強会 (プレゼン)

- Webアプリの安全性について(XSS実習)

- コンピュータが動くメカニズム(論理回路基礎)

- プログラムテストについて

- JavaScript 入門 (実習)

- Python を用いた Youtube 動画リストの作成

(プログラム基礎、オブジェクト指向、サーバーからのデータ取得、

 ドキュメントの検索と読み方、UML基礎)

- Python で OAuth を使ってみよう!
• プロジェクト

- MPS HP

- ぶらさぼり(東京メトロオープンデータ活用コンテスト)

- 企業内研修講師

- 世田谷まちづくりファンド (MPS Setagaya 設立)

- エジソンカー作成
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ぶらサボり
(東京メトロオプンデータコンテスト出展作品)
Python + Django で開発
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
Be Active, Be Creative!!
MPS
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
目次
• Morning Project Samurai (MPS) とは
• 画像認識とは
• ディジタル画像の基礎知識
• ヒストグラム
• 濃度変換
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
目標
画像認識 (+α) を用いて

ミニチュア半自立運転車を作る!
(MPS Setagaya のイベントでの発表を目標)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
画像認識 (Image Recognition)
Recognition:

The act of accepting that something is true or
important or that it exists
(出典: http://www.merriam-webster.com/)




物事の真偽や重要性、またはその存在を認める行動


Image Recognition:
画像や画像中にあるものが
一体何を意味しているかを理解する
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
画像認識の流れ
サンプリング 前処理 認識
濃度調整
ひずみ補正
雑音除去
etc.
特徴

抽出
エッジ検出
線分検出
領域分割
etc.
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
必要となる (学べる) 知識と技術
• コンピュータ内での基本的な画像の扱い方
• 数学 

(行列演算、フーリエ変換、etc.)
• パターン認識、学習アルゴリズム 

(ニューラルネット、ベイジアンネットワーク、etc.)
• 上記を統合して実際にプログラミングできる技術
(コンピュータサイエンスに所属する大学3年生程度の知識)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
画像認識の流れ
サンプリング 前処理 認識
濃度調整
ひずみ補正
雑音除去
etc.
特徴

抽出
エッジ検出
線分検出
領域分割
etc.
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
必要となる (学べる) 知識と技術
• コンピュータ内での基本的な画像の扱い方
• 数学 

(フーリエ変換、行列による座標変換、etc.)
• 学習アルゴリズム 

(ニューラルネット、ベイジアンネットワーク、etc.)
• 上記を統合して実際にプログラミングできる技術
(コンピュータサイエンスに所属する大学3年生程度の知識)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用するライブラリ
• Pillow
• OpenCV
• numpy
• matplotlib
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
目次
• Morning Project Samurai (MPS) とは
• 画像認識とは
• ディジタル画像の基礎知識
• ヒストグラム
• 濃度変換
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ディジタル画像
ピクセル

(r, g, b) = (255, 0, 0)
ピクセルの集合で表現される画像
- ピクセルは離散点
- 各ピクセルにおけるカラーや濃淡の情報も離散値
ピクセル

(r, g, b) = (255, 255, 255)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
配列による画像の表現
多くの場合、画像は配列で表現される
例: 2D画像の2次元配列表現
(0, 0) (12, 0)
(12, 12)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
カラーモデルによる色の表現
• RGB :

- 適切に選ばれた3つの原刺激の組みで表現

- コンピュータが主に使用
• HSV:

- (色相, 彩度, 明度) の組みで表現

- 人間が色を選ぶときに直感的に使いやすい
• YCbCr:

- 明度と色差の組みで表現

- ビデオやストリーミングで主に使用

- 人間の視覚特性に注目した効率の良い表現方法
(参考: http://cs.brown.edu/courses/cs092/VA10/HTML/ColorModels.html)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
RGB カラーモデルの原理
• 適切な3色を選べば、その混色で任意の色が表現
可能であることに基づく
• S = RR0 + GG0 + BB0



S: 任意の色

R0, G0, B0: 原刺激

R, G, B: 重み
• 色空間: (R, G, B) の組みで表される3次元空間
(出典: https://msdn.microsoft.com/)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ピクセルとその情報を

Python で取得してみよう! (下準備編)
• Pillow のインストール

pip install Pillow または pip3 install Pillow
• プログラムを置くフォルダを1つ作成
• JPEG 画像を1つ上で作成したフォルダに用意
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ピクセルとその情報を
Pythonで取得してみよう! (実装編)
# 画像を表現するクラスをロード

from PIL import Image
# 画像 sample.jpg をオープン
img = Image.open(‘sample.jpg’)
# ピクセル情報を取り出し
pxls = img.load()
# 座標 (1,1) のピクセルの色情報を取得し表示
print(pxls[1, 1])
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
練習問題
用意したJPEG画像の適当な位置から
100 * 100 ピクセル の正方形領域を
黒で塗りつぶして、結果を保存してみよう。

ヒント:
- ピクセル情報の更新: pxls[i, j] = (r, g, b)
- 画像の保存: img.save(‘filename.jpg’)
- 公式ドキュメント: pillow.readthedocs.org
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
目次
• Morning Project Samurai (MPS) とは
• 画像認識とは
• ディジタル画像の基礎知識
• ヒストグラム
• 濃度変換
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ヒストグラム
• 画像を濃度値の頻度分布という観点から見る

- 各濃度値に対し同じ値を持つピクセルを計数
• 空間情報は失われる

- 同じヒストグラムを持つ異なる画像が存在
Rが200であるピクセルが
画像全体に占める割合
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
比べてみよう! (問題編)
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
削除
比べてみよう! (回答編)
• 露出不足の画像はヒストグラムが左より
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ヒストグラムを作ってみよう!
(前準備: matplotlib)
pip install matplotlib
または
pip3 install matplotlib
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ランダムに生成された0から5までの整数
1000個の列のヒストグラムを描画
import matplotlib.pyplot as plt
import random
rnums = [random.randint(0, 4) for i in range(0, 1000)]
rand_hist = [0] * 5
for i in range(0, 1000):
rand_hist[rnums[i]] += 1
rand_hist = [i/1000 for i in rand_hist]
plt.bar(range(0, 5), rand_hist, 1, color="blue")
plt.show()
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
ヒストグラムを作ってみよう!
(実装編)
ヒント:
Rに関するヒストグラムは、
Rが i であるピクセルの数 x を
画像の全ピクセル数で割って正規化し、
それらを i が小さいものから並べたリスト。
ここで、 i は 0 から 255 の値をとる。
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
目次
• Morning Project Samurai (MPS) とは
• 画像認識とは
• ディジタル画像の基礎知識
• ヒストグラム
• 濃度変換
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
画像を見やすくする方法を
考えてみよう! (問題編)
使用している濃度レンジ
使用可能な濃度レンジ
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
画像を見やすくする方法を
考えてみよう! (回答編)
使用する濃度レンジを拡大すると
コントラストが強調されて見やすくなるのでは?第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を考える!
Q. ところで関数ってどんなもの?
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を考える!
Q. ところで関数ってどんなもの?
A. ある入力に対して1つ値が定まるもの
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
a
b
(参考: [1])
拡大前濃度
拡大後濃度
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
a
b
(参考: [1])
拡大前濃度
拡大後濃度
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
0
255
(参考: [1])
拡大前濃度
拡大後濃度
今回は
0から255
に拡大
この折れ線を
プログラムで
表現できれば良い
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
0
255
(参考: [1])
拡大前濃度
拡大後濃度
今回は
0から255
に拡大 ①
② ③
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
0
255
(参考: [1])
拡大前濃度
拡大後濃度
今回は
0から255
に拡大 ①
② ③
①②③
はそれぞれ直線!
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
0
255
(参考: [1])
拡大前濃度
拡大後濃度
今回は
0から255
に拡大 ①
② ③
①②③
はそれぞれ直線!
一次式
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
0
255
(参考: [1])
拡大前濃度
拡大後濃度
今回は
0から255
に拡大 ①
② ③
①②③
はそれぞれ直線!
一次式
プログラムで
記述可能
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
使用濃度レンジを拡大する関数を
デザインする
c d
0
255
(参考: [1])
拡大前濃度 (x)
拡大後濃度 (y)
x < c のとき
y = 0
b-a
d-c x >= d のとき
y = 255
(x-c)
c <= x < dのとき
y=
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
実行結果
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko
参考図書
1. 田村 秀行: コンピュータ画像処理. オーム社. 2002.
2. P.H.リンゼイ: 情報処理心理学入門1 感覚と知覚. 

サイエンス社. 1983.
3. Richard Szeliski : Computer Vision: Algorithms and
Applications. Springer. 2010.
第30回 MPS ミーティング資料 (2015/07/11) (c) Junya Kaneko

Pythonで画像処理をやってみよう! 第1回 - ヒストグラムと濃度変換 -