Matplotlib:绘制两张图像之间的差异

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算法的执行过程,以观察算法的工作方式。
我希望这很清楚,对我的英语表示抱歉。

2
对于这个问题,给你一个+1和一颗星星。请注意,在你之前提出的7个问题中尽可能标记接受的答案是很有用的。这将给予更多人回答这个问题以及接下来的问题的动力。 - Eric O. Lebigot
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')

数组 xy 之间不同的数据点现在变成了绿色: 灰色为公共数据,绿色为不同数据 如果你想将这些绿色点覆盖在之前显示的图像上,可以采取类似的方法,并在不想修改原始图像的位置设置 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')

谢谢。它有效了。只剩下一件事,我该如何设置绿点的透明度? - blueSurfer
好的,我做到了,我只是添加了以下这行代码: diff_points[x != y, 3] = 0.8再次感谢。 - blueSurfer
@user950625:感谢您接受这个答案。如果使用diff_points[x != y] = [0, 1, 0, 0.8]来设置绿色点的透明度会更好:4个值分别是RGB和alpha(透明度)值,用于区分您的xy数组之间不同的点。 - Eric O. Lebigot

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')

这种方法的一个优点是,您随后可以重复使用此色彩地图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接