R言語で、判別分析(LDA)を用いた画像データの2値化法を実行する際の MASS パッケージの関数 lda() の使用法について
R言語にて、判別分析(LDA)を用いてグレースケールの画像データを2値化画像するコードを検討中です。
これを実現するにあたり、MASSパッケージのlda()
関数を使用しようと考えてるのですが、lda()
関数使用時エラーが発生し、その原因が分かりません。このエラーの意味と対策を教えて頂きたいですm(__)m
lda()
関数のヘルプファイル:
https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/lda.html
以下、実装中コードです。
#install.packages("lda")
#install.packages("jpeg")
# expand lib on memory
library( MASS ) # MASS package
library( jpeg ) # jpeg画像の読み込み
# set options
options( digits=7 ) # 表示桁数
# load image data (jpeg)
jpeg_NekoSensei <- readJPEG( "nekosensei_greyscale.jpg" ) # 560*420 = 235200 pixel
class( jpeg_NekoSensei ) # 3次元配列 um[1:420, 1:560, 1:3]
########################################
# convert to thresholding/binary image #
########################################
dfNekoSensei <- as.data.frame( jpeg_NekoSensei ) # convert to data frame
dat_level <- seq( from=min(dfNekoSensei), to=max(dfNekoSensei), length = length(dfNekoSensei$V1) )
dat_ida <- lda( dat_level ~ . , data = dfNekoSensei ) # **この箇所でエラーが発生します**
エラー内容
Error in lda.default(x, grouping, ...) : variables 1 2
3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40 41 42 43 44
45 46 47 48 49 50 51 52 53 54 55 56 57 58
59 60 61 62 63 64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81 82 83 84 85 86
87 88 89 90 91 92 93 94 95 96 97 98 99 100
101 102 103 104 105 106 107 108 109 110 111 112 113 114
115 116 117 118 119 120 121 122 123 124 125 126 127 128
129 130 131 132 133 134 135 136 137 138 139 140 141 142
143 144 145 146 147 148 149 150 151 152 153 154 155 156
157 158 159 160 161 162 163 164 165 166 167 168 169 170
171 172 173 174 175 176 177 178 179 180 181 182 183 184
185 186 187 188 189 190 191 192 193 194 195 196
以下、コードの続き
print( dat_ida )
############################
# set graphics parameters #
############################
# 軸に関してのデータリスト
lstAxis <- list(
xMin = 0.0, xMax = 1.0, # x軸の最小値、最大値
yMin = 0.0, yMax = 1.0, # y軸の最小値、最大値
zMin = 0.0, zMax = 1.0, # z軸の最小値、最大値
xlim = range( c(0.0, 1.0) ),
ylim = range( c(0.0, 1.0) ),
zlim = range( c(0.0, 1.0) ),
mainTitle = "mainTitle", # 図のメインタイトル(図の上)
subTitle = "subTitle", # 図のサブタイトル(図の下)
xlab = "x", # x軸の名前
ylab = "y", # y軸の名前
zlab = "z" # z軸の名前
)
lstAxis$xMin <- 0
lstAxis$xMax <- 560
lstAxis$yMin <- 0
lstAxis$yMax <- 420
lstAxis$xlim = range( c(lstAxis$xMin, lstAxis$xMax) )
lstAxis$ylim = range( c(lstAxis$yMin, lstAxis$yMax) )
lstAxis$zlim = range( c(lstAxis$zMin, lstAxis$zMax) )
lstAxis$xlab <- "x1"
lstAxis$ylab <- "x2"
lstAxis$mainTitle <- "ねこ先生(グレースケール)[Greyscale]" # 図のメインタイトル(図の上)
# plot frame only
par(new=F)
plot.new() # clear
plot( c(), type='n',
main = lstAxis$mainTitle,
xlim=lstAxis$xlim, ylim=lstAxis$ylim,
xlab=lstAxis$xlab, ylab=lstAxis$ylab
)
#grid() #グリッド線を追加
############################
# Draw Image and figure #
############################
# draw original image
rasterImage(
image = jpeg_NekoSensei,
xleft = lstAxis$xMin, xright = lstAxis$xMax,
ybottom = lstAxis$yMin, ytop = lstAxis$yMax
)
# draw converted image
lstAxis$mainTitle <- "ねこ先生(2値化処理後)" # 図のメインタイトル(図の上)
plot( c(), type='n',
main = lstAxis$mainTitle,
xlim=lstAxis$xlim, ylim=lstAxis$ylim,
xlab=lstAxis$xlab, ylab=lstAxis$ylab
)
rasterImage(
image = jpeg_NekoSensei, # 変換後のデータ(とりあえず元データをセット)
xleft = lstAxis$xMin, xright = lstAxis$xMax,
ybottom = lstAxis$yMin, ytop = lstAxis$yMax
)