Image processing in R, using packages like imager
, enables powerful
analysis and manipulation of digital images. This blog demonstrates key
techniques—enhancement, denoising, and histogram equalization—using the
imager
package, with visual results to illustrate their effects, based
on concepts from the “Image Data Analysis” document.
Understanding Digital Images
A digital image is a 2D function $f(x, y): \mathbb{R}^2 \rightarrow \mathbb{R}$, where $(x, y)$ are spatial coordinates, and $f(x, y)$ represents pixel intensity. In digital images, pixels have discrete locations and values. For 8-bit grayscale images, intensities range from 0 (black) to 255 (white). Images are categorized as:
- Binary: Pixels are 0 (black) or 1 (white).
- Grayscale: Pixel values in ${0, \ldots, 255}$.
- Color: Three channels (RGB), each in ${0, \ldots, 255}$.
Image Processing with imager
The imager
package, built on CImg, supports loading, manipulating, and
visualizing images. Below, we demonstrate key operations with code and
visual outputs using the built-in “parrots.png” image.
1. Image Acquisition
Load and display an image:
library(imager)
file <- system.file('extdata/parrots.png', package='imager')
img <- load.image(file)
plot(img, main="Original Parrots Image")
Result:
2. Image Enhancement (Blurring)
Blurring enhances images for specific applications, e.g., smoothing details:
img_blurry <- isoblur(img, sigma=10)
plot(img_blurry, main="Blurred Image (sigma=10)")
Result: Note:
The blurred image appears smoother, reducing fine details like feather
textures.
3. Image Denoising
Denoising removes noise while preserving structure. Add noise and apply anisotropic blurring:
img_noisy <- img + 0.5 * rnorm(prod(dim(img)))
img_denoised <- blur_anisotropic(img_noisy, ampl=1e3, sharp=0.3)
layout(t(1:2))
plot(img_noisy, main="Noisy Image")
plot(img_denoised, main="Denoised Image (Anisotropic)")
Result:
Note: The noisy image shows random speckles, while the denoised image
restores clarity, preserving edges.
4. Histogram Equalization
Histogram equalization enhances contrast by redistributing pixel intensities:
img_gray <- grayscale(img)
f <- ecdf(img_gray)
img_equalized <- f(img_gray) %>% as.cimg(dim=dim(img_gray))
layout(t(1:2))
plot(img_gray, main="Grayscale Image")
plot(img_equalized, main="Histogram Equalized Image")
Result: Note: The
equalized image has improved contrast, making details like color
variations more distinct.
5. Morphological Processing
Thresholding segments objects by intensity:
img_gray <- grayscale(img)
threshold(img_gray, "20%") %>% plot(main="Thresholded Image (20%)")
Result: Note:
Thresholding creates a binary image, highlighting brighter regions
(e.g., white feathers) against darker ones.
6. Putting Everything Together
library(imager)
# Set up directory for saving plots (optional: create if it doesn't exist)
output_dir <- "plots"
if (!dir.exists(output_dir)) {
dir.create(output_dir)
}
# Image Acquisition
file <- system.file('extdata/parrots.png', package='imager')
img <- load.image(file)
plot(img, main="Original Parrots Image")
dev.copy(png, file.path(output_dir, "original_parrots.png"))
dev.off()
# Image Enhancement (Blurring)
img_blurry <- isoblur(img, sigma=10)
plot(img_blurry, main="Blurred Image (sigma=10)")
dev.copy(png, file.path(output_dir, "blurred_parrots.png"))
dev.off()
# Image Denoising
img_noisy <- img + 0.5 * rnorm(prod(dim(img)))
img_denoised <- blur_anisotropic(img_noisy, ampl=1e3, sharp=0.3)
layout(t(1:2))
plot(img_noisy, main="Noisy Image")
plot(img_denoised, main="Denoised Image (Anisotropic)")
dev.copy(png, file.path(output_dir, "noisy_vs_denoised_parrots.png"))
dev.off()
# Histogram Equalization
img_gray <- grayscale(img)
f <- ecdf(img_gray)
img_equalized <- f(img_gray) %>% as.cimg(dim=dim(img_gray))
layout(t(1:2))
plot(img_gray, main="Grayscale Image")
plot(img_equalized, main="Histogram Equalized Image")
dev.copy(png, file.path(output_dir, "grayscale_vs_equalized_parrots.png"))
dev.off()
# Morphological Processing
img_gray <- grayscale(img)
threshold(img_gray, "20%") %>% plot(main="Thresholded Image (20%)")
dev.copy(png, file.path(output_dir, "thresholded_parrots.png"))
dev.off()
Applications
Image processing in R is used in: - Automotive: Lane detection, obstacle warning. - Medical: Diagnostic imaging, surgical assistance. - Security: Face recognition, surveillance. - Media: Special effects, image editing.
Conclusion
The imager
package in R simplifies image processing tasks like
enhancement, denoising, and histogram equalization. Visual results
demonstrate how these techniques transform images, improving quality or
extracting features. Explore imager
and imagerExtra
for advanced
applications.
Resources: