Наложение цветовых каналов в оттенках серого - PullRequest
0 голосов
/ 04 мая 2018

Я хочу наложить два или более цветовых канала для визуализации совместной локализации. Я играл с Matplotlib imshow и до сих пор получаю следующее:

enter image description here

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

Есть ли умнее?

изображения здесь

import matplotlib.colors
import skimage.io
import matplotlib.pyplot as plt

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"])

cmap_grn.set_under("k", 0)
cmap_red.set_under("k", 0)

fig, ax = plt.subplots(ncols = 3, figsize = (10,5))
ax = ax.ravel()

greenlim = [2e3, 3e3]
redlim = [2e3, 4e3]

ax[0].imshow(green_c, clim = greenlim, cmap = cmap_grn, alpha = 1)

ax[1].imshow(red_c, clim = redlim, cmap = cmap_red, alpha = 1)

ax[2].imshow(red_c, clim = redlim, cmap = cmap_red, alpha = 1)
ax[2].imshow(green_c, clim = greenlim, cmap = cmap_grn, alpha = 0.5)

plt.tight_layout()
plt.show()

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

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

Я понимаю, что некоторые шаги настройки могут быть излишними, так что нужно немного поиграть.

(я пробовал также с белым фоном. Хотя он хорошо работает для отдельных каналов, он выглядит немного ... странно для смешанного результата в данном конкретном случае.)

enter image description here

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()
0 голосов
/ 04 мая 2018

Рассматривали ли вы различие между изображениями? Я не знаю, насколько это имеет смысл для практического применения, но чтобы получить представление о различиях, это может иметь смысл.

enter image description here

import matplotlib.colors
import skimage.io
import matplotlib.pyplot as plt
import numpy as np

green_c = skimage.io.imread("../data/c1.tif")
red_c   = skimage.io.imread("../data/c2.tif")

cmap_grn = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "green"])
cmap_red   = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "red"])
cmap_diff   = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red", "white", "green"])

cmap_grn.set_under("k", 0)
cmap_red.set_under("k", 0)

fig, ax = plt.subplots(ncols = 3, figsize = (10,5))
ax = ax.ravel()

greenlim = [2e3, 3e3]
redlim = [2e3, 4e3]

green_norm = (green_c-greenlim[0])/np.diff(greenlim)
red_norm = (red_c-redlim[0])/np.diff(redlim)

diff = green_norm - red_norm
difflim = np.max(np.abs(diff))
difflim = [-difflim, +difflim]

ax[0].imshow(green_norm, clim=[0,1], cmap = cmap_grn, alpha = 1)

ax[1].imshow(red_norm, clim=[0,1], cmap = cmap_red, alpha = 1)

im_diff = ax[2].imshow(diff, clim = [-2,2], cmap = cmap_diff)

plt.tight_layout()
cax = fig.add_axes([1,.2,.025,.6])
fig. colorbar(im_diff, ax=ax[2], cax=cax)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...