2

我有来自同一图像的图像(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 图像上做一个散点图,但我不知道如何修复它,以便在我放大/缩小时点将完全保持像素的大小。

有任何想法吗?

4

1 回答 1

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

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

于 2013-10-05T00:27:33.350 回答