デジタルメディア処理 担当 : 井尻敬 デジタルメディア処理 7( 前期 ) /3 デジタル画像とは : イントロダクション / フィルタ処理 : 画素ごとの濃淡変換 線形フィルタ, 線形フィルタ /7 フィルタ処理 : フーリエ変換, ローパスフィルタ, ハイパスフィルタ 5/ 画像の幾何変換 : アファイン変換 5/8 画像の幾何変換 : 画像の補間, イメージモザイキング 5/5 画像領域分割 : 領域拡張法, 動的輪郭モデル, グラフカット法, 6/ 前半のまとめ ( 約 3 分 ) と中間試験 ( 約 7 分 ) 6/8 特徴検出 : テンプレートマッチング コーナー エッジ検出 6/5 特徴検出 : DoG 特徴量 SIFT 特徴量 ハフ変換 6/ 画像認識 : パターン認識概論, サポートベクタマシン 6/9 画像認識 : ニューラルネットワーク 深層学習 7/6 画像符号化 : 圧縮率, エントロピー, ランレングス符号化,MH 符号化 7/3 画像符号化 : DCT 変換, ウエーブレット変換など 7/ 後半のまとめ ( 約 3 分 ) と期末試験 ( 約 7 分 ) Contents : フィルタ処理 デジタル画像とは ( 復習 ) トーンカーブ 反転, 値化, ポスタリゼーション, ソラリゼーション, ガンマ変換, カラー画像 空間フィルタ ( 線形 ) 平滑化フィルタ, ソーベルフィルタ, ガウシアンフィルタ, ラプラシアンフィルタ 空間フィルタ ( 線形 ) メディアンフィルタ, バイラテラルフィルタ デジタル画像のフィルタリング
デジタル画像 : カラー画像 離散値を持つ画素が格 状に並んだデータ 画素 : pixel= picture + element 例 bit bitmap : 各 pixel が (R,G,B) 毎に整数値 [,55] を持つ デジタル画像 : グレースケール画像 離散値を持つ画素が格 状に並んだデータ 画素 : pixel= picture + element 例 8bit bitmap : 各 pixel が整数値 [,55] を持つ 画像 I(i,j) : j 画像 I(i,j) : j i I( i, j) I(i+,j+) : 5 : 6 : 79 : 3 : 5 : 9 i I( i, j) 7 I(i+,j+) 7 原点位置は左下のことも 原点位置は左下のことも 頻度表 ( ヒストグラム ) とは 各階調の画素数を数えた表のこと回転や平 移動に依存しない特徴量 画像処理に頻出 グレースケール画像 RGBカラー画像 ImageJ でヒストグラムを確認してみる. ImageJ 起動. 画像読み込み 3. Menu > analyze > histogram. LiveをOnにすると矩形選択した領域のヒストグラムを確認可能
import numpy as np import pylab as plt import cv import itertools # 画像読み込み & グレースケール化 img = cv.imread("imgs/sample.png") img_gry = cv.cvtcolor( img, cv.color_bgrgray ) #histogram 生成 hist = np.zeros(56) for y in range(img_gry.shape[]): for x in range(img_gry.shape[]): hist[ img_gry[y,x] ] += #window を生成して画像を表示 cv.imshow("image", img_gry ) #hist を matplotlib で表示 plt.plot(hist) plt.xlim([,56]) plt.show() ヒストグラムの計算 : histograpm.py デジタル画像のフィルタリング 処理 に対し何らかの計算処理を施し 特定の周波数を持つ信号を強調する 捨てる ( ノイズ除去 ) アーティスティックな効果を得る 画像処理 ( ステレオ視 領域分割 識別器 ) に必要な特徴ベクトルを得る トーンカーブ CToneCurve.exe (C++) Image>Adjust>Window/Level (ImageJ) は 8bit グレースケールとする 各画素の値を異なる値に変換する階調変換関数を考える 階調変換関数をグラフで表現したものをトーンカーブと呼ぶ 55 出 画素値 トーンカーブ 画素値 55
トーンカーブは写真編集の基本ツール トーンカーブ : コントラストを上げる GIMP 55 A B C 出 55 ImageJ: 由編集でないのでちょっと違うけど PhotoShop Elements カラーカーブ使いやすいように 由度の限定されたトーンカーブのようなもの Photoshop CS にはトーンカーブがある ( あった ) 領域 A : 出 画素値 となり つぶれ 領域 C : 出 画素値 55 となり び 領域 B : 傾きが より きいため 画素値の取り得る範囲が広がりコントラストが上がる画素値は離散値であるため出 ヒストグラムは び びに トーンカーブ : コントラストをさげる トーンカーブ : 特殊効果 ネガポジ反転 値化 55 出 55 ポスタリゼーション 閾値より下は 閾値以上は 55 ソラリゼーション 傾きが より さいため 出 画素値の取り得る範囲が縮まり コントラストが下がる 元画像 出 の 数を極端に減らす 実装が間に合わず 書きで曲線を与えました 本来は関数で与えるべき 上記のような曲線を指定
元画像 トーンカーブ : ガンマ補正 次のトーンカーブを利 した濃淡変換をガンマ変換と呼ぶ : 値 [,55] : 出 値 [,55] : パラメータ ( >) =. =/3..5. =.5 3. RGB 各チャンネルにガンマ補正を適 トーンカーブ : カラー画像への適 カラー画像をトーンカーブで編集するとき RGBの各チャンネルにトーンカーブの画素値変換を適 YCbCr Colorに変換し輝度値成分 (Y) のみに変換を適 その他 R G Y RGB color YCbCr color 輝度 / み / み B Cb Cr 画像出 デバイスには 出力値 入力値 と う関係があり この特性を補正する 的で上記の関数が いられていた これを画像の補正に利 したのがガンマ変換 トーンカーブ : カラー画像への適 トーンカーブ : カラー画像への適 γ=.3 のガンマ変換 RGB 各チャンネル YCbCr の輝度 Y のみ γ=.3 のガンマ変換 RGB 各チャンネル YCbCr の輝度 Y のみ
トーンカーブ : カラー画像への適 トーンカーブ : まとめ トーンカーブ : 各画素の輝度値 を変換する階調変換関数 画像の 栄えの編集に利 される キーワード : コントラスト変換 ネガポジ反転 ポスタリゼーション ソラリゼーション 値化 ガンマ補正 55 ポスタリゼーション RGB 各チャンネル YCbCr の輝度 Y のみ (Cb Cr の階調数は減らない ) 出 画素値 画素値 55 import numpy as np import cv import itertools def myconvolve(srcimg, filter) : H = srcimg.shape[] W = srcimg.shape[] R = int(filter.shape[] / ) trgtimg = np.zeros(srcimg.shape) Convolution.py 線形フィルタの計算 for v, u in itertools.product(range(,h-),range(,w-)): pix =. for vv, uu in itertools.product(range(-r,r+),range(-r,r+)) : pix += filter[r + vv][r + uu] * srcimg[v+vv][u+uu] trgtimg[v][u] = min(55,max(,abs(pix))) return np.uint8(trgtimg) img = cv.imread("imgs/lenacolcd.png") img = cv.cvtcolor( img, cv.color_bgrgray ) filter_smooth = np.array( [[,, ],[.,.,.],[.,.,.]])/9. filter_sobelv = np.array( [[-.,-.,-.],[.,.,.],[.,.,.]]) filter_sobelh = np.array( [[-.,.,.],[-.,.,.],[-.,.,.]]) img_smooth = myconvolve(img, filter_smooth ) img_sobelv = myconvolve(img, filter_sobelv ) img_sobelh = myconvolve(img, filter_sobelh ) 空間フィルタ ( 線形 ) cv.imshow("original ", img ) cv.imshow("img_smooth", img_smooth ) cv.imshow("img_sovelv", img_sobelv ) cv.imshow("img_sovelh", img_sobelh ) cv.waitkey()
線形フィルタの例 線形フィルタの例 ぼかす 先鋭化 エッジ抽出横 向縦 向 空間フィルタとは 空間フィルタとは周囲の情報を利 して画素値を決めるフィルタ 空間フィルタは 線形フィルタと 線形フィルタに分けられる トーンカーブ : 出 画素 Iʼ(i,j) を求めるのに 画素 I(i.j) のみを利 : I(i,j) I(i,j) 出 画像 : Iʼ(i,j) Iʼ(i,j) 空間フィルタ : 出 画素 Iʼ(i,j) を求めるのに 画素 I(i.j) の周囲画素も利 : I(i,j) I(i,j) 出 画像 : Iʼ(i,j) Iʼ (i,j) 線形フィルタとは 出 画素値を周囲画素の重み付和で計算するフィルタ,,, (i,j) Iʼ (i,j) 出 画像 h(i,j) フィルタ (i,j) I(i,j)
線形フィルタの例 D 線形フィルタの例 D 33 5 6 3 5 9 8 98 平滑化したい! 33 5 6 3 5 9 8 98 平滑化したい! /3 /3 /3 /3 /3 /3 6 6 3 3 周囲 3 ピクセルの平均を取る 周囲 3 ピクセルの平均を取る 3 7 3 6 3 3 6 7 68 端ははみ出すので値をコピー ( ほかの 法もある ) 線形フィルタの例 D 線形フィルタの例 D 33 33 33 5 6 3 5 9 8 98 もっと平滑化したい! 33 33 33 5 6 3 5 9 8 98 エッジ ( 変化の きい部分 ) を検出したい / / / / / -.5.5 5 6 3 周囲 5 ピクセルの平均を取る 5 8 6.5 右と左のピクセルの差をとる 7 3 35 5 67 85 6878-9 -6 - -7-5 36 7-5 - 端ははみ出すので値をコピー ( ほかの 法もある )
線形フィルタ : 平滑化 9 5 LinaerFilter.exe (C++) convolution.py (python) Process>Filters>Convolve (ImageJ) 線形フィルタ : 特定 向の平滑化 線形フィルタ : ガウシアンフィルタ 6 係数をガウス分布に近づけ中央ほど強い重みに 6 56 6 6 6 36 6 6 6 6 画像の出典 [CG Arts 協会ディジタル画像処理 ] 図 5.8, 5.9
線形フィルタ : ガウシアンフィルタ ガウス関数 D exp ガウス関数 D, exp = = 68.3% 95.% 99.7% これを重みにして線形フィルタをしたいさすがに 3x3 は精度が悪くない?? 68.3% 95.% 99.7% 線形フィルタ : ガウシアンフィルタ 線形フィルタ : 微分 標準偏差 σ の きなガウス関数の畳み込みを計算するとき 3 3 や 5 5 の窓では精度が悪い 精度を出すには窓の半径を 3σ 程度にすべき ( 計算時間はかかる ) (3σ) (3σ) (,), 例 ) σ = 5 pixel のガウシアンフィルタ Window size は 3 3 が適当 関数, の 軸, 軸 向の偏微分は以下の通り定義され,, lim,, lim,, 点, における 軸, 軸 向の関数, の傾きを与える. また,, の勾配, は 次元ベクトルであり,,,, 点, において, の増加が 番 きくなる 向を す 微分の復習. 丈夫ですよね? 練習., 上記の関数の (,), (,3) における勾配を計算し さらに図 せよ
線形フィルタ : 微分 線形フィルタ : 微分 I(u,v) 次元関数 z= f(x,y) の x 向偏微分 v v u I x I(x) グレースケール画像 I(u,v) は, さ関数 z = I(u,v) と なせるなので関数 I(u,v) の勾配 ( 微分 ) は計算できそう v, lim,, 画像 z=i(i,j) の横 向偏微分 ( 近似 ),,,,,,, (a) (b) (c) - - 正値 :, 負値 : で可視化 -/ / I(u,v) の勾配は, 画像の変化の きい 向を表す 画像の出典 [Ijiri et al 3, Eurographics] h = pitch ( 画素サイズ ) = と近似 (a) (b) (c) 線形フィルタ : 微分 -/ /, 横方向微分 線形フィルタ : 微分 前述の単純なフィルタはノイズにも鋭敏に反応する ノイズを押さえつつエッジを検出するフィルタが必要横 向微分 : 横 向微分し縦 向平滑化する縦 向微分 : 縦 向微分し横 向平滑化する, 教科書図 5.6 微分フィルタには画像のエッジで強く応答する -/ /, 縦方向微分 - - - Prewitt filter - - - - - - Sobel filter - - -
元画像 - - - フィルタ処理 右の7x7 画像に対して. 横 向 Sobelフィルタを適 せよ. 縦 向 Sobelフィルタを適 せよ 3. ガウシアンフィルタを適 せよ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 微分フィルタの正値を可視化 Sobel フィルタではノイズが削減されているのが分かる 横 Sobel 縦 Sobel ガウシアン 線形フィルタ : 階微分フィルタ 線形フィルタ : ラプラシアンフィルタ 関数, の 階偏微分は, 以下の通り定義される, lim,,, 画像 I(i,j) の 階偏微分の近似は,,, - - 関数, のラプラシアン,,,, = - * + - * = - * 画像, のラプラシアン,, 出典 [CGArts 協会, デジタル画像処理図 5.6] ラプラシアンフィルタ * は convolution 向に依存しないエッジが 度で得られるエッジをまたぎ正負の対が現れる なら [-+] が現れる
線形フィルタ : 先鋭化フィルタ 回微分に関するラプラシアンフィルタを改良すると画像のエッジを強調する先鋭化フィルタが設計できる? まとめ : 空間フィルタ ( 線形 ) 出 画素値を周囲画素の重み付和で計算するフィルタ,,, 平滑化フィルタ ガウシアンフィルタ 先鋭化フィルタ /9 /9 /9 /9 /9 /9 /9 /9 /9 /6 /6 /6 /6 /6 /6 /6 /6 /6? [CGArts 協会, デジタル画像処理 ] 図 5.6, 5.3 - - - - - - - Sobelフィルタ ( 横 ) Sobelフィルタ ( 縦 ) ラプラシアンフィルタ