Combines rigid tranformation matrices in the following order: translation of points to origin (0, 0) -> reflection of points -> rotation by alpha degrees and translation of points to new center
Examples
if (FALSE) { # \dontrun{
library(imager)
library(tidyverse)
im <- load.image("https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Aster_Tataricus.JPG/1024px-Aster_Tataricus.JPG")
d <- sRGBtoLab(im) %>% as.data.frame(wide="c")%>%
dplyr::select(-x,-y)
km <- kmeans(d, 2)
# Run a segmentation to extract flower
seg <- as.cimg(abs(km$cluster - 2), dim = c(dim(im)[1:2], 1, 1))
plot(seg); highlight(seg == 1)
# Detect edges
dx <- imgradient(seg, "x")
dy <- imgradient(seg, "y")
grad.mag <- sqrt(dx^2 + dy^2)
plot(grad.mag)
# Extract points at edges
edges.px <- which(grad.mag > max(grad.mag[, , 1, 1])/2, arr.ind = TRUE)
points(edges.px, col = "green", cex = 0.1)
# Apply transformations to point set
tr1 <- combine.tr(center.cur = apply(edges.px[, 1:2], 2, mean),
center.new = c(1200, 1200), alpha = 90)
tr2 <- combine.tr(center.cur = apply(edges.px[, 1:2], 2, mean),
center.new = c(500, 1200), mirror.x = T, alpha = 30)
tr3 <- combine.tr(center.cur = apply(edges.px[, 1:2], 2, mean),
center.new = c(1200, 500), mirror.y = T, alpha = 270)
plot(edges.px, xlim = c(0, 1700), ylim = c(0, 1700), cex = 0.1)
points(t(tr1%*%t(edges.px[, 1:3])), cex = 0.1, col = "red")
points(t(tr2%*%t(edges.px[, 1:3])), cex = 0.1, col = "yellow")
points(t(tr3%*%t(edges.px[, 1:3])), cex = 0.1, col = "blue")
} # }