2

同じ画像から派生した画像 (4000x2000 ピクセル) がありますが、ピクセルの 1% 未満の微妙な違いがあります。2つの画像を並べてプロットし、配列の異なる領域を強調表示したいと思います(強調表示とは、異なるピクセルを飛び出させたいが、値に一致する色を表示したいことを意味します。私は'これまで、このようなピクセルのエッジの輪郭を描くために塗りつぶされていない長方形を使用してきました。これは、小さな画像 (~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)

ただし、画像が非常に大きい場合、これはうまく機能しません。たとえば、ズームインするとパッチが消えるなど、奇妙なことが起こります。また、ズームイン/ズームアウトするとロードに時間がかかるため、この方法は最悪です。

これを行うにはもっと良い方法が必要だと思います。おそらく、パッチ全体ではなく、すべてのものの場所を決定するパッチが 1 つしかない方法です。imshow 画像の上に散布図を作成できますが、ズームイン/ズームアウトしたときにポイントがピクセルのサイズのままになるように修正する方法がわかりません。

何か案は?

4

1 に答える 1

1

私はアルファチャンネルで何かを試してみます:

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 に答える