3

我正在使用 Python 和 Matplotlib 进行绘图。

我有两个矩阵(灰度图像),如下所示:

x = np.array([[0,1,0], [1,0,1]])
y = np.array([[0,0.4,0], [1,0,1]])

我想绘制一个新图像 z ,它显示 x 和 y 之间的差异(比如绿点),并将其他点保留为灰度。因此,在前面的示例中,如果 1 是黑色,0 是白色,则 z 应该是一个相同的图像,其中一个绿点对应于 x 和 y 之间的差异(在本例中为 0.4)。

这样做的目的是为手写数据图像中的 k-means 算法执行动画,以观察算法是如何工作的。

我希望这很清楚,对不起我的英语。

4

2 回答 2

4

最简单的解决方案包括首先计算输入数据的 RGBA 颜色,对其进行操作以设置与您的特殊颜色(绿色)不同的值,然后使用简单imshow()的修改后的 RGBA 数组进行绘图。这是如何做到的:

>>> rgba_values = cm.gray(y)  # All RGBA values for your input value, with levels of gray
>>> rgba_values[x != y] = [0, 1, 0, 1]  # Set the points where x and y differ to green (RBG = 0, 1, 0)
>>> imshow(rgba_values, interpolation='nearest')

x数组之间不同的数据点y现在为绿色: 灰色为共同数据,绿色为差异的图像

如果您想在之前显示的图像上覆盖绿色点,您可以执行类似的操作并将 alpha 通道设置为 0,您不想修改原始图像:

>>> y_gray = cm.gray(y)  # RGBA image with gray levels
>>> imshow(y_gray, interpolation='nearest')  # Image of one of the arrays
>>> diff_points = numpy.empty_like(y_gray)  # Preparation of an overlay with marked points only
>>> diff_points[x == y, 3] = 0  # Common points not overwritten: alpha layer set to 0
>>> diff_points[x != y] = [0, 1, 0, 1]  # Green for points that differ
>>> imshow(diff_points, interpolation='nearest')
于 2012-04-08T14:15:06.200 回答
0

另一种可能的方法是更改​​颜色图以便以不同的方式显示某些值,

import matplotlib.cm, matplotlib.pyplot as plt, numpy as np, copy
x = np.array([[0,1,0], [1,0,1]])
y = np.array([[0,0.4,0], [1,0,1]])
y_mod = y.copy()
y_mod[x != y] = np.nan # filling the differing pixels with NaNs    
xcm = copy.copy(matplotlib.cm.gray) # copying the gray colormap
xcm.set_bad(color='green', alpha=0.5) # setting the color for "bad" pixels"
plt.imshow(y_mod, cmap=xcm, interpolation='none')

这种方法的一个优点是您可以稍后重用此颜色图。

于 2012-07-19T10:47:20.730 回答