我想使用R对两个灰度图像(大小相同的png文件)进行平均。
以下面的图片为例:
img1.png
img2.png
img3.png
img1.png
和img2.png
的平均值应该导致类似img3.png
的情况。我已经研究了magick和imager软件包,但没有成功。
答案 0 :(得分:10)
对于此问题,肯定有多种解决方案。这是一个清楚地显示正在发生的事情,并具有更大的灵活性。
让我们加载您的两个示例图片。
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通道,最后一个对应于alpha。让我们通过
定义结果图像img3 <- img1 * 0
可以很好地提供与img1
和img2
相同大小的数组。
一个紧密相关的概念是alpha blending,但是公式并不完全符合您的需要。图像之间的关系似乎并不对称。我们可能要做的是考虑每个RGB通道的加权平均值,其中权重对应于相应的alpha:
for(d in 1:3)
img3[, , d] <- (img1[, , d] * img1[, , 4] + img2[, , d] * img2[, , 4] ) / (img1[, , 4] + img2[, , 4])
由于在某些情况下两个字母的alpha均为0,因此我们用
img3[is.nan(img3)] <- 0
最后,我们使用以下参数将alpha值设置为两个图像中较大的一个
img3[, , 4] <- pmax(img1[, , 4], img2[, , 4])
并保存结果
writePNG(img3, "img3.png")
因此,这种方法也适用于彩色图像,并允许人们通过改变权重等对公式进行实验。