| Type: | Package |
| Title: | Advanced Graphics and Image-Processing in R |
| Version: | 2.9.0 |
| Description: | Bindings to 'ImageMagick': the most comprehensive open-source image processing library available. Supports many common formats (png, jpeg, tiff, pdf, etc) and manipulations (rotate, scale, crop, trim, flip, blur, etc). All operations are vectorized via the Magick++ STL meaning they operate either on a single frame or a series of frames for working with layers, collages, or animation. In RStudio images are automatically previewed when printed to the console, resulting in an interactive editing environment. Also includes a graphics device for creating drawing onto images using pixel coordinates. |
| License: | MIT + file LICENSE |
| URL: | https://docs.ropensci.org/magick/https://ropensci.r-universe.dev/magick |
| BugReports: | https://github.com/ropensci/magick/issues |
| SystemRequirements: | ImageMagick++: ImageMagick-c++-devel (rpm) orlibmagick++-dev (deb) |
| VignetteBuilder: | knitr |
| Depends: | R (≥ 4.1.0) |
| Imports: | Rcpp (≥ 0.12.12), magrittr, curl |
| LinkingTo: | Rcpp |
| Suggests: | av, spelling, jsonlite, methods, knitr, rmarkdown, rsvg,webp, pdftools, ggplot2, gapminder, IRdisplay, tesseract,gifski |
| Encoding: | UTF-8 |
| RoxygenNote: | 7.3.2 |
| Language: | en-US |
| NeedsCompilation: | yes |
| Packaged: | 2025-09-07 21:52:50 UTC; jeroen |
| Author: | Jeroen Ooms |
| Maintainer: | Jeroen Ooms <jeroenooms@gmail.com> |
| Repository: | CRAN |
| Date/Publication: | 2025-09-08 14:30:02 UTC |
Magick Image Processing
Description
Themagick package for graphics and image processing in R. Important resources:
R introduction vignette: getting started
Magick++ API andMagick++ STL detailed descriptions of methods and parameters
Details
Documentation is split into the following pages:
analysis - metrics and calculations:
compare,fftanimation - manipulate or combine multiple frames:
animate,morph,mosaic,montage,average,append,applyattributes - image properties:
comment,infocolor - contrast, brightness, colors:
modulate,quantize,map,transparent,background,colorize,contrast,normalize,enhance,equalize,mediancomposite - advanced joining:
composite,border,framedevice - creating graphics and drawing on images
editing - basic image IO:
read,write,convert,join,display,broseeffects - fun effects:
despecle,reducenoise,noise,blur,charcoal,edge,oilpaint,emboss,implode,negategeometry - specify points, areas and sizes using geometry syntax
options - list option types and values supported in your version of ImageMagick
painting - flood fill and annotating text
transform - shape operations:
trim,chop,rotate,resize,scale,samplecrop,flip,flop,deskew,page
See Also
Other image:analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Image Analysis
Description
Functions for image calculations and analysis. This part of the package needs more work.
Usage
image_compare(image, reference_image, metric = "", fuzz = 0)image_compare_dist(image, reference_image, metric = "", fuzz = 0)image_fft(image)Arguments
image | magick image object returned by |
reference_image | another image to compare to |
metric | string with ametricfrommetric_types() such as |
fuzz | relative color distance (value between 0 and 100) to be considered similarin the filling algorithm |
Details
For details seeImage++documentation. Short descriptions:
image_compare calculates a metric by comparing image with a reference image.
image_fft returns Discrete Fourier Transform (DFT) of the image as amagnitude / phase image pair. I wish I knew what this means.
Hereimage_compare() is vectorized over the first argument and returns the diff imagewith the calculated distortion value as an attribute.
See Also
Other image:_index_,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
out1 <- image_blur(logo, 3)out2 <- image_oilpaint(logo, 3)input <- c(logo, out1, out2, logo)if(magick_config()$version >= "6.8.7"){ diff_img <- image_compare(input, logo, metric = "AE") attributes(diff_img)}Image Frames and Animation
Description
Operations to manipulate or combine multiple frames of an image. Details below.
Usage
image_animate( image, fps = 10, delay = NULL, loop = 0, dispose = c("background", "previous", "none"), optimize = FALSE)image_coalesce(image)image_morph(image, frames = 8)image_mosaic(image, operator = NULL)image_flatten(image, operator = NULL)image_average(image)image_append(image, stack = FALSE)image_apply(image, FUN, ...)image_montage( image, geometry = NULL, tile = NULL, gravity = "Center", bg = "white", shadow = FALSE)Arguments
image | magick image object returned by |
fps | frames per second. Ignored if |
delay | delay after each frame, in 1/100 seconds.Must be length 1, or number of frames. If specified, then |
loop | how many times to repeat the animation. Default is infinite. |
dispose | a framedisposal methodfromdispose_types() |
optimize | optimize the |
frames | number of frames to use in output animation |
operator | string with acomposite operatorfromcompose_types() |
stack | place images top-to-bottom (TRUE) or left-to-right (FALSE) |
FUN | a function to be called on each frame in the image |
... | additional parameters for |
geometry | ageometry string that defines the size the individualthumbnail images, and the spacing between them. |
tile | ageometry string for example "4x5 with limits on how thetiled images are to be laid out on the final result. |
gravity | a gravity direction, if the image is smaller than the frame, wherein the frame is the image to be placed. |
bg | a background color string |
shadow | enable shadows between images |
Details
For details seeMagick++ STLdocumentation. Short descriptions:
image_animate coalesces frames by playing the sequence and converting to
gifformat.image_morph expands number of frames by interpolating intermediate frames to blendinto each other when played as an animation.
image_mosaic inlays images to form a single coherent picture.
image_montage creates a composite image by combining frames.
image_flatten merges frames as layers into a single frame using a given operator.
image_average averages frames into single frame.
image_append stack images left-to-right (default) or top-to-bottom.
image_apply applies a function to each frame
Theimage_apply function calls an image function to each frame and joinsresults back into a single image. Because most operations are already vectorizedthis is often not needed. Note thatFUN() should return an image. To apply otherkinds of functions to image frames simply uselapply,vapply, etc.
See Also
Other image:_index_,analysis,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Combine imageslogo <- image_read("https://jeroen.github.io/images/Rlogo.png")oldlogo <- image_read("https://jeroen.github.io/images/Rlogo-old.png")# Create morphing animationboth <- image_scale(c(oldlogo, logo), "400")image_average(image_crop(both))image_animate(image_morph(both, 10))# Create thumbnails from GIFbanana <- image_read("https://jeroen.github.io/images/banana.gif")length(banana)image_average(banana)image_flatten(banana)image_append(banana)image_append(banana, stack = TRUE)# Append images togetherwizard <- image_read("wizard:")image_append(image_scale(c(image_append(banana[c(1,3)], stack = TRUE), wizard)))image_composite(banana, image_scale(logo, "300"))# Break down and combine framesfront <- image_scale(banana, "300")background <- image_background(image_scale(logo, "400"), 'white')frames <- image_apply(front, function(x){image_composite(background, x, offset = "+70+30")})image_animate(frames, fps = 10)# Simple 4x3 montageinput <- rep(logo, 12)image_montage(input, geometry = 'x100+10+10', tile = '4x3', bg = 'pink', shadow = TRUE)# With varying frame sizeinput <- c(wizard, wizard, logo, logo)image_montage(input, tile = '2x2', bg = 'pink', gravity = 'southwest')Convert to EBImage
Description
Convert a Magick image toEBImageclass. Note that EBImage only supports multi-frame images in greyscale.
Usage
as_EBImage(image)Arguments
image | magick image object returned by |
Image Attributes
Description
Attributes are properties of the image that might be present on some imagesand might affect image manipulation methods.
Usage
image_comment(image, comment = NULL)image_info(image)Arguments
image | magick image object returned by |
comment | string to set an image comment |
Details
Each attribute can be get and set with the same function. Theimage_info()function returns a data frame with some commonly used attributes.
See Also
Other image:_index_,analysis,animation,color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
RStudio Graphics AutoViewer
Description
This enables aaddTaskCallback that automatically updates the viewer afterthe state of a magick graphics device has changed. This is enabled by default inRStudio.
Usage
autoviewer_enable()autoviewer_disable()Examples
# Only has effect in RStudio (or other GUI with a viewer):autoviewer_enable()img <- magick::image_graph()plot(1)abline(0, 1, col = "blue", lwd = 2, lty = "solid")abline(0.1, 1, col = "red", lwd = 3, lty = "dotted")autoviewer_disable()abline(0.2, 1, col = "green", lwd = 4, lty = "twodash")abline(0.3, 1, col = "black", lwd = 5, lty = "dotdash")autoviewer_enable()abline(0.4, 1, col = "purple", lwd = 6, lty = "dashed")abline(0.5, 1, col = "yellow", lwd = 7, lty = "longdash")Magick Configuration
Description
ImageMagick can be configured to support various additional tool and formatsvia external libraries. These functions show which features ImageMagick supportson your system.
Usage
coder_info(format)magick_config()magick_set_seed(seed)Arguments
format | image format such as |
seed | integer with seed value to use |
Details
Note thatcoder_info raises an error for unsupported formats.
References
https://imagemagick.org/Magick++/CoderInfo.html
Examples
coder_info("png")coder_info("jpg")coder_info("pdf")coder_info("tiff")coder_info("gif")# Reproduce random imagemagick_set_seed(123)image_blank(200,200, pseudo_image = "plasma:fractal")Image Color
Description
Functions to adjust contrast, brightness, colors of the image. Details below.
Usage
image_modulate(image, brightness = 100, saturation = 100, hue = 100)image_quantize( image, max = 256, colorspace = "rgb", dither = TRUE, treedepth = NULL)image_map(image, map, dither = FALSE)image_ordered_dither(image, threshold_map)image_channel(image, channel = "lightness")image_separate(image, channel = "default")image_combine(image, colorspace = "sRGB", channel = "default")image_transparent(image, color, fuzz = 0)image_background(image, color, flatten = TRUE)image_virtual_pixel(image, virtual_pixel_method)image_colorize(image, opacity, color)image_contrast(image, sharpen = 1)image_normalize(image)image_enhance(image)image_equalize(image)image_median(image, radius = 1)Arguments
image | magick image object returned by |
brightness | modulation of brightness as percentage of the current value (100 for no change) |
saturation | modulation of saturation as percentage of the current value (100 for no change) |
hue | modulation of hue is an absolute rotation of -180 degrees to +180 degrees from thecurrent position corresponding to an argument range of 0 to 200 (100 for no change) |
max | preferred number of colors in the image. The actual number of colors in the image maybe less than your request, but never more. |
colorspace | string with a |
dither | a boolean (defaults to |
treedepth | depth of the quantization color classification tree. Values of 0 or 1 allowselection of the optimal tree depth for the color reduction algorithm. Values between 2 and 8may be used to manually adjust the tree depth. |
map | reference image to map colors from |
threshold_map | A string giving the dithering pattern to use. Seethe ImageMagick documentationfor possible values |
channel | a string with achannel fromchannel_types for example |
color | a validcolor string such as |
fuzz | relative color distance (value between 0 and 100) to be considered similarin the filling algorithm |
flatten | should image be flattened before writing? This also replacestransparency with background color. |
virtual_pixel_method | a string with avirtual pixel method fromvirtual_pixel_methods. |
opacity | percentage of opacity used for coloring |
sharpen | enhance intensity differences in image |
radius | replace each pixel with the median color in a circular neighborhood |
Details
For details seeMagick++ STLdocumentation. Short descriptions:
image_modulate adjusts brightness, saturation and hue of image relative to current.
image_quantize reduces number of unique colors in the image.
image_ordered_dither reduces number of unique colors using a dithering threshold map.
image_map replaces colors of image with the closest color from a reference image.
image_channel extracts a single channel from an image and returns as grayscale.
image_transparent sets pixels approximately matching given color to transparent.
image_background sets background color. When image is flattened, transparent pixels get background color.
image_colorize overlays a solid color frame using specified opacity.
image_contrast enhances intensity differences in image
image_normalize increases contrast by normalizing the pixel values to span the full range of colors
image_enhance tries to minimize noise
image_equalize equalizes using histogram equalization
image_median replaces each pixel with the median color in a circular neighborhood
image_virtual_pixel sets thevirtual pixel filling method to use when a raw distortion transformation (e.g.image_distort) introduces new pixels in the image.Some high-level transformations (e.g.image_rotate andimage_shear) will override the virtual pixel value with a default one.
Note thatcolors are also determined by image propertiesimagetype andcolorspacewhich can be modified viaimage_convert().
See Also
Other image:_index_,analysis,animation,attributes(),composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# manually adjust colorslogo <- image_read("logo:")image_modulate(logo, brightness = 200)image_modulate(logo, saturation = 150)image_modulate(logo, hue = 200)# Reduce image to 10 different colors using various spacesimage_quantize(logo, max = 10, colorspace = 'gray')image_quantize(logo, max = 10, colorspace = 'rgb')image_quantize(logo, max = 10, colorspace = 'cmyk')image_ordered_dither(logo, 'o8x8')# Change background colortranslogo <- image_transparent(logo, 'white')image_background(translogo, "pink", flatten = TRUE)# Compare to flood-fill method:image_fill(logo, "pink", fuzz = 20)# Black virtual pixel on a 45° rotationlogo |> image_virtual_pixel("Black") |> image_distort("AffineProjection", sqrt(0.5) * c(1,1,-1,1,0,0), bestfit = TRUE)# Tile virtual pixel on a 45° rotationlogo |> image_virtual_pixel("Tile") |> image_distort("AffineProjection", sqrt(0.5) * c(1,1,-1,1,0,0), bestfit = TRUE)# Other color tweaksimage_colorize(logo, 50, "red")image_contrast(logo)image_normalize(logo)image_enhance(logo)image_equalize(logo)image_median(logo)# Alternate way to convert into black-whiteimage_convert(logo, type = 'grayscale')Image Composite
Description
Similar to the ImageMagickcomposite utility: compose an image on top of another one using aCompositeOperator.
Usage
image_composite( image, composite_image, operator = "atop", offset = "+0+0", gravity = "northwest", compose_args = "")image_border(image, color = "lightgray", geometry = "10x10", operator = "copy")image_frame(image, color = "lightgray", geometry = "25x25+6+6")image_shadow_mask(image, geometry = "50x10+30+30")image_shadow( image, color = "black", bg = "none", geometry = "50x10+30+30", operator = "copy", offset = "+20+20")image_shade(image, azimuth = 30, elevation = 30, color = FALSE)Arguments
image | magick image object returned by |
composite_image | composition image |
operator | string with acomposite operatorfromcompose_types() |
offset | string with either agravity_type or ageometry_pointto set position of top image. |
gravity | string withgravityvalue fromgravity_types. |
compose_args | additional arguments needed for some composite operations |
color | Set to true to shade the red, green, and blue components of the image. |
geometry | ageometry stringto set height and width of the border, e.g. |
bg | background color |
azimuth | position of light source |
elevation | position of light source |
Details
Theimage_composite function is vectorized over both image arguments: if the first image hasn frames and the secondm frames, the output image will containn *m frames.
Theimage_border function creates a slightly larger solid color frame and then composes theoriginal frame on top. Theimage_frame function is similar but has an additional feature tocreate a shadow effect on the border (which is really ugly).
See Also
Other image:_index_,analysis,animation,attributes(),color,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Compose images using one of many operatorsimlogo <- image_scale(image_read("logo:"), "x275")rlogo <- image_read("https://jeroen.github.io/images/Rlogo-old.png")# Standard is atopimage_composite(imlogo, rlogo)# Same as 'blend 50' in the command lineimage_composite(imlogo, rlogo, operator = "blend", compose_args="50")# Offset can be geometry or gravityimage_composite(logo, rose, offset = "+100+100")image_composite(logo, rose, gravity = "East")# Add a border frame around the imageimage_border(imlogo, "red", "10x10")image_frame(imlogo)image_shadow(imlogo)image_shade(imlogo)Set encoder defines
Description
So called 'defines' are properties that are passed along to externalfilters and libraries. Usually defines are used inimage_read orimage_write to control the image encoder/decoder, but you can alsoset these manually on the image object.
Usage
image_set_defines(image, defines)Arguments
image | magick image object returned by |
defines | a named character vector with extra options to control reading.These are the |
Details
The defines values must be a character string, where the names containthe defines keys. Each name must be of the format "enc:key" where thefirst part is the encoder or filter to which the key is passed. Forexample"png:...." defines can control the encoding and decoding ofpng images.
Theimage_set_defines function does not make a copy of the image, sothe defined values remain in the image object until they are overwrittenor unset.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Write an imagex <- image_read("https://jeroen.github.io/images/frink.png")image_write(x, "frink.png")# Pass some properties to PNG encoderdefines <- c("png:compression-filter" = "1", "png:compression-level" = "0")image_set_defines(x, defines)image_write(x, "frink-uncompressed.png")# Unset propertiesdefines[1:2] = NAimage_set_defines(x, defines)image_write(x, "frink-final.png")# Compare size and cleanupfile.info(c("frink.png", "frink-uncompressed.png", "frink-final.png"))unlink(c("frink.png", "frink-uncompressed.png", "frink-final.png"))Magick Graphics Device
Description
Graphics device that produces a Magick image. Can either be used like a regulardevice for making plots, or alternatively viaimage_draw to open a devicewhich draws onto an existing image using pixel coordinates. The latter is vectorized,i.e. drawing operations are applied to each frame in the image.
Usage
image_graph( width = 800, height = 600, bg = "white", pointsize = 12, res = 72, clip = TRUE, antialias = TRUE)image_draw(image, pointsize = 12, res = 72, antialias = TRUE, ...)image_capture()Arguments
width | in pixels |
height | in pixels |
bg | background color |
pointsize | size of fonts |
res | resolution in pixels |
clip | enable clipping in the device. Because clipping can slow things downa lot, you can disable it if you don't need it. |
antialias | TRUE/FALSE: enables anti-aliasing for text and strokes |
image | an existing image on which to start drawing |
... | additional device parameters passed toplot.window such as |
Details
The device is a relatively recent feature of the package. It should support alloperations but there might still be small inaccuracies. Also it is a bit slower thansome of the other devices, in particular for rendering text and clipping. Hopefullythis can be optimized in the next version.
By defaultimage_draw sets all margins to 0 and uses graphics coordinates tomatch image size in pixels (width x height) where(0,0) is the top left corner.Note that this means the y axis increases from top to bottom which is the oppositeof typical graphics coordinates. You can override all this by passing customxlim,ylim ormar values toimage_draw.
Theimage_capture function returns the current device as an image. This onlyworks if the current device is a magick device or supportsdev.capture.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Regular imagefrink <- image_read("https://jeroen.github.io/images/frink.png")# Produce image using graphics devicefig <- image_graph(res = 96)ggplot2::qplot(mpg, wt, data = mtcars, colour = cyl)dev.off()# Combineout <- image_composite(fig, frink, offset = "+70+30")print(out)# Or paint over an existing imageimg <- image_draw(frink)rect(20, 20, 200, 100, border = "red", lty = "dashed", lwd = 5)abline(h = 300, col = 'blue', lwd = '10', lty = "dotted")text(10, 250, "Hoiven-Glaven", family = "monospace", cex = 4, srt = 90)palette(rainbow(11, end = 0.9))symbols(rep(200, 11), seq(0, 400, 40), circles = runif(11, 5, 35), bg = 1:11, inches = FALSE, add = TRUE)dev.off()print(img)# Vectorized example with custom coordinatesearth <- image_read("https://jeroen.github.io/images/earth.gif")img <- image_draw(earth, xlim = c(0,1), ylim = c(0,1))rect(.1, .1, .9, .9, border = "red", lty = "dashed", lwd = 5)text(.5, .9, "Our planet", cex = 3, col = "white")dev.off()print(img)Edge / Line Detection
Description
Best results are obtained by finding edges withimage_canny() andthen performing Hough-line detection on the edge image.
Usage
image_edge(image, radius = 1)image_canny(image, geometry = "0x1+10%+30%")image_hough_draw( image, geometry = NULL, color = "red", bg = "transparent", size = 3, overlay = FALSE)image_hough_txt(image, geometry = NULL, format = c("mvg", "svg"))Arguments
image | magick image object returned by |
radius | edge size in pixels |
geometry | geometry string, see details. |
color | a validcolor string such as |
bg | background color |
size | size in points to draw the line |
overlay | composite the drawing atop the input image. Only for |
format | output format of the text, either |
Details
For Hough-line detection, the geometry format is{W}x{H}+{threshold}defining the size and threshold of the filter used to find 'peaks' inthe intermediate search image. For canny edge detection the format is{radius}x{sigma}+{lower%}+{upper%}. More details and examples areavailable at theimagemagick website.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
if(magick_config()$version > "6.8.9"){shape <- demo_image("shape_rectangle.gif")rectangle <- image_canny(shape)rectangle |> image_hough_draw('5x5+20')rectangle |> image_hough_txt(format = 'svg') |> cat()}Image Editing
Description
Read, write and join or combine images. All image functions are vectorized, meaningthey operate either on a single frame or a series of frames (e.g. a collage, video,or animation). Besides paths and URLs,image_read() supports commonly used bitmapand raster object types.
Usage
image_read( path, density = NULL, depth = NULL, strip = FALSE, coalesce = TRUE, defines = NULL)image_read_svg(path, width = NULL, height = NULL)image_read_pdf(path, pages = NULL, density = 300, password = "")image_read_video(path, fps = 1, format = "png")image_write( image, path = NULL, format = NULL, quality = NULL, depth = NULL, density = NULL, comment = NULL, flatten = FALSE, defines = NULL, compression = NULL)image_convert( image, format = NULL, type = NULL, colorspace = NULL, depth = NULL, antialias = NULL, matte = NULL, interlace = NULL, profile = NULL)image_data(image, channels = NULL, frame = 1)image_raster(image, frame = 1, tidy = TRUE)image_display(image, animate = TRUE)image_browse(image, browser = getOption("browser"))image_strip(image)image_blank(width, height, color = "none", pseudo_image = "", defines = NULL)image_destroy(image)image_join(...)image_attributes(image)image_get_artifact(image, artifact = "")demo_image(path)Arguments
path | a file, url, or raster object or bitmap array |
density | resolution to render pdf or svg |
depth | color depth (either 8 or 16) |
strip | drop image comments and metadata |
coalesce | automatically |
defines | a named character vector with extra options to control reading.These are the |
width | in pixels |
height | in pixels |
pages | integer vector with page numbers. Defaults to all pages. |
password | userpassword to open protected pdf files |
fps | how many images to capture per second of video. Set to |
format | output format such as |
image | magick image object returned by |
quality | number between 0 and 100 for jpeg quality. Defaults to 75. |
comment | text string added to the image metadata for supported formats |
flatten | should image be flattened before writing? This also replacestransparency with background color. |
compression | a string with compression type fromcompress_types |
type | string withimagetypevalue fromimage_types for example |
colorspace | string with a |
antialias | enable anti-aliasing for text and strokes |
matte | set to |
interlace | string withinterlace |
profile | path to file with ICC color profile |
channels | string with image channel(s) for example |
frame | integer setting which frame to extract from the image |
tidy | converts raster data to long form for use withgeom_raster.If |
animate | support animations in the X11 display |
browser | argument passed tobrowseURL |
color | a validcolor string such as |
pseudo_image | string withpseudo imagespecification for example |
... | several images or lists of images to be combined |
artifact | string with name of the artifact to extract, see theimage_deskew for an example. |
Details
All standard base vector methods such as[,[[,c(),as.list(),as.raster(),rev(),length(), andprint() can be used to work with magickimage objects. Use the standardimg[i] syntax to extract a subset of the framesfrom an image. Theimg[[i]] method is an alias forimage_data() which extractsa single frame as a raw bitmap matrix with pixel values.
For reading svg or pdf it is recommended to useimage_read_svg() andimage_read_pdf()if thersvg andpdftools R packages are available.These functions provide more rendering options (including rendering of literal svg) andbetter quality than built-in svg/pdf rendering delegates from imagemagick itself.
X11 is required forimage_display() which is only works on some platforms. A moreportable method isimage_browse() which opens the image in a browser. RStudio hasan embedded viewer that does this automatically which is quite nice.
Image objects are automatically released by the garbage collector when they are no longerreachable. Because the GC only runs once in a while, you can also callimage_destroy()explicitly to release the memory immediately. This is usually only needed if you createa lot of images in a short period of time, and you might run out of memory.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Download image from the webfrink <- image_read("https://jeroen.github.io/images/frink.png")worldcup_frink <- image_fill(frink, "orange", "+100+200", 20)image_write(worldcup_frink, "output.png")# extract raw bitmap arraybitmap <- frink[[1]]# replace pixels with #FF69B4 ('hot pink') and convert back to imagebitmap[,50:100, 50:100] <- as.raw(c(0xff, 0x69, 0xb4, 0xff))image_read(bitmap)# Plot to graphics device via legacy raster formatraster <- as.raster(frink)par(ask=FALSE)plot(raster)# Read bitmap arrays from other image packagesdownload.file("https://jeroen.github.io/images/example.webp", "example.webp", mode = 'wb')if(require(webp)) image_read(webp::read_webp("example.webp"))unlink(c("example.webp", "output.png"))if(require(rsvg)){tiger <- image_read_svg("http://jeroen.github.io/images/tiger.svg")svgtxt <- '<?xml version="1.0" encoding="UTF-8"?><svg width="400" height="400" viewBox="0 0 400 400" fill="none"> <circle fill="steelblue" cx="200" cy="200" r="100" /> <circle fill="yellow" cx="200" cy="200" r="90" /></svg>'circles <- image_read_svg(svgtxt)}if(require(pdftools))image_read_pdf(file.path(R.home('doc'), 'NEWS.pdf'), pages = 1, density = 100)# create a solid canvasimage_blank(600, 400, "green")image_blank(600, 400, pseudo_image = "radial-gradient:purple-yellow")image_blank(200, 200, pseudo_image = "gradient:#3498db-#db3a34", defines = c('gradient:direction' = 'east'))Image Effects
Description
High level effects applied to an entire image.These are mostly just for fun.
Usage
image_despeckle(image, times = 1L)image_reducenoise(image, radius = 1L)image_noise(image, noisetype = "gaussian")image_blur(image, radius = 1, sigma = 0.5)image_motion_blur(image, radius = 1, sigma = 0.5, angle = 0)image_charcoal(image, radius = 1, sigma = 0.5)image_oilpaint(image, radius = 1)image_emboss(image, radius = 1, sigma = 0.5)image_implode(image, factor = 0.5)image_negate(image)Arguments
image | magick image object returned by |
times | number of times to repeat the despeckle operation |
radius | radius, in pixels, for various transformations |
noisetype | string with anoisetype valuefromnoise_types. |
sigma | the standard deviation of the Laplacian, in pixels. |
angle | angle, in degrees, for various transformations |
factor | image implode factor (special effect) |
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,fx,geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
logo <- image_read("logo:")image_despeckle(logo)image_reducenoise(logo)image_noise(logo)image_blur(logo, 10, 10)image_motion_blur(logo, 10, 10, 45)image_charcoal(logo)image_oilpaint(logo, radius = 3)image_emboss(logo)image_implode(logo)image_negate(logo)Image FX
Description
Apply a custom anfx expression to the image.
Usage
image_fx(image, expression = "p", channel = NULL)image_fx_sequence(image, expression = "p")Arguments
image | magick image object returned by |
expression | string with anfx expression |
channel | a value of |
Details
There are two different interfaces. Theimage_fx function simply appliesthe same fx to each frame in the input image. Theimage_fx_sequence functionon the other hand treats the entire input vector as a sequence, allowing youto apply an expression with multiple input images. See examples.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),geometry,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Show image_fx() expressionimg <- image_convert(logo, colorspace = "Gray")gradient_x <- image_convolve(img, kernel = "Prewitt")gradient_y <- image_convolve(img, kernel = "Prewitt:90")gradient <- c(image_fx(gradient_x, expression = "p^2"), image_fx(gradient_y, expression = "p^2"))gradient <- image_flatten(gradient, operator = "Plus")#gradient <- image_fx(gradient, expression = "sqrt(p)")gradientimage_fx(img, expression = "pow(p, 0.5)")image_fx(img, expression = "rand()")# Use multiple source imagesinput <- c(logo, image_flop(logo))image_fx_sequence(input, "(u+v)/2")Geometry Helpers
Description
ImageMagick uses a handy geometry syntax to specify coordinates and shapesfor use in image transformations. You can either specify these manually asstrings or use the helper functions below.
Usage
geometry_point(x, y)geometry_area(width = NULL, height = NULL, x_off = 0, y_off = 0)geometry_size_pixels(width = NULL, height = NULL, preserve_aspect = TRUE)geometry_size_percent(width = 100, height = NULL)Arguments
x | left offset in pixels |
y | top offset in pixels |
width | in pixels |
height | in pixels |
x_off | offset in pixels on x axis |
y_off | offset in pixels on y axis |
preserve_aspect | if FALSE, resize to width and height exactly, loosing originalaspect ratio. Only one of |
Details
SeeImageMagick Manualfor details about the syntax specification.Examples ofgeometry strings:
"500x300"–Resize image keeping aspect ratio, such that width does not exceed 500 and the height does not exceed 300."500x300!"–Resize image to 500 by 300, ignoring aspect ratio"500x"–Resize width to 500 keep aspect ratio"x300"–Resize height to 300 keep aspect ratio"50%x20%"–Resize width to 50 percent and height to 20 percent of original"500x300+10+20"–Crop image to 500 by 300 at position 10,20
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,morphology,ocr,options(),painting,segmentation,transform(),video
Examples
# Specify a pointlogo <- image_read("logo:")image_annotate(logo, "Some text", location = geometry_point(100, 200), size = 24)# Specify image areaimage_crop(logo, geometry_area(300, 300), repage = FALSE)image_crop(logo, geometry_area(300, 300, 100, 100), repage = FALSE)# Specify image sizeimage_resize(logo, geometry_size_pixels(300))image_resize(logo, geometry_size_pixels(height = 300))image_resize(logo, geometry_size_pixels(300, 300, preserve_aspect = FALSE))# resize relative to current sizeimage_resize(logo, geometry_size_percent(50))image_resize(logo, geometry_size_percent(50, 20))Image to ggplot
Description
Create a ggplot with axes set to pixel coordinates and plot the raster imageon it usingggplot2::annotation_raster. See examples for how to plot an imageonto an existing ggplot.
Usage
image_ggplot(image, interpolate = FALSE)Arguments
image | magick image object returned by |
interpolate | passed toggplot2::annotation_raster |
Examples
# Plot with base Rplot(logo)# Plot image with ggplot2library(ggplot2)myplot <- image_ggplot(logo)myplot + ggtitle("Test plot")# Show that coordinates are reversed:myplot + theme_classic()# Or add to plot as annotationimage <- image_fill(logo, 'none')raster <- as.raster(image)myplot <- qplot(mpg, wt, data = mtcars)myplot + annotation_raster(raster, 25, 35, 3, 5)# Or overplot image using gridlibrary(grid)qplot(speed, dist, data = cars, geom = c("point", "smooth"))grid.raster(image)Morphology
Description
Apply a morphology method. This is a very flexible function whichcan be used to apply any morphology method with custom parameters.Seeimagemagick websitefor examples.
Usage
image_morphology( image, method = "convolve", kernel = "Gaussian", iterations = 1, opts = list())image_convolve( image, kernel = "Gaussian", iterations = 1, scaling = NULL, bias = NULL)Arguments
image | magick image object returned by |
method | a string with a valid method from |
kernel | either a square matrix or a string. The string can either be aparameterizedkerneltype such as: |
iterations | number of iterations |
opts | a named list or character vector with custom attributes |
scaling | string with kernel scaling. The special flag |
bias | output bias string, for example |
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,ocr,options(),painting,segmentation,transform(),video
Examples
#example from IM website:if(magick_config()$version > "6.8.8"){pixel <- image_blank(1, 1, 'white') |> image_border('black', '5x5')# See the effect of Dilate methodpixel |> image_scale('800%')pixel |> image_morphology('Dilate', "Diamond") |> image_scale('800%')# These produce the same output:pixel |> image_morphology('Dilate', "Diamond", iter = 3) |> image_scale('800%')pixel |> image_morphology('Dilate', "Diamond:3") |> image_scale('800%')# Plus examplepixel |> image_morphology('Dilate', "Plus", iterations = 2) |> image_scale('800%')# Rose examplesrose |> image_morphology('ErodeI', 'Octagon', iter = 3)rose |> image_morphology('DilateI', 'Octagon', iter = 3)rose |> image_morphology('OpenI', 'Octagon', iter = 3)rose |> image_morphology('CloseI', 'Octagon', iter = 3)# Edge detectionman <- demo_image('man.gif')man |> image_morphology('EdgeIn', 'Octagon')man |> image_morphology('EdgeOut', 'Octagon')man |> image_morphology('Edge', 'Octagon')# Octagonal Convex Hull man |> image_morphology('Close', 'Diamond') |> image_morphology('Thicken', 'ConvexHull', iterations = 1)# Thinning down to a Skeletonman |> image_morphology('Thinning', 'Skeleton', iterations = 1)# Specify custom kernel matrix usingn a string:img <- demo_image("test_mag.gif")i <- image_convolve(img, kernel = '4x5: 0 -1 0 0 -1 +1 -1 0 -1 +1 -1 0 -1 +1 +1 -1 0 -1 -1 0 ', bias = "50%")}Image Text OCR
Description
Extract text from an image using thetesseract package.
Usage
image_ocr(image, language = "eng", HOCR = FALSE, ...)image_ocr_data(image, language = "eng", ...)Arguments
image | magick image object returned by |
language | passed totesseract. To install additional languages seeinstructions intesseract_download(). |
HOCR | if |
... | additional parameters passed totesseract |
Details
To use this function you need to tesseract first:
install.packages("tesseract")Best results are obtained if you set the correct language intesseract.To install additional languages see instructions intesseract_download().
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,options(),painting,segmentation,transform(),video
Examples
if(require("tesseract")){img <- image_read("http://jeroen.github.io/images/testocr.png")image_ocr(img)image_ocr_data(img)}Magick Options
Description
List option types and values supported in your version of ImageMagick. Fordescriptions seeImageMagick Enumerations.
Usage
magick_options()magick_fonts()option_types()filter_types()metric_types()dispose_types()compose_types()colorspace_types()channel_types()image_types()kernel_types()noise_types()gravity_types()orientation_types()morphology_types()style_types()decoration_types()compress_types()distort_types()virtual_pixel_methods()dump_option_info(option = "font")Arguments
option | one of theoption_types |
Details
Thedump_option_info function is equivalent to callingconvert -list [option] onthe command line. It does not return anything, it only makes ImageMagick printstuff to the console, use only for debugging.
References
ImageMagick Manual:Enumerations
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,painting,segmentation,transform(),video
Image Painting
Description
Theimage_fill() function performs flood-fill by painting starting point and allneighboring pixels of approximately the same color. Annotate prints some text onthe image.
Usage
image_fill(image, color, point = "+1+1", fuzz = 0, refcolor = NULL)image_annotate( image, text, gravity = "northwest", location = "+0+0", degrees = 0, size = 10, font = "", style = "normal", weight = 400, kerning = 0, decoration = NULL, color = NULL, strokecolor = NULL, strokewidth = NULL, boxcolor = NULL)Arguments
image | magick image object returned by |
color | a validcolor string such as |
point | a geometry_point string indicating the starting point of the flood-fill |
fuzz | relative color distance (value between 0 and 100) to be considered similarin the filling algorithm |
refcolor | if set, |
text | character vector of length equal to 'image' or length 1 |
gravity | string withgravityvalue fromgravity_types. |
location | geometry string with location relative to |
degrees | rotates text around center point |
size | font-size in pixels |
font | string with font family such as |
style | value ofstyle_types for example |
weight | thickness of the font, 400 is normal and 700 is bold, see |
kerning | increases or decreases whitespace between letters |
decoration | value ofdecoration_types for example |
strokecolor | acolor stringadds a stroke (border around the text) |
strokewidth | set the strokewidth of the border around the text |
boxcolor | acolor stringfor background color that annotation text is rendered on. |
Details
Note that more sophisticated drawing mechanisms are available via the graphicsdevice usingimage_draw.
Setting a font, weight, style only works if your imagemagick is compiledwith fontconfig support.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),segmentation,transform(),video
Examples
logo <- image_read("logo:")logo <- image_background(logo, 'white')image_fill(logo, "pink", point = "+450+400")image_fill(logo, "pink", point = "+450+400", fuzz = 25)# Add some text to an imageimage_annotate(logo, "This is a test")image_annotate(logo, "CONFIDENTIAL", size = 50, color = "red", boxcolor = "pink", degrees = 30, location = "+100+100")# Setting fonts requires fontconfig support (and that you have the font)image_annotate(logo, "The quick brown fox", font = "monospace", size = 50)Objects exported from other packages
Description
These objects are imported from other packages. Follow the linksbelow to see their documentation.
- magrittr
Image Segmentation
Description
Basic image segmentation like connected components labelling, blob extraction and fuzzy c-means
Usage
image_connect(image, connectivity = 4)image_split(image, keep_color = TRUE)image_fuzzycmeans(image, min_pixels = 1, smoothing = 1.5)Arguments
image | magick image object returned by |
connectivity | number neighbor colors which are considered part of a unique object |
keep_color | if TRUE the output images retain the color of the input pixel.If FALSE all matching pixels are set black to retain only the image mask. |
min_pixels | the minimum number of pixels contained in a hexahedra before it can be considered valid (expressed as a percentage) |
smoothing | the smoothing threshold which eliminates noise in the second derivative of the histogram (higher values gives smoother second derivative) |
Details
image_connect Connect adjacent pixels with the same pixel intensities to do blob extraction
image_split Splits the image according to pixel intensities
image_fuzzycmeans Fuzzy c-means segmentation of the histogram of color components
image_connect performs blob extraction by scanning the image, pixel-by-pixel from top-leftto bottom-right where regions of adjacent pixels which share the same set of intensity valuesget combined.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,transform(),video
Examples
# Split an image by colorimg <- image_quantize(logo, 4)layers <- image_split(img)layers# This returns the original imageimage_flatten(layers)# From the IM websiteobjects <- image_convert(demo_image("objects.gif"), colorspace = "Gray")objects# Split image in blobs of connected pixel levelsif(magick_config()$version > "6.9.0"){objects |> image_connect(connectivity = 4) |> image_split()# Fuzzy c-meansimage_fuzzycmeans(logo)logo |> image_convert(colorspace = "HCL") |> image_fuzzycmeans(smoothing = 5)}Image thresholding
Description
Thresholding an image can be used for simple and straightforward image segmentation.The functionimage_threshold() allows to do black and white thresholding whereasimage_lat() performs local adaptive thresholding.
Usage
image_threshold( image, type = c("black", "white"), threshold = "50%", channel = NULL)image_level( image, black_point = 0, white_point = 100, mid_point = 1, channel = NULL)image_lat(image, geometry = "10x10+5%")Arguments
image | magick image object returned by |
type | type of thresholding, either one of lat, black or white (see details below) |
threshold | pixel intensity threshold percentage for black or white thresholding |
channel | a value of |
black_point | value between 0 and 100, the darkest color in the image |
white_point | value between 0 and 100, the lightest color in the image |
mid_point | value between 0 and 10 used for gamma correction |
geometry | pixel window plus offset for LAT algorithm |
Details
image_threshold(type = "black"): Forces all pixels below the threshold into black while leaving all pixelsat or above the threshold unchangedimage_threshold(type = "white"): Forces all pixels above the threshold into white while leaving all pixelsat or below the threshold unchangedimage_lat(): Local Adaptive Thresholding. Looks in a box (width x height) around thepixel neighborhood if the pixel value is bigger than the average minus an offset.
Examples
test <- image_convert(logo, colorspace = "Gray")image_threshold(test, type = "black", threshold = "50%")image_threshold(test, type = "white", threshold = "50%")# Turn image into BWtest |> image_threshold(type = "white", threshold = "50%") |> image_threshold(type = "black", threshold = "50%")# adaptive thresholdingimage_lat(test, geometry = '10x10+5%')Image Transform
Description
Basic transformations like rotate, resize, crop and flip. Thegeometry syntaxis used to specify sizes and areas.
Usage
image_trim(image, fuzz = 0)image_chop(image, geometry)image_rotate(image, degrees)image_resize(image, geometry = NULL, filter = NULL)image_scale(image, geometry = NULL)image_sample(image, geometry = NULL)image_crop(image, geometry = NULL, gravity = NULL, repage = TRUE)image_extent(image, geometry, gravity = "center", color = "none")image_flip(image)image_flop(image)image_deskew(image, threshold = 40)image_deskew_angle(image, threshold = 40)image_page(image, pagesize = NULL, density = NULL)image_repage(image)image_orient(image, orientation = NULL)image_shear(image, geometry = "10x10", color = "none")image_distort(image, distortion = "perspective", coordinates, bestfit = FALSE)Arguments
image | magick image object returned by |
fuzz | relative color distance (value between 0 and 100) to be considered similarin the filling algorithm |
geometry | ageometry string specifying area (for cropping) or size (for resizing). |
degrees | value between 0 and 360 for how many degrees to rotate |
filter | string withfiltertype from:filter_types |
gravity | string withgravityvalue fromgravity_types. |
repage | resize the canvas to the cropped area |
color | a validcolor string such as |
threshold | straightens an image. A threshold of 40 works for most images. |
pagesize | geometry string with preferred size and location of an image canvas |
density | geometry string with vertical and horizontal resolution in pixels ofthe image. Specifies an image density when decoding a Postscript or PDF. |
orientation | string to set image orientation one of theorientation_types.If |
distortion | string to set image orientation one of thedistort_types. |
coordinates | numeric vector (typically of length 12) with distortion coordinates |
bestfit | if set to |
Details
For details seeMagick++ STLdocumentation. Short descriptions:
image_trim removes edges that are the background color from the image.
image_chop removes vertical or horizontal subregion of image.
image_crop cuts out a subregion of original image
image_rotate rotates and increases size of canvas to fit rotated image.
image_deskew auto rotate to correct skewed images
image_resize resizes using customfilterType
image_scale andimage_sample resize using simple ratio and pixel sampling algorithm.
image_flip andimage_flop invert image vertically and horizontally
The most powerful resize function isimage_resize which allows for settinga custom resize filter. Output ofimage_scale is similar toimage_resize(img, filter = "point").
For resize operations it holds that if nogeometry is specified, all framesare rescaled to match the top frame.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,video
Examples
logo <- image_read("logo:")logo <- image_scale(logo, "400")image_trim(logo)image_chop(logo, "100x20")image_rotate(logo, 45)# Small imagerose <- image_convert(image_read("rose:"), "png")# Resize to 400 width or height:image_resize(rose, "400x")image_resize(rose, "x400")# Resize keeping ratioimage_resize(rose, "400x400")# Resize, force size losing ratioimage_resize(rose, "400x400!")# Different filtersimage_resize(rose, "400x", filter = "Triangle")image_resize(rose, "400x", filter = "Point")# simple pixel resizeimage_scale(rose, "400x")image_sample(rose, "400x")image_crop(logo, "400x400+200+200")image_extent(rose, '200x200', color = 'pink')image_flip(logo)image_flop(logo)skewed <- image_rotate(logo, 5)deskewed <- image_deskew(skewed)attr(deskewed, 'angle')if(magick_config()$version > "6.8.6") image_orient(logo)image_shear(logo, "10x10")building <- demo_image('building.jpg')image_distort(building, 'perspective', c(7,40,4,30,4,124,4,123,85,122,100,123,85,2,100,30))Write Video
Description
High quality video / gif exporter based on external packagesgifskiandav.
Usage
image_write_video(image, path = NULL, framerate = 10, ...)image_write_gif(image, path = NULL, delay = 1/10, ...)Arguments
image | magick image object returned by |
path | filename of the output gif or video. This is also the return value. |
framerate | frames per second, passed toav_encode_video |
... | additional parameters passed toav_encode_video andgifski. |
delay | duration of each frame in seconds (inverse of framerate) |
Details
This requires an image with multiple frames. The GIF exporter accomplishes the samething asimage_animate but much faster and with better quality.
See Also
Other image:_index_,analysis,animation,attributes(),color,composite,defines,device,edges,editing,effects(),fx,geometry,morphology,ocr,options(),painting,segmentation,transform()
Example Images
Description
Example images included with ImageMagick:
Usage
logoFormat
An object of classmagick-image of length 1.
Details
logo: ImageMagick Logo, 640x480wizard: ImageMagick Wizard, 480x640rose: Picture of a rose, 70x46granite: Granite texture pattern, 128x128