Rで解析:画像操作の進化「magick」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

これまでに画像を操作するパッケージとして「imager」や「EBImage」パッケージを紹介しました。これらパッケージも有用ですが、本パッケージはカユイ所に手が届くパッケージです。

各実行コマンドを自身で確認いただき本パッケージの有用性を実感いただければと思います。

パッケージバージョンは2.7.3。実行コマンドはwindows 11のR version 4.1.2で確認しています。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("magick")

実行コマンドの紹介

詳細はコマンド、パッケージのヘルプを確認してください。

#パッケージの読込
library("magick")

#画像の読み込み:image_readコマンド
#からだにいいものバナーを読み込み
#もちろんローカル環境の画像も読み込めます
KaradaBanner <- image_read('https://www.karada-good.net/wp/wp-content/uploads/2015/08/4d45f652babef5b63a8c2a5f85c9885d.jpg')

#&#30011;&#20687;&#12398;&#24773;&#22577;&#12434;&#34920;&#31034;:image_info&#12467;&#12510;&#12531;&#12489;
image_info(image = KaradaBanner)
format width height colorspace filesize
JPEG   986    149       sRGB    78164

#&#30011;&#20687;&#12501;&#12457;&#12540;&#12510;&#12483;&#12488;&#12434;&#22793;&#25563;:image_convert&#12467;&#12510;&#12531;&#12489;
#&#12501;&#12457;&#12540;&#12510;&#12483;&#12488;&#12434;&#25351;&#23450;:format&#12458;&#12503;&#12471;&#12519;&#12531;;png,jpeg,gif,pdf&#12364;&#25351;&#23450;&#21487;&#33021;
ConvertImg <- image_convert(image = KaradaBanner, format = "pdf")
image_info(image = ConvertImg)
format width height colorspace filesize
pdf   986    149       sRGB        0

#&#30011;&#20687;&#12434;&#20445;&#23384;:image_write&#12467;&#12510;&#12531;&#12489;
#tcltk&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#21033;&#29992;&#12375;&#12390;&#20445;&#23384;&#22580;&#25152;&#12434;&#25351;&#23450;
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title = "&#20445;&#23384;&#22580;&#25152;&#12434;&#36984;&#25246;"), sep = "", collapse ="")))
#&#20445;&#23384;&#12501;&#12449;&#12452;&#12523;&#21517;&#12434;&#25351;&#23450;:path&#12458;&#12503;&#12471;&#12519;&#12531;
#&#12501;&#12457;&#12540;&#12510;&#12483;&#12488;&#12434;&#25351;&#23450;:format&#12458;&#12503;&#12471;&#12519;&#12531;;png,jpeg,gif,pdf&#12364;&#25351;&#23450;&#21487;&#33021;
image_write(KaradaBanner, path = "test.pdf", format = "pdf")

#&#30011;&#20687;&#12434;&#34920;&#31034;:image_browse&#12467;&#12510;&#12531;&#12489;
#&#30011;&#20687;&#12501;&#12457;&#12540;&#12510;&#12483;&#12488;&#12395;&#24467;&#12356;&#12471;&#12473;&#12486;&#12512;&#12391;&#35373;&#23450;&#12375;&#12390;&#12356;&#12427;&#12477;&#12501;&#12488;&#12391;&#34920;&#31034;
image_browse(image = KaradaBanner)

#&#30011;&#20687;&#21608;&#22258;&#12395;&#26528;&#32218;&#12434;&#20184;&#19982;:image_border&#12467;&#12510;&#12531;&#12489;
#&#33394;&#12434;&#25351;&#23450;:color&#12458;&#12503;&#12471;&#12519;&#12531;
#&#26528;&#32218;&#22826;&#12373;&#12434;&#12500;&#12463;&#12475;&#12523;&#12391;&#25351;&#23450;:geometry&#12458;&#12503;&#12471;&#12519;&#12531;;&#24038;&#21491;&times;&#19978;&#19979;&#12391;&#25351;&#23450;
image_border(image = KaradaBanner, color = "blue", geometry = "15x10")

#&#30011;&#20687;&#12434;trim&#20966;&#29702;:image_trim&#12467;&#12510;&#12531;&#12489;
image_trim(image = KaradaBanner)

#&#30011;&#20687;&#12434;&#20999;&#12426;&#25244;&#12365;:image_crop&#12467;&#12510;&#12531;&#12489;
#&#20999;&#12426;&#25244;&#12367;&#22823;&#12365;&#12373;&#20301;&#32622;&#12434;&#25351;&#23450;:geometry&#12458;&#12503;&#12471;&#12519;&#12531;;&#24133;x&#39640;&#12373;{+-}X&#36600;&#38283;&#22987;&#20301;&#32622;{+-}Y&#36600;&#38283;&#22987;&#20301;&#32622;
image_crop(image = KaradaBanner, geometry = "140x150+100-30")

#&#30011;&#20687;&#12398;&#12522;&#12469;&#12452;&#12474;:image_scale&#12467;&#12510;&#12531;&#12489;
image_scale(image = KaradaBanner, geometry = "400x600")

#&#30011;&#20687;&#12398;&#22238;&#36578;:image_rotate&#12467;&#12510;&#12531;&#12489;
#&#35282;&#24230;&#12434;&#25351;&#23450;:degrees&#12458;&#12503;&#12471;&#12519;&#12531;
image_rotate(image = KaradaBanner, degrees = 30)

#&#30011;&#20687;&#12434;&#19978;&#19979;&#21453;&#36578;:image_flip&#12467;&#12510;&#12531;&#12489;
image_flip(image = KaradaBanner)

#&#30011;&#20687;&#12434;&#24038;&#21491;&#21453;&#36578;:image_flop&#12467;&#12510;&#12531;&#12489;
image_flop(image = KaradaBanner)

#&#30011;&#20687;&#12398;&#22615;&#12426;&#12388;&#12406;&#12375;:image_fill&#12467;&#12510;&#12531;&#12489;
#&#22522;&#28310;&#28857;&#12434;&#25351;&#23450;:point&#12458;&#12503;&#12471;&#12519;&#12531;
#&#22659;&#30028;&#38936;&#22495;&#12398;&#25351;&#23450;:fuzz&#12458;&#12503;&#12471;&#12519;&#12531;;0&#12363;&#12425;100&#12398;&#31684;&#22258;
image_fill(image = KaradaBanner, point = "200x130", color = "yellow", fuzz = 20)

#&#30011;&#20687;&#12398;&#12412;&#12363;&#12375;&#20966;&#29702;:image_blur&#12467;&#12510;&#12531;&#12489;
#radius&#12392;sigma&#12398;&#25968;&#20516;&#12434;&#22823;&#12365;&#12367;&#12377;&#12427;&#12392;&#12412;&#12363;&#12375;&#12364;&#24375;&#12356;
image_blur(image = KaradaBanner, radius = 1, sigma = 1)

#&#30011;&#20687;&#12395;&#12494;&#12452;&#12474;&#12434;&#21152;&#12360;&#12427;:image_noise&#12467;&#12510;&#12531;&#12489;
#&#12494;&#12452;&#12474;&#20966;&#29702;&#12434;&#25351;&#23450;:noisetype&#12458;&#12503;&#12471;&#12519;&#12531;;Uniform,Gaussian,Impulse,Laplacian,Poisson&#12364;&#25351;&#23450;&#21487;&#33021;
image_noise(image = KaradaBanner, noisetype = "Poisson")

#&#30011;&#20687;&#12434;&#32257;&#21462;&#12426;:image_charcoal&#12467;&#12510;&#12531;&#12489;
image_charcoal(image = KaradaBanner, radius = 1, sigma = 0.5)

#&#30011;&#20687;&#12398;&#27833;&#32117;&#20966;&#29702;:image_oilpaint&#12467;&#12510;&#12531;&#12489;
image_oilpaint(image = KaradaBanner, radius = 0.5)

#&#30011;&#20687;&#12398;&#12456;&#12483;&#12472;&#20966;&#29702;:image_edge&#12467;&#12510;&#12531;&#12489;
image_edge(image = KaradaBanner, radius = 1)

#&#30011;&#20687;&#12398;&#12493;&#12460;&#20966;&#29702;:image_negate&#12467;&#12510;&#12531;&#12489;
image_negate(image = KaradaBanner)

#&#30011;&#20687;&#12395;&#25991;&#23383;&#12434;&#36861;&#21152;:image_annotate&#12467;&#12510;&#12531;&#12489;
#&#25991;&#23383;&#12434;&#25351;&#23450;:text&#12458;&#12503;&#12471;&#12519;&#12531;
#&#25991;&#23383;&#12469;&#12452;&#12474;&#12434;&#25351;&#23450;:size&#12458;&#12503;&#12471;&#12519;&#12531;
#&#34920;&#31034;&#20301;&#32622;&#12434;&#35373;&#23450;:gravity&#12458;&#12503;&#12471;&#12519;&#12531;;Forget,NorthWest,North,NorthEast,
#West,Center,East,SouthWest
#&#25991;&#23383;&#32972;&#26223;&#33394;:boxcolor&#12458;&#12503;&#12471;&#12519;&#12531;
image_annotate(image = KaradaBanner, text = "Karada-Good", size = 70,
               gravity = "West", color = "green", boxcolor = "lightblue")

#&#35079;&#25968;&#30011;&#20687;&#12434;&#65297;&#12388;&#12398;&#30011;&#20687;&#12395;&#32080;&#21512;&#12377;&#12427;:image_mosaic&#12467;&#12510;&#12531;&#12489;
#&#12363;&#12425;&#12384;&#12395;&#12356;&#12356;&#12418;&#12398;&#12496;&#12490;&#12540;&#12434;&#35501;&#12415;&#36796;&#12415;
KaradaBanner <- image_read('https://www.karada-good.net/wp/wp-content/uploads/2015/08/4d45f652babef5b63a8c2a5f85c9885d.jpg')
#R&#12398;&#12525;&#12468;&#12434;&#35501;&#12415;&#36796;&#12415;
logo <- image_read("https://www.r-project.org/logo/Rlogo.png")
#&#30011;&#20687;&#12434;&#32080;&#21512;&#12375;&#12390;&#12522;&#12469;&#12452;&#12474;
img <- image_scale(c(logo, KaradaBanner), "300x300")
#&#25551;&#20889;
image_mosaic(image = img)

#&#35079;&#25968;&#30011;&#20687;&#12434;&#20006;&#12409;&#12390;&#34920;&#31034;:image_append&#12467;&#12510;&#12531;&#12489;
#&#32294;&#26041;&#21521;&#12395;&#34920;&#31034;:stack&#12458;&#12503;&#12471;&#12519;&#12531;;FALSE&#12391;&#27178;&#26041;&#21521;
AppendImg <- image_append(img, stack = FALSE)
image_background(image = AppendImg, "red")

#&#30011;&#20687;&#38291;&#12434;&#25351;&#23450;&#12375;&#12383;frames&#12391;&#20445;&#31649;:image_morph&#12467;&#12510;&#12531;&#12489;
#&#12501;&#12524;&#12540;&#12512;&#25968;&#12434;&#25351;&#23450;:frames&#12458;&#12503;&#12471;&#12519;&#12531;
GifAnime <- image_morph(img, frames = 30)

#image_morph&#12467;&#12510;&#12531;&#12489;&#12391;&#20316;&#25104;&#12375;&#12383;magick image&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;&#12434;&#12450;&#12491;&#12513;&#21270;:image_animate&#12467;&#12510;&#12531;&#12489;
#fps&#12434;&#25351;&#23450;:fps&#12458;&#12503;&#12471;&#12519;&#12531;
#&#32368;&#12426;&#36820;&#12375;&#12398;&#35373;&#23450;:loop&#12458;&#12503;&#12471;&#12519;&#12531;;0&#12391;&#32368;&#12426;&#36820;&#12375;,1&#12391;&#32368;&#12426;&#36820;&#12375;&#12375;&#12394;&#12356;
image_animate(GifAnime, fps = 10, loop = 0)

#&#21442;&#32771;_&#12464;&#12521;&#12501;&#12395;&#30011;&#20687;&#12434;&#36861;&#21152;;&#12521;&#12473;&#12479;&#12540;&#30011;&#20687;&#12503;&#12525;&#12483;&#12488;&#12392;&#21516;&#12376;&#12391;&#12377;
plot(cars)
rasterImage(image_scale(KaradaBanner, "600x400"), 5, 100, 20, 120)
#ggplo2&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#22580;&#21512;
library("ggplot2")
library("grid")
#rasterGrob&#12467;&#12510;&#12531;&#12489;
RasterData <- rasterGrob(KaradaBanner, interpolate = TRUE)
#annotation_custom&#12467;&#12510;&#12531;&#12489;&#12391;&#12464;&#12521;&#12501;&#12395;&#36861;&#21152;
ggplot(data = cars, aes(speed, dist)) + geom_point() +
  annotation_custom(RasterData, xmin = 3, xmax = 20,
                    ymin = 100, ymax = 120)

出力例

他コマンドは実行してみてください。大変面白いです。

・画像のネガ処理:image_negateコマンド

・参考_グラフに画像を追加:ggplot2パッケージとの組み合わせ

magickggplot2

・image_animateコマンド

preview

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました