Так что я поиграл с нормализацией, как это сделал ImportanceOfBeingErnest в их примере, и оттуда было очень легко сделать реальное смешение цветов двух изображений, не прибегая к каким-то хитрым приемам с использованием буферного холста, которые я видел вокруг здесь.
Я понимаю, что некоторые шаги настройки могут быть излишними, так что нужно немного поиграть.
(я пробовал также с белым фоном. Хотя он хорошо работает для отдельных каналов, он выглядит немного ... странно для смешанного результата в данном конкретном случае.)

import matplotlib.colors
import skimage.io
import skimage.exposure
import matplotlib.pyplot as plt
import numpy as np
def rescale_intensity(image, p1 = 0, p2 = 100):
if p1 and p2 not in range(101):
raise TypeError
p1, p2 = np.percentile(image, [p1, p2])
img_rescale = skimage.exposure.rescale_intensity(image, in_range = (p1, p2))
return img_rescale
green_c = skimage.io.imread("c1.tif")
red_c = skimage.io.imread("c2.tif")
cmap_grn = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "green"])
cmap_red = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "red"])
greenlim = [2e3, 5e3]
redlim = [2e3, 5e3]
green_norm = (green_c-greenlim[0])/np.diff(greenlim)
red_norm = (red_c-redlim[0])/np.diff(redlim)
green_rgba = cmap_grn(green_norm)
red_rgba = cmap_red(red_norm)
fig, ax = plt.subplots(ncols = 4, figsize = (10,5))
ax = ax.ravel()
blend = np.maximum(green_rgba, red_rgba)
ax[0].imshow(green_rgba)
ax[1].imshow(red_rgba)
ax[2].imshow(blend)
ax[3].imshow(rescale_intensity(blend, 50, 80))
titles = ["Green", "Red", "Blended", "Blended Adjusted"]
for a, t in zip(ax, titles):
a.set_title(t)
plt.tight_layout()
plt.show()