在Python中叠加图像

4
我有这三张来自SEM显微镜的图片。其中一张是实际图片,而另外两张只是指示样本上特定元素(铝和硅)的存在。
我想使用Numpy和Matplotlib将它们叠加在一起,这样我就可以看到元素的确切位置,但是不确定如何在Python中处理这个问题,到目前为止,我只能将图片文件读取为np数组:
image_SEM = np.asarray(Image.open('Project_SEI.JPG'))
image_Al = np.asarray(Image.open('Project_Al K.JPG'))
image_Si = np.asarray(Image.open('Project_Si K.JPG'))

谢谢!

enter image description here enter image description here enter image description here


1
有几种方法可以尝试。使用alpha通道将黑色像素在Al/Si图像中变为透明,并将其叠加在一起。或者逐像素地平均颜色,当元素图像像素不是黑色时。试试看,如果不成功,再回来问一下。 - undefined
2个回答

3
你根本不需要使用Numpy数组来进行简单的叠加。
from PIL import Image

# Change to your file names, this is what mine downloaded as from your post
image_sem = Image.open('aZ8ED.jpg')
image_si = Image.open('HeiA7.jpg')
image_al = Image.open('HlcOR.jpg')

si_k = Image.blend(image_sem, image_si, 0.5)
si_k.show()

al_k = Image.blend(image_sem, image_al, 0.5)
al_k.show()

你需要裁剪或处理右下角的图片标签以满足你的需求,也许还需要左侧的颜色比例尺,但这样应该能帮助你入门。对我来说很有效。

enter image description here enter image description here

根据OP的评论进行编辑:

blend 方法 输出 out = image1 * (1.0 - alpha) + image2 * alpha。要将它们全部放在一起,只需依次将元素图像组合在一起,然后将该结果与主图像混合,如下所示:

elements = Image.blend(image_si, image_al, 0.5)

elements_overlay = Image.blend(image_sem, elements, 0.5)
elements_overlay.show()

enter image description here

混合方法可能不适用于许多图像。随着合并更多元素图像,颜色会逐渐淡化,因为 alpha 使得第一个元素图像在最终图像中的权重较小。请参阅documentation以了解所有合并图像的方法。对于更复杂的组合,您可能希望在所有操作完成后使用 Numpy 数组,并对实际像素进行一些归一化或微调,然后再使用 fromarray 或类似方法重新组合。

谢谢!这个方法有效,关于进一步的工作,有没有好的方法将两个元素叠加在同一张图片上?如果我再次使用Image.blend,会不会逐渐降低基础图像的清晰度? - undefined
@GiovanniPignatelli 请注意我回答中的更新内容。 - undefined

2
我倾向于使用掩膜来粘贴硅和铝的图像,这样它们只会影响到彩色的扫描电子显微镜图像,而不会影响到黑色/灰色的部分 - 否则会降低基础图像的对比度。
from PIL import Image

# Load images
sei = Image.open('sei.jpg')
si = Image.open('si.jpg')
al = Image.open('al.jpg')

# Make mask which only allows coloured areas to show
siMask = si.convert('L')
siMask.save('DEBUG-siMask.jpg')

# Paste Si image over SEM image with transparency mask
sei.paste(si, siMask)

# Make mask which only allows coloured areas to show
alMask = al.convert('L')
alMask.save('DEBUG-alMask.jpg')

# Paste Al image over SEM image with transparency mask
sei.paste(al, alMask)
sei.save('result.png')

DEBUG-siMask.jpg

enter image description here

DEBUG-alMask.jpg

enter image description here

result.jpg

enter image description here


请注意,在使用之前,您可以增强面具的效果 - 例如,您可以使用中值滤波器来去除小斑点,或者可以进行对比度拉伸,使洋红/黄色阴影更加均匀或者更加稳定。例如,您可以看到黄色比洋红更加均匀,这是因为黄色面具更亮,所以您可以对洋红面具进行阈值处理,使其变为纯黑白,从而使洋红更加均匀。
因此,我使用中值滤波器去除了斑点,并更改了遮罩,使彩色区域透明度为50%,如下所示:
#!/usr/bin/env python3

from PIL import Image, ImageFilter

# Load images
sei = Image.open('sei.jpg')
si = Image.open('si.jpg')
al = Image.open('al.jpg')

# Make mask which only allows coloured areas to show
siMask = si.convert('L')
# Median filter mask to remove small speckles
siMask = siMask.filter(ImageFilter.MedianFilter(5))
# Threshold mask and set opacity to 50% for coloured areas
siMask = siMask.point(lambda p: 128 if p > 50 else 0)
siMask.save('DEBUG-siMask.jpg')

# Paste Si image over SEM image with transparency mask
sei.paste(si, siMask)

# Make mask which only allows coloured areas to show
alMask = al.convert('L')
# Median filter mask to remove small speckles
alMask = alMask.filter(ImageFilter.MedianFilter(5))
# Threshold mask and set opacity to 50% for coloured areas
alMask = alMask.point(lambda p: 128 if p > 50 else 0)
alMask.save('DEBUG-alMask.jpg')

# Paste Al image over SEM image with transparency mask
sei.paste(al, alMask)
sei.save('result.jpg')

这就是这些口罩的效果和结果:

enter image description here

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接