ragg_png = function(...) { ragg::agg_png(..., units = "in", res = 144) } knitr::opts_chunk$set(dev = "ragg_png", fig.ext = "png") knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
Load the package
library(Rigatoni)
Set your working directory
setwd("/path/to/the/directory/that/contains/images/to/analyse")
We will use the peanut_pod.jpg
example image that is provided as part of the package. This is peanut pods acquired on a flat bed scanner with a green background.
f = system.file("images", "peanut_pod.jpg", package="Rigatoni") img = readImage(f) display(img, method="raster")
The first thing to do is to get a range of color (hue) values for the background of the image that will be further used for applying a color threshold.
mythreshold <- get_huethr_values(img) mythreshold
The get_huethr_values
function allows to click twice on the distribution. On the example below, the second peak represents the background. Click on both sides of the peak will return a vector of 2 values.
mythreshold <- get_huethr_values(img, return.values = FALSE) arrows(x0 = c(0.22,0.35), y1=c(0,0), x1 = c(0.22,0.35), y0 = c(10000,10000), length = 0.1, col = "red") text(x = c(0.22,0.35), y=c(15000,15000), labels = c("Click\nhere","and\nhere"), cex=0.5, col = "red") mythreshold <- c(60, 90) mythreshold
Once the hue threshold values are determined it can be used to find features in the image using the krnel
function
pods<-krnel(img = img, resizw = 1000, huethres = mythreshold, minsize = 200, maxsize = 20000, save.outline = F)
Note that the img
parameter can either be an Image object previously obtained with EBImage::readImage
or the name of an image file that is in your working directory (or it's full path if located elsewhere).
The resizw
parameter allows to reduce image size by providing the width of the image that will be analyzed (height will be modified accordingly to respect h/w ratio). Reducing the size of the image improves the performance of features detection and is important when many images need to be analysed sequentially.
The minsize
and maxsize
parameters allow to fix the minimum and maximum size (area) of the objects that will be captured in the image. Note that the two parameters are expressed relatively to the resized image.
The object that is returned by the krnel
function is of S3 class.. krnel
It is a list with four components:
EBImage::computeFeatures
. It also includes bounding box width and height aka Feret min and max diameter.bbox : a list with as many elements as the number of detected features. Each element is a list with 4 components: $pts
that contains the coordinates of each corner of the bounding box, $width
, $height
, and $angle
params : a list with the analysis parameters. can be used for further plotting
The features of the pods
object can be plotted with the plot function:
plot(pods, plot.bbox=T, plot.radii = F, plot.ellipse = F, plot.ws.pois = F, plot.pois = F, label.cex = 0.8)
We can see that object #11 is the merger of two pods that were not separated on the scanner.
This artecfactual object can be excluded by decreasing maxsize
.
Let's decrease it to 10000.
We can also set save.outline
to TRUE
so that the analysed image will be saved in the same directory with detected objects outlines.
pods<-krnel(img = img, resizw = 1000, huethres = mythreshold, minsize = 200, maxsize = 10000, save.outline = T, img.name = "peanut_pod")
pods<-krnel(img = img, resizw = 1000, huethres = mythreshold, minsize = 200, maxsize = 10000, save.outline = F) f2 = system.file("images", "peanut_pod.outline1.jpg", package="Rigatoni") img2 = readImage(f2) display(img2, method="raster")
The resulting pods
object no longer contains the 2 non separated pods.
plot(pods, plot.bbox = T, plot.radii = F, plot.ellipse = F, plot.ws.pois = F, plot.pois = F, label.cex = 0.8)
Another, and recommended, option is to use the watershed
parameter.
pods<-krnel(img = img, resizw = 1000, huethres = mythreshold, minsize = 200, maxsize = 20000, save.outline = F, watershed = T) plot(pods, plot.bbox = T, plot.radii = F, plot.ellipse = F, plot.ws.pois = F, plot.pois = F, label.cex = 0.8)
If your working directory contains many images it is possible to analyse several or all of them at a time.
files <- dir(pattern = ".*.jpg$") #or files <- c("file1.jpg", "file2.jpg", "file3.jpg")
To apply the krnel
function to all the files listed in files
and get the result in a list, we can use the lapply function.
img_pods <- lapply(files, function(a) krnel(img = a, resizw = 1000, huethres = mythreshold, minsize = 100, maxsize = 10000, save.outline = T) )
We thus get a list of krnel objects. Let's name the components of the list with image names.
names(img_pods) <- files
To extract all features of all images into a single data.table with an extra column containing the name of the images :
all_features <- do.call(rbind, Map(function(a, i) data.table(Image=i, a$features), img_pods, names(img_pods) ) )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.