Matplotlib两个图像之间的差异

时间:2013-10-04 20:46:06

标签: matplotlib plot patch figure

我有来自同一图像的图像(4000x2000像素),但在不到1%的像素中存在细微差别。我想将两个图像并排绘制并突出显示阵列中不同的区域(通过突出显示我的意思是我想要的像素不同于跳出来,但仍然会显示与其值相匹配的颜色。到目前为止,我一直在使用未填充的矩形来勾勒出这些像素的边缘。我可以很好地在小图像中做到这一点(〜 50x50):

    fig=figure(figsize=(20,15))
    ax1=fig.add_subplot(1,2,1)
    imshow(image1,interpolation='nearest',origin='lower left')
    colorbar()
    ax2=fig.add_subplot(122,sharex=ax1, sharey=ax1)
    imshow(image2,interpolation='nearest',origin='lower left')
    colorbar()
    #now show differences
    Xspots=im1!=im2
    Xx,Xy=nonzero(Xspots)
    for x,y in zip(Xx,Xy):
           rect=Rectangle((y-.5,x-.5),1,1,color='w',fill=False,ec='w')
           ax1.add_patch(rect)
           ax2.add_patch(rect)

然而,当图像非常大时,这种方法效果不佳。奇怪的事情发生,例如当我放大补丁消失。此外,这种方式很糟糕,因为在放大/缩小时加载东西需要花费很长时间。

我觉得必须有一个更好的方法来做到这一点,也许只有一个补丁确定所有的东西,而不是一大堆补丁。我可以在imshow图像的顶部做一个散点图,但我不知道如何修复它,以便在我放大/缩小时点将保持与像素的大小完全相同。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我会尝试使用alpha通道:

import copy
N, M = 20, 40
test_data = np.random.rand(N, M)
mark_mask = np.random.rand(N, M) < .01 # mask 1%
# this is redundant in this case, but in general you need it
my_norm = matplotlib.colors.Normalize(vmin=0, vmax=1)
# grab a copy of the color map
my_cmap = copy.copy(cm.get_cmap('cubehelix'))
c_data= my_cmap(my_norm(test_data))
c_data[:, :, 3] = .5 # make everything half alpha
c_data[mark_mask, 3] = 1 # reset the marked pixels as full opacity
# plot it
figure()
imshow(c_data, interpolation='none')

不知道这是否适用于您的数据。