Rを用いた画像処理入門
~胸部X線の経時的差分画像~
Oct 27, 2016 SappoRoR7
Masahiko Hida
1
はじめに
magick packageで画像処理の入門編をやってみました。
おまけとして胸部レントゲンで
経時的差分画像を作ってみたお話です。
2
本日のAGENDA
• 自己紹介
• magickによる画像処理の基本
• 胸部XP画像の経時的差分処理
• まとめ
3
magickによる画像処理の基本
5 . 1
magick package
ImageMagickをラップしたパッケージ。
画像オブジェクトは、“magick-image”クラ
ス。
5 . 2
インストールと読み込み
install.packages("magick")
library(magick)
5 . 3
画像の読み込み・表示
dog <- magick::image_read('img/dog.jpg')
magick::image_browse(dog) # 別ウインドウに表示
dog # Rstudioのviewer上で表示
5 . 4
フォーマットの変更
magick::image_convert(dog, "png")
magick::image_write(dog,"img/dog.png",format = "png")
5 . 5
リサイズ
magick::image_scale(dog, "200")     # リサイズ width: 200px
magick::image_scale(dog, "x200")    # リサイズ height: 200px
magick::image_crop(dog, "300x400+150+150") # 切り取り
5 . 6
回転・反転
magick::image_rotate(dog, 45) # 回転
magick::image_flip(dog) # 上下反転
magick::image_flop(dog) # 左右反転
5 . 7
注釈
magick::image_annotate(dog,"I've been working like a dog.",
size = 30, color = "red",boxcolor = "pink",
degrees = 10, location = "+150+600")
5 . 8
フィルター
magick::image_blur(dog, 10, 5)
magick::image_noise(dog,noisetype = "gaussian")
magick::image_oilpaint(dog,radius = 5)
magick::image_charcoal(dog)
magick::image_edge(dog,radius = 5)
magick::image_emboss(dog, radius = 1, sigma = 0.5)
magick::image_negate(dog)
5 . 9
結合
img <- c(dog,dog,dog)
magick::image_append(img,stack=F) # stack=Fで横並び
magick::image_append(img,stack=T) # stack=Tで縦並び
5 . 10
たまに使う機能
6 . 1
グレイスケール変換
6 . 6
カラーコードからRGBに
まずラスターデータに変換します。
各セルがカラーコードになってるので、R/G/Bに分割して10進
法へ。
colorcode2RGB <- function(code){
start <- c(2,4,6) ; end <- c(3,5,7)
RGB16 <- substring(code,start,end)
to10 <- function(x) { eval(parse(text =sprintf("0x%s",x))) }
RGB <- c(to10(RGB16[1]),to10(RGB16[2]),to10(RGB16[3]))
}
6 . 7
前半のまとめ
7 . 1
EBImage packageと
何が違うの?
7 . 2
magickとEBImageの比較1
画像の中身は
magick EBImage
画像オブジェクトのクラス magick-image
externalptr
Image
容量は
magick-imageオブジェクトもラスターにしてしまうと
> magick::image_read('img/dog.jpg') %>% object.size()
280 bytes
> EBImage::readImage("img/dog.jpg") %>% object.size()
191767312 bytes
> magick::image_read('img/dog.jpg') %>% as.raster %>% object.size()
66646344 bytes
7 . 3
magickとEBImageの比較2
お犬様画像(600x800 px)で少しだけ速度比較
magick EBImage
画像読み込み magick::image_read EBImage::readImage
(/500回) 7.74s 32.97s
リサイズ magick::image_scale EBImage::resize
(/25%縮小、200回) 2.98s 6.47s
回転 magick::image_rotate EBImage::rotate
(/45度回転、50回) 22.45s 9.42
7 . 4
前半まとめ
magickは関数名がimage_から始まるので、Rstudioのコード
補完を使えば入力が楽ちん。
大量の画像処理なら、可能な処理は極力magickで。
少量の画像や、グレースケール化、特殊なフィルター、複雑な
計算処理ならEBImageで。
(個人的な感想です。)
7 . 5
ここから後半
8 . 1
胸部X線の経時的差分画像
9 . 1
胸部X線画像
9 . 2
胸部X線画像の撮影
吸気状態による上下変動
中央位置合わせによる左右変動
立位なのでrotateは少ない
撮像距離一定で拡大縮小はほぼ無し 9 . 3
なぜ差分画像?
単一のX線画像から異常を見つけるスクリプトは難しいが、 差分
処理なら機械的に異常所見を抽出できる
9 . 4
差分画像はわかりやすい
多発腫瘍は俄然強い
9 . 5
間違い探し
9 . 6
答え
9 . 7
では差分画像を
作って見ましょう
10 . 1
一番の問題は画像のずれ
10 . 2
差分画像作成のポイント
画像の移動・変形
(写真をずらして重ねる)
画像の類似度の評価尺度
(重なり具合を評価する)
評価尺度を最適化するアルゴリズ
ム
(早く重ねる)
10 . 3
評価尺度の最適化
最急降下法
共益勾配法 など
今回は自作の最適化?関数
10 . 6
画像の変形
線形変換(アフィン変換)
1.剛体位置合わせ(形が変わらない):平行移動、回転
2.非剛体位置合わせ(形が変わる):平行移動、回転、拡大
非線形変換(アフィン変換できないもの)
1. B-spline
法
変換後行列  アフィン行列  変換前行列
=
⎛
⎝
⎜
X
Y
1
⎞
⎠
⎟
⎛
⎝
⎜
acosθ
asinθ
0
−asinθ
cosθ 
0
T x
T y
1
⎞
⎠
⎟
⎛
⎝
⎜
x
y
1
⎞
⎠
⎟
10 . 4
画像の類似度の評価
残差の二乗和(SSD=Sum of Squared Difference)
差分絶対値和(SAD=Sum of Absolute Difference)
正規化相互相関(NCC:Normalized Cross-
Correlation)
相互情報量
SSD = |A(x) − B(x)∑
x
|
2
SAD = |A(x) − B(x)|∑
x
NCC =
A(x)B(x)∑
x
A(x∑
x
)
2
− −−−−−−−
√ B(x∑
x
)
2
− −−−−−−−
√
10 . 5
評価尺度の最適化
最急降下法
共益勾配法 など
今回は自作の最適化?関数
10 . 6
方針
前半のまとめ(magickのgrayscaleは面倒?)から、
当初の予定と変更してEBImageで差分画像を作成
シンプルにxy軸の調整のみ。rotate、拡大縮小はな
し
差分の二乗和で評価
自作最適化??関数
10 . 7
差分作成用画像
左右の位置ずれはわずか、上下に位置ずれ有り。
10 . 8
差分画像作成の実際
11 . 1
単純差分処理
まずはなにも考えずに、単純な引き算してみます。
上下方向のいちズレが見立ちます。
11 . 2
grid searchの差分画像
y軸方向のズレが改善
11 . 5
もう少し計算量を減らしたい
11 . 6
自作最適化?関数作りました
動画(you tube)
動画(mp4)
11 . 7
自作関数の差分画像
y軸方向のズレはgrid searchと同程度改善
11 . 9
画像作成の計算時間
grid search :
自作関数 :
ユーザ システム 経過
725.88 220.83 949.74
ユーザ システム 経過
33.34 12.89 59.03
11 . 10
後半のまとめ
12 . 1
後半まとめ
そこそこの胸部X線経時的差分画像は、Rで比較的容易に処
理できる。
でも胸部レントゲン画像は、差分計算のコストがかなり大き
い。
位置合わせ用に、低解像度画像を使用するか、コストの低い
最適化関数が必要。
できれば、特徴量検出(SHIFT、SURF)して非線形変換してみ
たい。(要学習!)
openCVとつなぐか、フルスクラッチ?
12 . 2
reference
13 . 1
reference1
github:magick
The magick package: Advanced Image-Processing in R
Introduction to EBImage
[R] EBImageを使った画像処理
医用画像位置合わせの基礎
https://github.com/ropensci/magick
https://cloud.r-project.org/web/packages/magick/vignettes/int
http://bioconductor.org/packages/devel/bioc/vignettes/E
introduction.html
http://d.hatena.ne.jp/Rion778/20091210/1260414280#fi
https://lp-tech.net/articles/vb
13 . 2

SappoRoR#7 Rを用いた画像処理入門 -胸部X線の経時的差分画像-