Rでjpeg画像を読み込み、加工する
もともと存在する画像(jpegファイルやpngファイル)を読み込んで、線や図形を書き足したり、文字を書き足したり、そんな感じの加工をRを使って行う方法です。
発想としては、plot関数で用意した作画領域に、rasterImage関数で画像を貼り付けしまえば、そのあとは使い慣れた(?)低水準作図関数でいろいろ落書きができるでしょ、という感じです。
library(jpeg)
lena <- readJPEG("lena.jpg") # あの女性の画像
plot( 0,0, xlim=c(0,512), ylim=c(512,0), type="n", asp=1 )
rasterImage(lena, 0, 512, 512, 0)
rect( 220,200, 360,390, border="cyan" )
plot関数のylimオプションが上下逆になっているのがポイントです。jpeg上での座標の扱いは左上が原点になっているからなんですね。
rasterImage関数には、xleft, ybottom, xright, ytopの順で指定することになっています。つまり、貼り付けたい場所の左下(xleft, ybottom)と右上(xright, ytop)を指定しろということですね。対応する座標は、(0,512)と(512,0)になりますので、
rasterImage(lena, 0, 512, 512, 0)
で、正しく貼り付けられるわけです。
あとは低水準作図関数を駆使して、rect関数で矩形を描くなり、abline関数で線を引くなり、text関数で文字を書き込むなりすればいいんじゃないでしょうか。
で、お気づきだとは思いますが、x軸・y軸とかラベルとかが邪魔ですよね。これについては「余白なし」の設定になるように、plotの前にパラメタ指定しておけばOKです。軸やラベルは作画領域の外に追いやられ、見えなくなります。
old.par <- par(no.readonly = TRUE) # 現状パラメタの退避
par( plt=c(0,1,0,1) ) # 余白なしの設定
plot( 0,0, xlim=c(0,512), ylim=c(512,0), type="n", asp=1 )
rasterImage(lena, 0, 512, 512, 0)
rect( 220,200, 360,390, border="cyan" )
par(old.par) # パラメタを元に戻す
パラメタの退避・復元は必須ではないんですが、やっておかないと、その後のplotでは軸やラベルが表示されなくなってしまいます。Rで他の作業をするときに困りますよね。(Rを起動しなおせば直りますが)
あとは、できあがった画像をファイルとして出力しましょう。
jpeg("out.jpg", width=512, height=512) # jpegファイルのオープン
old.par <- par(no.readonly = TRUE) # 現状パラメタの退避
par( plt=c(0,1,0,1) ) # 余白なしの設定
plot( 0,0, xlim=c(0,512), ylim=c(512,0), type="n", asp=1 )
rasterImage(lena, 0, 512, 512, 0)
rect( 220,200, 360,390, border="cyan" )
par(old.par) # パラメタを元に戻す
dev.off() # jpegファイルのクローズ
ファイルをオープンしているところのjpeg関数を、png関数に変更すればpngファイルに書き出すこともできます。
できあがったファイルを見てもらえば分かりますが、外周に白枠が追加されてしまっています。
これを消す方法は・・・分かりませんでした。誰か教えてください。
発想としては、plot関数で用意した作画領域に、rasterImage関数で画像を貼り付けしまえば、そのあとは使い慣れた(?)低水準作図関数でいろいろ落書きができるでしょ、という感じです。
![]() |
Rでlenaさんの画像を読み込んで、rectで加工したもの |
lena <- readJPEG("lena.jpg") # あの女性の画像
plot( 0,0, xlim=c(0,512), ylim=c(512,0), type="n", asp=1 )
rasterImage(lena, 0, 512, 512, 0)
rect( 220,200, 360,390, border="cyan" )
plot関数のylimオプションが上下逆になっているのがポイントです。jpeg上での座標の扱いは左上が原点になっているからなんですね。
rasterImage関数には、xleft, ybottom, xright, ytopの順で指定することになっています。つまり、貼り付けたい場所の左下(xleft, ybottom)と右上(xright, ytop)を指定しろということですね。対応する座標は、(0,512)と(512,0)になりますので、
rasterImage(lena, 0, 512, 512, 0)
で、正しく貼り付けられるわけです。
あとは低水準作図関数を駆使して、rect関数で矩形を描くなり、abline関数で線を引くなり、text関数で文字を書き込むなりすればいいんじゃないでしょうか。
で、お気づきだとは思いますが、x軸・y軸とかラベルとかが邪魔ですよね。これについては「余白なし」の設定になるように、plotの前にパラメタ指定しておけばOKです。軸やラベルは作画領域の外に追いやられ、見えなくなります。
![]() |
余白なしにして、軸やラベルを表示させないようにしたもの |
old.par <- par(no.readonly = TRUE) # 現状パラメタの退避
par( plt=c(0,1,0,1) ) # 余白なしの設定
plot( 0,0, xlim=c(0,512), ylim=c(512,0), type="n", asp=1 )
rasterImage(lena, 0, 512, 512, 0)
rect( 220,200, 360,390, border="cyan" )
par(old.par) # パラメタを元に戻す
パラメタの退避・復元は必須ではないんですが、やっておかないと、その後のplotでは軸やラベルが表示されなくなってしまいます。Rで他の作業をするときに困りますよね。(Rを起動しなおせば直りますが)
あとは、できあがった画像をファイルとして出力しましょう。
jpeg("out.jpg", width=512, height=512) # jpegファイルのオープン
old.par <- par(no.readonly = TRUE) # 現状パラメタの退避
par( plt=c(0,1,0,1) ) # 余白なしの設定
plot( 0,0, xlim=c(0,512), ylim=c(512,0), type="n", asp=1 )
rasterImage(lena, 0, 512, 512, 0)
rect( 220,200, 360,390, border="cyan" )
par(old.par) # パラメタを元に戻す
dev.off() # jpegファイルのクローズ
ファイルをオープンしているところのjpeg関数を、png関数に変更すればpngファイルに書き出すこともできます。
できあがったファイルを見てもらえば分かりますが、外周に白枠が追加されてしまっています。
これを消す方法は・・・分かりませんでした。誰か教えてください。
コメント
コメントを投稿