画像処理・実習 第一回:

画像処理・実習
第四回: 濃度変換(ヒストグラム平坦化),
空間フィルタ(平滑化)
東海大学
情報理工学部情報メディア学科
濱本和彦
今回の内容
課題解説
前回の続き

濃度変換(ヒストグラム平坦化)
2. 空間フィルタ


3.1 空間フィルタリングの手法
3.2 平滑化フィルタ




実習
平均値フィルタ
加重平均フィルタ(ガウシアンフィルタ)
メディアンフィルタ
エッジを保持した平滑化フィルタ
出力画像の濃度値
課題解説
255
128
128
2

 z 
2 z m  

 zm 
z'  
2 z  zm
 z m 
 2 1 
zm


255
zm 

0  z  
2 





 zm


z

z

m
 2

原画像の濃度値
• 導出過程?
• プログラム?→ imggrayc2.hで確認
• 実行結果?
• ヒストグラム?
課題解説
1000
800
600
400
200
0
0
100
200
なぜこのような
ヒストグラムになるのか?
課題解説
•暗いレベル(変換
曲線の変化の割
合が1以下)は,
より暗くなる。隙
間発生無し。
出
力
C
B
A
頻度
頻度
入力
2000
A
B
A
C
B
C
1000
1000
0
0
2000
•明るいレベル(同
上)は,より明る
くなる。隙間発生
無し。
100
入力
0
0
200
階調数
100
200
出力
階調数
•中間レベルは
引き延ばされる
(隙間が発生)
コントラストの改善(復習)
非線形な濃度変換
非線形な濃度変換
変換式が二次関数や対数を含む。
 変換曲線が直線では表せない。
出力画像の濃度値

255
 z 
z '  zm  
 zm 
0
255
原画像の濃度値
画像全体を暗くする場合
2
non_Linear_Transformの結果(復習)
式2.2,図2.5(a)
255
2000
2000
1000
1000
0
0
頻度
頻度
255
100
0
0
200
階調数
100
200
階調数
コントラストの改善(復習)
非線形な濃度変換
演習2.3(図2.5(b)について)
変換式を作りなさい。
出力画像の濃度値

255
z '  zm  z
255
原画像の濃度値
画像全体を明るくする場合
Ensyu2_3bの結果(復習)
演習2.3(図2.5(b))
2000
255
1000
0
0
頻度
頻度
255
2000
1000
100
0
0
200
階調数
100
200
階調数
濃度変換
ヒストグラムの平坦化
変換曲線による濃度変換


パラメータの決定方法をどうするか?
すべての濃度値を有効利用していない(ヒストグラム
の隙間問題)=濃淡が滑らかに変化しない,不自然
ヒストグラムの平坦化




全ての濃度値の画素数を同じ数に変更する(濃度レ
ンジの有効利用=隣接画素で滑らかに濃淡変化)
連続的に濃度が変化する,違和感のないコントラスト
改善が可能
まず,各濃度レベルにおいて,どのレベルへ何画素分
移動(変更)するか決定する
次に,ある規則に基づき画素値を移動(変更)する
濃度変換
ヒストグラムの平坦化
平均画素数=画素数/濃度階調数
=(256×256)/256
=256
画
素
数
画
素
数
平均画素数
(256)
濃度レベル
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
①
hist[i]:
濃度レベルiの画素数
①nmove[i][i]=hist[i],その他は全て0
平均画素数
0
1
2
3
4
ヒストグラム
5
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
②
hist[i]:
濃度レベルiの画素数
①nmove[i][i]=hist[i],その他は全て0
②nmove[1][0]=1, nmove[1][1]=7
平均画素数
0
1
2
3
4
ヒストグラム
5
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
③
hist[i]:
濃度レベルiの画素数
①nmove[i][i]=hist[i],その他は全て0
②nmove[1][0]=1, nmove[1][1]=7
③nmove[1][2]=3, nmove[1][1]=4
平均画素数
0
1
2
3
4
ヒストグラム
5
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
④
hist[i]:
濃度レベルiの画素数,処理中変化
①nmove[i][i]=hist[i],その他は全て0
②nmove[1][0]=1, nmove[1][1]=7
③nmove[1][2]=3, nmove[1][1]=4
④nmove[2][3]=1, nmove[2][2]=1
平均画素数
0
1
2
3
4
ヒストグラム
5
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
⑤
hist[i]:
濃度レベルiの画素数,処理中変化
①nmove[i][i]=hist[i],その他は全て0
②nmove[1][0]=1, nmove[1][1]=7
③nmove[1][2]=3, nmove[1][1]=4
④nmove[2][3]=1, nmove[2][2]=1
⑤nmove[4][3]=1, nmove[4][4]=0
平均画素数
0
1
2
3
4
ヒストグラム
5
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
⑥
hist[i]:
濃度レベルiの画素数,処理中変化
①nmove[i][i]=hist[i],その他は全て0
②nmove[1][0]=1, nmove[1][1]=7
③nmove[1][2]=3, nmove[1][1]=4
④nmove[2][3]=1, nmove[2][2]=1
⑤nmove[4][3]=1, nmove[4][4]=0
⑥nmove[5][3]=1, nmove[5][5]=8
平均画素数
0
1
2
3
4
ヒストグラム
5
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
変更する画素数の決定
例:6階調,画像サイズ6×4=24画素,平均画素数=4
nmove[i][j]:
濃度レベルiから,濃度レベルj
へ変更する画素数
⑦
hist[i]:
濃度レベルiの画素数,処理中変化
平均画素数
0
1
2
3
4
ヒストグラム
①nmove[i][i]=hist[i],その他は全て0
②nmove[1][0]=1, nmove[1][1]=7
③nmove[1][2]=3, nmove[1][1]=4
④nmove[2][3]=1, nmove[2][2]=1
⑤nmove[4][3]=1, nmove[4][4]=0
⑥nmove[5][3]=1, nmove[5][5]=8
5
⑦nmove[5][4]=4, nmove[5][5]=4
濃度レベル
濃度変換
ヒストグラム平坦化の流れ
どの場所の画素レベルをどのレベルに変更するか?
前の例では,濃度レベル5から濃度レベル3へ変更する
画素が1つ(nmove[5][3]=1),レベル4へ変更する画素
が4つ(nmove[5][4]=4)存在する。
濃度レベル5の画素は,9つ存在する。
どこの画素の濃度レベルを3にし,どこをレベル4に変更
するのか?
いろんな方法が提案されている。


確率的に決定
周囲の濃度に応じて決定
プログラム例では,濃度の低い方から優先的に割り当て
る。つまり,順に画素を走査しながら,最初に見つかった
レベル5をレベル3へ変更し,次に見つかったレベル5を
レベル4に変更する。
濃度変換
実習:ヒストグラムの平坦化
imggrayc2.h内にあるvoid Heitan(void)を利用し
ます。




histogram[i] 濃度レベルiの画素数。ヒストグラム
mean 平均画素数
nmove[i][j] 濃度レベルiからjに変更する画素数
cnt[i][j] レベルiからレベルjに変更済みの画素数
(実際の濃度レベル変更時に利用)
実際に画像のヒストグラムの平坦化を行い,そ
の画像を元の画像と比較しましょう。また,ヒスト
グラムが確かに平坦になっていることを確認しま
しょう。
濃度変換
2000
頻度
頻度
ヒストグラムの平坦化
1000
0
0
2000
1000
100
200
階調数
0
0
100
200
階調数
空間フィルタ
空間フィルタリングの手法
フィルタリングとは?

特定の信号のみを通過させたり遮断したりするもの



雑音や歪みを遮断する(除去する)
エッジ(輪郭)のみを通過させる(抽出する)
着目画素について,雑音を除くなどの処理をした新し
い画素値を決定する
近傍処理(局所処理)

着目画素とその近傍の画素値から着目点の新しい画
素値を決定する
点処理

着目画素のみの画素値から新しい画素値を決定する
(濃度変換)
空間フィルタ
空間フィルタリングの手法
j
i
*
8近傍
着目画素
着目画素の
新しい画素値
フィルタ係数
空間フィルタ
空間フィルタリングの手法
f [i  1][ j  1]
a[1][1]
a[1][1]
f [i ][ j ]
g[i ][ j ]
*
f [i  1][ j  1]
フィルタ係数
着目画素
f [i  1][ j  1]
と8近傍
着目画素の
新しい画素値
それぞれを9つの要素をもつベクトルと考え,内積を計算
1
1
g[i][ j ]    f [i  k ][ j  l ]  a[k ][l ]
l  1 k  1
空間フィルタ
平滑化フィルタ
雑音の特徴は?

大きさが不規則で,狭い範囲で激しく変化する
では,どのようにすれば目立たなくなる?
大きさが激しく変化しないようにする
 周りの値で平均化し,ならす(平らにする)

平滑化フィルタ
空間フィルタ
平滑化フィルタ <平均値フィルタ>
1
9
1
a[ k ][l ]  
9
1
 9
1
9
1
9
1
9
1
9
1

9
1
9 
フィルタ係数の総和は1と
なるように設定する
フィルタ係数全てが1/9
8近傍の画素値との平均
値を求めて新しい画素値
とする
移動平均法とも呼ばれる
雑音は軽減されるが,同
時に画像(特に輪郭部
分)がボケてしまう
空間フィルタ
平滑化フィルタ <加重平均フィルタ>
1
1
1
10 10 10 
1
2 1

a[k ][l ]  
10 10 10 
1
1
1
10 10 10 
フィルタ係数の総和は1と
なるように設定する
着目画素のみ係数(重
み)を大きくする
出力に対する着目点の寄
与率が大きくなるためボ
ケを多少は軽減できる
代表的なものにガウシア
ンフィルタがある
空間フィルタ
<加重平均フィルタ> ガウシアンフィルタ
ガウス分布
 x2  y2 
G ( x, y ) 
exp
2
2 
2
 2 
2
1
 24 24
 2 12
a[ k ][l ]  
 24 24
2
1
 24 24
1
1
24 
2

24 
1
24 
N回適用することで,標
準偏差σがsqrt(N)に比
例するようなガウシア
ンフィルタの効果を得
ることが可能な近似的
フィルタ
空間フィルタ
<加重平均フィルタ> 演習3.1
1 1 1
フィルタ係数の総和は
11 11 11
1となるように設定す
1 3 1
る

a[k ][l ]  
着目画素のみ係数
11 11 11
(重み)を3とする
1 1 1
11 11 11
演習
20%のごま塩状のノイズを付加したlena画
像,lenan20.rawを利用。
Imgfilter.hをincludeすること。
imgfilter.h内の関数を完成させ,実行する。
mainは,image_processing4.cを利用。
演習
移動平均


void Moving_average(void)を完成しなさい
lenan20.rawを処理した結果を表示しなさい
加重平均


void Ensyu3_1(void)を完成しなさい
lenan20.rawを処理した結果を表示し,移動平均と比
較しなさい
tmp_Image2[256][256]という配列を利用してい
る理由は何でしょう?
結果
lenan20.raw
移動平均
加重平均
(演習3.1)
演習
ガウシアンフィルタ
void Gaussian(void)を完成しなさい
 lenan20.rawを処理した結果を表示しなさい
 3回連続でガウシアンフィルタをかけた結果を
出力し,1回のみの場合と比較しなさい

移動平均と加重平均の効果の違いについ
て検討しましょう。加重平均では,着目画
素の重みが大きい程良いのでしょうか?
結果
lenan20.raw
ガウシアンフィルタ
1回実行
ガウシアンフィルタ
3回実行
移動平均と加重平均
加重平均の極端な場合を考えましょう。
着目点の重みが1で,それ以外は0だとしたらど
うなるでしょう?
その出力は,入力と同じですね。
つまり,移動平均では雑音は減るがボケが発生
し,加重平均ではボケを抑制する代わりに雑音
が残ります。
加重平均では,このバランスが大事で,その代
表的なものがガウシアンフィルタというわけです。
空間フィルタ
平滑化フィルタ <メディアンフィルタ>
画素値の順に並べる
中央値(メディアン)を選択
着目画素
と8近傍
メディアンを着目画素の
新しい画素値とする
空間フィルタ
<メディアンフィルタ>
スパイク状の雑音を除去するのに有効
スパイク雑音は,他の画素値よりも大きい
ため,近傍画素値を並べ替えたときに端に
寄る傾向にある
メディアンを選択することにより除去できる
スパイク雑音のみ除去でき,ボケの発生は
ほとんどない(スパイク雑音が無い部分で
はボケが発生する場合がある)
空間フィルタ
<メディアンフィルタ>
演習3.2
ノイズを含む部分:値が上下
f [i]  {...,0,0,1,0,1,8,6,8,8,....}
平均値フィルタの場合:ノイズは除去
エッジ部分
f [i]  {...,0,0,1,3,5,7,7,....}
エッジがボケている
メディアンフィルタの場合:ノイズは除去
f [i]  {...,0,0,1,1,6,8,8,....}
エッジがボケていない
演習
メディアンフィルタ
void Median(void)を完成しなさい
 lenan20.rawにメディアンフィルタをかけた結
果を出力しなさい
 3回連続してメディアンフィルタをかけるとどう
なりますか
 メディアンではなく,最大値や最小値を出力す
るとどうなりますか

結果
lenan20.raw
メディアンフィルタを メディアンフィルタを
1回かけた場合
3回かけた場合
メディアンフィルタ
スパイク状のノイズを除去するのに有効
繰り返しフィルタをかけることにより,スパ
イクノイズをほぼ完璧に除去できる
ただし,既にスパイクノイズが除去された
領域については,画像がボケてしまう傾向
にある
ノイズの特性と目的に応じたノイズ除去手
法を選択しなければならない
結果
lenan20.raw
最大値を選択した
場合
最小値を選択した
場合
空間フィルタ
その他の平滑化フィルタ
エッジ保存平滑化
領域1
領域2
領域3
領域4
9つの小領域
に分割
着目画素
と5×5近傍
領域5
それぞれの領域について,
画素値の平均と分散を求める
領域6
領域7
領域8
領域9
最も分散が小さい領域
の平均値を着目画素の
画素値とする
空間フィルタ
エッジ保存平滑化
最も分散が小さい領域とは?
画素値がほとんど同じ領域であり,大きく異な
る画素値(つまりノイズやエッジ)が無い領域
 その平均値を着目画素の画素値とすることに
より,エッジを保存した平滑化が可能

ただし,処理時間が他の手法より長い
演習
エッジ保存平滑化

void Edge_keep_smoothing(void)を実行し,
他の手法の結果と比較しなさい
結果
lenan20.raw
エッジ保存平滑化
ガウシアンフィルタ
(1回)
中間テストについて
5/22,4限目,教室は次回連絡します。
*3限目は復習(質問時間)とします。出席は自由です。
60分(15:10-16:10)
範囲はp.1-p.33(ただしプログラムリストは省く)
プログラムを書かせる問題は無し
教科書にない内容についても出題しない
内容と配点



教科書の類似問題(教科書本文の穴埋めと演習問題から出題)
50点分(穴埋めは選択肢無し,太字のキーワードを中心に)
教科書を理解していれば解ける問題
30点分
深く考えさせる問題
20点分