图像处理:平均灰度图像

时间:2019-01-31 21:38:04

标签: r

我想使用R对两个灰度图像(大小相同的png文件)进行平均。

以下面的图片为例:

img1.png

enter image description here

img2.png

enter image description here

img3.png

enter image description here

img1.pngimg2.png的平均值应该导致类似img3.png的情况。我已经研究了magickimager软件包,但没有成功。

1 个答案:

答案 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

可以很好地提供与img1img2相同大小的数组。

一个紧密相关的概念是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")

enter image description here

因此,这种方法也适用于彩色图像,并允许人们通过改变权重等对公式进行实验。