Конечно, есть несколько решений этой проблемы.Вот тот, который ясно показывает, что происходит, и обеспечивает большую гибкость.
Давайте загрузим ваши два примера изображений.
library(png)
img1 <- readPNG("owzUE.png")
img2 <- readPNG("HMka0.png")
Бывает, что они не одинакового размера:
dim(img1)
# [1] 145 190 4
dim(img2)
# [1] 144 191 4
Итак, давайте сделаем размер одинаковым с
img1 <- img1[1:144, 1:190, 1:4]
img2 <- img2[1:144, 1:190, 1:4]
Каждое изображение состоит из четырех матриц, первые три соответствуют каналам RGB, а последняя - альфа.Давайте определим результирующее изображение как
img3 <- img1 * 0
, которое красиво дает массив того же размера, что и img1
и img2
.
Тесно связанная концепция - альфа-смешение но формулы не совсем то, что вам нужно;там отношения между изображениями не кажутся симметричными.Что мы можем сделать, это рассмотреть средневзвешенное значение для каждого канала RGB, где веса соответствуют соответствующим альфа-значениям:
for(d in 1:3)
img3[, , d] <- (img1[, , d] * img1[, , 4] + img2[, , d] * img2[, , 4] ) / (img1[, , 4] + img2[, , 4])
Поскольку в некоторых случаях оба альфа-значения равны 0, мы фиксируем эти случаи с помощью
img3[is.nan(img3)] <- 0
Наконец, мы устанавливаем альфа-значение для большего из двух изображений с помощью
img3[, , 4] <- pmax(img1[, , 4], img2[, , 4])
и сохраняем результат
writePNG(img3, "img3.png")
![enter image description here](https://i.stack.imgur.com/HzZn8.png)
Таким образом, этот метод также применим к цветным изображениям и позволяет экспериментировать с формулой, меняя вес и т. Д.