如何用imshow混合裁剪的强度并显示正确的混合强度?

2024-06-11 21:50:29 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我有一个图形用户界面,在里面我想显示颜色通道a和B,以及覆盖层C

我想通过简单的范围剪裁手动调整对比度(基本上像其他人一样,有一个强度直方图和两个垂直条)。你知道吗

要显示A和B,我只需将它们剪辑并填充到imshow。为了混合它们,我目前使用“屏幕”方法,以查看斑点重叠的地方。你知道吗

但我的问题是,混合图像没有遵循与剪裁强度相同的缩放比例。我应该如何处理这个问题,以确保混合图像与单个通道具有相同的对比度?你知道吗

enter image description here

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


def blend(image1, image2, cmap1, cmap2):
    image1_rgba = cmap1(image1)
    image2_rgba = cmap2(image2)

    return 1 - (1 - image1_rgba) * (1 - image2_rgba)

cmapgrn = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "seagreen"])
cmapred = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "red"])
fig, ax = plt.subplots(nrows = 3, ncols = 2, figsize = (10,5))
ax = ax.ravel()

multichannel = skimage.data.hubble_deep_field() # type: np.ndarray

green_raw = multichannel[:200, :200, 0]   # type: np.ndarray
red_raw   = multichannel[:200, :200, 1].T # type: np.ndarray

imgs = green_raw, red_raw

all_imgs = []
for img in imgs:
    img_rescale = img/img.max()
    all_imgs.append(img_rescale)

green, red = all_imgs # type: np.ndarray


G = green
R = red

cmin = 0.05
cmax = 0.3

ax[0].imshow(G.clip(cmin, cmax), cmap = cmapgrn)
ax[1].imshow(R.clip(cmin, cmax), cmap = cmapred)
ax[2].imshow(blend(image1 = G,
                   image2 = R,
                   cmap1 = cmapgrn,
                   cmap2 = cmapred))

ax[3].imshow(blend(image1 = G.clip(cmin, cmax),
                   image2 = R.clip(cmin, cmax),
                   cmap1 = cmapgrn,
                   cmap2 = cmapred))

ax[4].hist((G.ravel(), R.ravel()), bins = 50, color = ("green", "red"))
ax[4].axvline(cmin, color = "black")
ax[4].axvline(cmax, color = "black")

fig.delaxes(ax[5])
plt.tight_layout()
plt.show()

Tags: importimgmatplotlibnppltgreenredax
1条回答
网友
1楼 · 发布于 2024-06-11 21:50:29

因此,我的问题是,数据是matplotlib的imshow自动生成的,因此给人的印象是它完全工作了。实际上,在剪裁范围之后,当然需要重新缩放新值以填充0到1之间的整个范围(matplotlib在内部执行此操作)。以下将生成正确的对比度缩放:

enter image description here

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

cmapgrn = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "seagreen"])
cmapred = matplotlib.colors.LinearSegmentedColormap.from_list("", ["black", "red"])


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

multichannel = skimage.data.hubble_deep_field() # type: np.ndarray

green_raw = multichannel[:200, :200, 0]   # type: np.ndarray
red_raw   = multichannel[:200, :200, 1].T # type: np.ndarray

imgs = green_raw, red_raw

all_imgs = []
for img in imgs:
    img_rescale = img/img.max()
    all_imgs.append(img_rescale)

green, red = all_imgs # type: np.ndarray

G = green
R = red

cmin = 0.0
cmax = 0.5

def rescale(arr: np.ndarray):
    re = (arr - arr.min()) / (arr.max() - arr.min())
    return re


def blend(image1, image2, cmap1, cmap2):
    a = cmap1(image1)
    b = cmap2(image2)

    screen = 1 - (1 - a) * (1 - b)
    return screen


G_r = rescale(G.clip(cmin, cmax))
R_r = rescale(R.clip(cmin, cmax))

ax[0].imshow(G_r, cmap = cmapgrn)
ax[1].imshow(R_r, cmap = cmapred)
ax[2].imshow(blend(image1 = G_r,
                   image2 = R_r,
                   cmap1 = cmapgrn,
                   cmap2 = cmapred))

plt.tight_layout()
plt.show()

相关问题 更多 >