狠狠撸

狠狠撸Share a Scribd company logo
「画像処理基础」
九州大学 大学院システム情報科学研究院
情報知能工学部門
データサイエンス実践特別講座
備瀬竜馬,Diego Thomas, 末廣 大貴
画像解析概要
画像データ解析の流れ 2
画像データ
(画像空間)
いろいろな画像
4
画像データは意味を持つか?
●画像はあくまでピクセルごとの輝度値情報のみ
意味情報
着物を着た日本人女性が、三味線を弾いている
江戸時代の絵?
The flow of analysis
●データから情報を取り出し、情報から知識へ
データからの情報の抽出
●ピクセルの数値情報でしかない画像から、人は様々な情報
を抽出できる
●どんな色が多い?
●エッジはどこにある?
●人はどこにいる?
●建物はどこにある?
Look into histograms
2値画像,濃淡画像,カラー画像
8
カラー画像
9
R成分 G成分 B成分
= + +
デジタル画像
10
規則的に並んだ
有限個の点(画素)の集合
各画素の色は、
赤、緑、青の3つの成分で
表現されている
+ +
R成分 G成分 B成分
0~255 0~255 0~255
画像の走査(スキャン)
●ラスタ走査 (raster scan)
すべての画素を1回ずつ通過
11
スタート
ゴール
ラスタ走査 (つづき)
●画像のベクトル表現
画素値をラスタ走査順に列挙
●任意の画像=XY次元空間内の1点
12
? ?YXyxY fffff ,,,,, ,,,,,,, ??? 12111
次元ベクトルXY
画像のベクトル表現(vector representation of image)
●2値画像画像の場合の例
●多値画像画像の場合の例
13
? ?T
x 0,1,...,1,0,0,1,1,1,1,0,0?
? ?T
x 0,...,0,0,182,213,255,0,0?
49次元ベクトル
49次元ベクトル
7×7画像
7×7画像
“画像空間” (image space)
14
スタート
ゴールN×N画像 (17, 128, 72, ....., 153)
N2次元ベクトル
第1画素の明るさ
第2画素
第N2画素
17
128
72
画像空間:任意の1点=1画像
15
第1次元
x
A point in the image space corresponds to an image
画像空間
16
第1画素
第10000画素
100x100画像
任意の100x100画像は10000次元空間で表せる!
画像データ
●カラー画像データは、ピクセルごとにRGBの3つ
のチャンネルの数字の組み合わせ
●n 行 m 列の画像: ? × ? ピクセルの数値
●カラー画像:1つのピクセルは3つのチャンネルの数値を持つ
● red, green, blue.
●例:100×100のカラー画像
?3×100×100=30000の次元のベクトル
pixel = [red, green, blue]
n
m
演習1
●Numpyをインポートする
●ラスタ走査を使って “2”の画像をベクトルにする
白ピクセル=0。青ピクセル=255
●numpy.array を使ってデータ変換する
●Reshape を使ってベクトルから7x7の行列を求める
●7x7の行列をプリントする
画像解析に便利なライブラリ
OpenCV / scikit-image 19
OpenCV
●http://opencv.org
●CV = “Computer Vision”
●様々な画像解析ライブラリ(関数群)が提供され
ている
●Python用にライブラリが整備されている
●注)アナコンダにはデフォルトでは入っていないため、
インストールが別途必要。
If interested, try at home ?
http://docs.opencv.org/3.0-
beta/doc/py_tutorials/py_tutorials.html
scikit-image
●Python用画像処理ライブラリ
●Numpy arraysを利用
●グレースケール画像は2次元配列(array)で表現
●http://scikit-image.org
参考: http://www.scipy-lectures.org/packages/scikit-image/
データの取得
●skimage.dataに予め用意されている画像を読み込み
●ファイルから画像を読み込み:skimage.io.imread()
画像の可視化
●画像の表示:skimage.io.imshow()
●画像サイズ
●輝度値の最大、最小、平均
( )
( )
( )
( )
( )
演習2
●skimage から io をインポートする
●“coffee.tiff” を読み込んで、可視化する
●‘pwd’ to make sure your working directory contains
the file “coffee.tiff”
●画像のサイズとピクセルの寸法を求める
画像と配列,画素レベルの処理
画像データ構造,動画,閾値処理 25
画素値へのアクセス
●画素値へのアクセス
“moon” は 4 つの値を持つ! :red, green, blue, alpha (透過度)
200
100
( )
( )
( )
画素値へのアクセス
●(0,0) :画像の左上
※)pythonでは、0から始まる
Image type coordinates
2D grayscale (row, col)
2D multichannel
(RGB)
(row, col, ch)
3D grayscale (pln, row, col)
3D multichannel (pln, row, col, ch)
row : 列
col : 行
0
0
カラー画像
●1画素につき、(Red,Green,Blue)の3チャンネルの数値
●データ名.shape を使って確認しよう
●それぞれのチャンネルに、0 から 255 までの値が入っている
●例:赤(255, 0, 0)
●Pythonで, それぞれのチャンネルにアクセスするには
[row, col, 0 or 1 or 2]
Red Green Blue
カラー画像?グレースケール画像変換
●(red, green, blue)? gray value
●画像変換:rgb2gray
Input color image Output gray image
Non-uniform weighting
●rgb2gray()で変換する際に、チャンネルごとの重みは異なる
●人の目で敏感に感知できる色は異なるため
red と green で同じ値(255)で入力しても返還後の値は異なる
画像の反転
●画像の反転:各画素の値を255から引く
●元の画素値が??? のとき、反転画像の同じ画素の値:255 ? ???
●complementary imageとも呼ばれる
●skimage.util.invert() を利用!
コントラスト強調
●画素値: (一般的には)0 ~ 255 を取りうる
●実際には、その中の狭い範囲にしか値がない画像も多い
●下記の画像では [50, 100]の値しかない
●コントラストが低い
●skimage.exposure :画像のコントラストを強調(利用する画素
値の幅を広める)する関数が提供されている
コントラスト強調手法
●ガンマ補正
●暗い画素を持ち上げる(明るくする)
●輝度ヒストグラムを用いたコントラスト補正
●輝度の分布を用いて、輝度値を補正し、コントラストを強調
●線形濃度変換
●輝度値の分布範囲を[0, 255]に広げる
Histogram equalization
● “Histogram_Equalization.py” を利用
Source: http://scikit-image.org/docs/stable/auto_examples/color_exposure/plot_equalize.html#sphx-glr-
auto-examples-color-exposure-plot-equalize-py
Output images
輝度値のヒストグラム
輝度範囲: [0: 1]
red curve :輝度の積算
元画像 線形変換 ヒストグラム
均一化
ヒストグラム
適応均一化
演習3
●skimage から data をインポートする
●“chealsea"を読み込んで、 red channel > 160 となっている画
素を green [0, 255, 0]に上書きして、表示
●Note on data type
Data type Range
uint8 0 to 255
uint16 0 to 65535
uint32 0 to 232
float -1 to 1 or 0 to 1
int8 -128 to 127
int16 -32768 to 32767
int32 -231 to 231 - 1
reddish = cat[:, :, 0] > 160
cat = data.chelsea() # load the cat image
画素レベルの処理
Segmentation 36
セグメンテーション
●ピクセルごとに背景か前景かをラベル付け
元画像 セグメンテーション画像
1
1
11
1
1
1
1
11
1
11
11
1
11
11
11
11
1
0 0 0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 00
0
0
0
ピクセル
前景:1
背景:0
Load the coin image
●skimage.data
閾値によるセグメンテーション
●閾値法:画素が閾値より高ければ前景、低ければ背景
●Example:
閾値:100 閾値:150
2値化の手がかり:ヒストグラム
黒(0) 白(256)
画素数
どうもこの辺が
「背景」?
2値化の手がかり:ヒストグラム
黒(0) 白(256)
画素数
どこに
「しきい値」
(threshold)
を設定?
モード法
●ヒストグラムの谷=しきい値
42
黒(0)
画素数
白(255)
大津の二値化
●最適しきい値を決定
黒 白
分散A 分散B
左部分の
平均
右部分の
平均
分散C
分散A 分散B
分散C
+
評価基準
これを最大化
するように
しきい値を
決定
閾値の限界
●輝度値の分布が、前景と背景で必ずしもきれいに分かれているとは
限らない
●背景でも、前景より輝度値が高い画素(もしくはその逆)が存在
●高すぎる閾値は、前景を取り逃し、低すぎる閾値は多めに前景を抽
出してしまう
Edge-based segmentation
●エッジ:近隣のピクセル間の輝度変化量(輝度勾配)が強いところ
●エッジが強い部分を抽出
●The Canny edge detector of skimage.feature.canny
コインの境界領域のエッジ
がほとんど抽出できている
Filling the holes
●エッジ抽出によりコインの境界が抽出できた
●境界の内側をぬりつぶすことで、コインの領域を抽出
●ndi.binary_fill_holes()を利用
エッジで囲えていないコインは抽
出に失敗.
连结成分解析
连结成分解析
●連結成分=黒画素(もしくは白画素)の「塊」
●4連結と8連結
4连结だと何个の连结成分?8连结では?
Removing small objects
●ラベリングされた小さなオブジェクトは間違って抽出された可能性が高いので、大きさ
をチェックして小さければ、削除
●ndi.label function を利用
エッジ抽出に失敗した
部分は、うまくコイン
を抽出できていない
フィルタリング
51
何かしらの
計算結果
画像の全画素に
ついて計算
最も基本的なフィルタ:平滑化
●単純化した例
52
フィルタ
マスク
原信号
13 3 33 3 00 1 03 0
1/31/3 1/3
2.3
2.3
1/31/3 1/3
2.3
1/31/3 1/3
1
1/31/3 1/3
3
1/31/3 1/3
2
1/31/3 1/3
1.3
1/31/3 1/3
0.3
1/31/3 1/3
1.3
1/31/3 1/3
1.3
1/31/3 1/3
最も基本的なフィルタ:平滑化
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
53
平滑化用
フィルタマスク
(3x3)
10 10 10
10 20 10
10 10 10
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
10 10 10
10 11 10
10 10 10
内積
マスク原画像平滑化後
最も基本的なフィルタ:平滑化
54
平滑化用のフィルタマスク
55http://codezine.jp/article/detail/129
7.1 フィルタリングとは
●画像上の各画素を中心とした局所領域で何らかの計算
●画質改善や特徴抽出を目的
56
基本的なフィルタ:エッジ検出
●単純化した例
57
フィルタ
マスク
原信号
33 3 33 3 00 0 00 0
-1/2-1/2 1
0 0 0 0
3/2
-3/2
0 0 0 0 0
基本的なフィルタ:エッジ検出
58
Painting images with labels
●一まとまりの領域ごとにID(label)をつける
●ndi.label
Visualize results (1)
●label2rgb() でラベルごとに独立した色を与えて可视化.
Visualize results (2)
●オブジェクトの境界を可視化
●skimage.morphology.erosion
Exercices
62
演習 1
●“camera"画像を読み込み、下図のように円状(中心:画像の中
心、半径R:画像の縦横のサイズの半分)の外の画素値を全て0と
するプログラム
円の方程式
?, ? ? ? ??
2
+ ? ? ??
2
< ?2
)},
※)
(?, ?) :ピクセルの座標
(??, ??) :円の中心座標
? :円の半径
Answer
●Indexing with sets of indices
演習 2 (thresholding)
●”camera”画像の呼び出し
●輝度値のヒストグラム可視化
●複数の閾値を用いて、セグメンテーションの結果を比べよう!
●ヒント:
●skimage.data.camera()
●numpy.histogram()
演習 3 (downsampling)
●“atronaut” 画像を読み込み, 画像を2分の1のサイズにダウンサンプリン
グしよ
●周辺の画素の平均値を求めて、新画像の1画素の値にする
●ヒント
●float型に変換してデータを取得
?image = data.astronaut().astype(float)
●行と列の数の取得
?nrows, ncols, _ = image.shape (color image は 3次元)
●unsigned int8 型に戻す
?io.imshow(result.astype(np.uint8))
演習 4 (image stiching)
●4つの画像(im1.tiff, im2.tiff, im3.tiff, im4.tiff)を読み込んで、つな
げることで一つの画像を作って、保存しよう!
●ヒント:
●画像の読み込み: io.imread
●画像の大きさ:shape attribute
●画像の初期化: numpy.zero (specify np.uint8 for the type
to show nice results)
●画像の保存 io.imsave
演習 5
●“atronaut” 画像を読み込み、RGB成分それぞれの画像を表示し
てみよう
●ヒント:
●image = data.astronaut()
●image.simage.shape: (512L, 512L, 3L)
演習 6
●“atronaut” 画像を読み込み、円状(中心:画像の中心、半径
R:画像の縦横のサイズの半分)の外の画素値を全て0とするプログ
ラム
●ヒント:
●26ページのカラーバージョン
演習 7
●“LENNA.bmp” を読み込み、sobel filter でエッジ抽出してみよう
●ヒント:
●60ページ
演習 8
●“coins”画像を読み込み、色んなコントラスト強調を試してみよう
●ヒント:
●from skimage import data, io
●coins = data.coins()
●36ページ
演習9
●“Text.bmp”を読み込み、テキスト領域を閾値を用いてセグメンテー
ションせよ
●領域ごとにラベリングを行って、領域ごとに色をつけよ
●ヒント:
●平滑化してから、輝度値で閾値処理
●他の領域を含んでいてもO.K.
演習 10
●“Text.bmp”を読み込み、テキスト領域をwatershedを用いてセグメン
テーション
●ヒント:
●Sobel filter を用いてelevation_mapを作成
●マーカー領域は、閾値でラフ(明らかに輝度が高い領域を抽出)に抽出
●from skimage.morphology import watershed
●他の領域を含んでいてもO.K.

More Related Content

画像処理基础