Python 如何使用imshow RGB混合剪裁的强度并显示正确的混合强度?
好的,我有一个GUI,我想在其中显示颜色通道a和B,以及覆盖层C 我想通过简单的范围剪裁手动调整对比度(基本上像其他人一样,有一个强度直方图和两个垂直条) 要显示A和B,我只需将它们剪辑并放入Python 如何使用imshow RGB混合剪裁的强度并显示正确的混合强度?,python,matplotlib,image-processing,Python,Matplotlib,Image Processing,好的,我有一个GUI,我想在其中显示颜色通道a和B,以及覆盖层C 我想通过简单的范围剪裁手动调整对比度(基本上像其他人一样,有一个强度直方图和两个垂直条) 要显示A和B,我只需将它们剪辑并放入imshow。为了混合它们,我目前使用“屏幕”方法,以查看斑点重叠的位置 但我的问题是,混合图像没有遵循与剪裁强度相同的缩放比例。我应该如何处理这个问题,以确保混合图像与单个通道具有相同的对比度 因此,我的问题是,数据自动被matplotlib的imshow,因此给人的印象是它完全工作了。实际上,在剪裁范
imshow
。为了混合它们,我目前使用“屏幕”方法,以查看斑点重叠的位置
但我的问题是,混合图像没有遵循与剪裁强度相同的缩放比例。我应该如何处理这个问题,以确保混合图像与单个通道具有相同的对比度
因此,我的问题是,数据自动被matplotlib的
imshow
,因此给人的印象是它完全工作了。实际上,在剪裁范围后,当然需要重新缩放新值,以填充0到1之间的整个范围(matplotlib在内部执行此操作)。以下操作将生成正确的对比度缩放:
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()
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()