您正在绘制不是灰度渐变的单通道数据with a colormap。
为每个.imshow()添加一个合适的cmap=参数,例如
plt.imshow(G, cmap=plt.get_cmap("Greys"))
示例
正如 cmets 中所讨论的,OP 希望使用与通道相关的颜色图来显示每个通道。
您可以使用LinearSegmentedColormap 来生成这些。我还冒昧地用循环替换了重复的代码。
import cv2 as cv
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
img = cv.imread("lenna.png")
bgr = cv.cvtColor(img, cv.COLOR_RGB2BGR)
B = bgr[:, :, 0]
G = bgr[:, :, 1]
R = bgr[:, :, 2]
b_map = LinearSegmentedColormap.from_list("B", ["#000", "#00f"])
g_map = LinearSegmentedColormap.from_list("G", ["#000", "#0f0"])
r_map = LinearSegmentedColormap.from_list("R", ["#000", "#f00"])
for i, (title, matrix, cmap) in enumerate([
("BGR", bgr, None),
("Blue", B, b_map),
("Green", G, g_map),
("Red", R, r_map),
], 1):
plt.subplot(2, 2, i)
plt.imshow(matrix, cmap=cmap)
plt.xticks([])
plt.yticks([])
plt.title(title)
plt.show()
输出是
扩展示例
这是一个显示 HSV 和 YCbCr 结果的示例。 (获得那些 YCbCr 色带是一两件事......)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.cm import get_cmap
# Build color ramps in YCbCr space
filler = np.full(255, 128)
ramp = np.linspace(0, 255, 255)
ch0_ramp = np.rot90(np.dstack((ramp, filler, filler))).astype("uint8")
ch1_ramp = np.rot90(np.dstack((filler, ramp, filler))).astype("uint8")
ch2_ramp = np.rot90(np.dstack((filler, filler, ramp))).astype("uint8")
y_ramp = 1 - (cv.cvtColor(ch0_ramp, cv.COLOR_YCrCb2RGB)[:, 0] / 255)
cr_ramp = cv.cvtColor(ch1_ramp, cv.COLOR_YCrCb2RGB)[:, 0] / 255
cb_ramp = cv.cvtColor(ch2_ramp, cv.COLOR_YCrCb2RGB)[:, 0] / 255
# Build color maps
b_map = LinearSegmentedColormap.from_list("B", ["#000", "#00f"])
g_map = LinearSegmentedColormap.from_list("G", ["#000", "#0f0"])
r_map = LinearSegmentedColormap.from_list("R", ["#000", "#f00"])
h_map = get_cmap("hsv")
s_map = LinearSegmentedColormap.from_list("S", ["#888", "#0f0"])
v_map = LinearSegmentedColormap.from_list("V", ["#000", "#fff"])
y_map = LinearSegmentedColormap.from_list("Y", y_ramp)
cr_map = LinearSegmentedColormap.from_list("Cr", cr_ramp)
cb_map = LinearSegmentedColormap.from_list("Cb", cb_ramp)
# Load material
bgr = cv.imread("lenna.png")
rgb = cv.cvtColor(bgr, cv.COLOR_BGR2RGB)
hsv = cv.cvtColor(bgr, cv.COLOR_BGR2HSV)
ycc = cv.cvtColor(bgr, cv.COLOR_BGR2YCrCb)
# Draw all the things!
for i, (title, matrix, cmap) in enumerate(
[
("BGR", rgb, None),
("Red", rgb[:, :, 0], r_map),
("Green", rgb[:, :, 1], g_map),
("Blue", rgb[:, :, 2], b_map),
("Hue", hsv[:, :, 0], h_map),
("Sat", hsv[:, :, 1], s_map),
("Val", hsv[:, :, 2], v_map),
("Y", ycc[:, :, 0], y_map),
("Cr", ycc[:, :, 1], cr_map),
("Cb", ycc[:, :, 2], cb_map),
],
0,
):
plt.subplot(4, 3, 1 + i + (2 if i else 0))
plt.imshow(matrix, cmap=cmap)
plt.xticks([])
plt.yticks([])
plt.title(title)
plt.show()
输出是