2

注:将来この問題に遭遇した他の人を助けるために、私はこの質問に自分で答えます。必要に応じて独自の回答を送信してください。ただし、既に回答されていることを知っておいてください。

Chacoで、あるカラーマップを使用してマスクされた画像を別のカラーマップを使用して別の画像にオーバーレイするにはどうすればよいですか? また、これらのそれぞれにカラーバーを追加するにはどうすればよいですか?

4

2 に答える 2

1

Chaco でこの方法で画像をオーバーレイすることは十分に文書化されていませんが、確実に可能です。まず、チャコでマスクされた画像をどのようにプロットしますか? でプロットする場合Plot().img_plot()、Chaco はnp.nan値を透明なピクセルとして使用します。たとえば、次のようにプロットします。

img = np.eye(100)
img[img==0] = np.nan

背景が透明な対角線をプロットします。

しかし、実際にこの画像を別の画像に重ねるにはどうすればよいでしょうか。

これを行うには、主に 2 つの方法があります。

  1. 2 つの別々のプロットを作成し、OverlayPlotContainer
  2. 1 つのプロットを作成し、両方を 1 つのプロットにプロットする

2 番目の方法の利点は、両方のイメージが同じ軸を使用することです。また、最初の画像と同じプロットに 2 番目の画像をプロットすると、同じピクセル アスペクト比が維持されます。これは、100x100 の画像をプロットし、その上に 50x50 の画像を重ねると、重ねる画像は (0,0) から始まるプロット全体の 25% しか占めないことを意味します。

2番目の方法にはいくつか問題があるので、その修正方法を説明します。

Plot( を使用して) 同じオブジェクトに複数の画像をプロットするとimg_plot()、デフォルトで同じ color_mapper が使用されます。これは、両方が同じ範囲にスケーリングされることを意味します。これは必要な結果ではない可能性があるため、両方の画像に対して新しい color_mappers を作成する必要があります。

Qt コードから改作された TraitsUI を使用したサンプル コードを次に示します。

from traits.api import HasTraits, Instance
from traitsui.api import Item, View
from enable.api import ComponentEditor
from chaco.api import ArrayPlotData, Plot, ColorBar, LinearMapper, HPlotContainer, DataRange1D, ImageData
import chaco.default_colormaps
#
import numpy as np

class ImagePlot(HasTraits):
    plot = Instance(HPlotContainer)

    traits_view = View(
        Item('plot', editor=ComponentEditor(), show_label=False), width=500, height=500, resizable=True, title="Chaco Plot")

    def _plot_default(self):
        bottomImage = np.reshape(np.repeat(np.linspace(0, 5, 100),100), (100,100))
        topImage = np.eye(50)
        topImage = topImage*np.reshape(np.repeat(np.linspace(-2, 2, 50),50), (50,50))
        topImage[topImage==0] = np.nan
        #
        bottomImageData = ImageData()
        bottomImageData.set_data(bottomImage)
        #
        topImageData = ImageData()
        topImageData.set_data(topImage)
        #
        plotData = ArrayPlotData(imgData=bottomImageData, imgData2=topImageData)
        plot = Plot(plotData, name='My Plot')
        plot.img_plot("imgData")
        plot.img_plot("imgData2")
        # Note: DO NOT specify a colormap in the img_plot!
        plot.aspect_ratio = 1.0
        #
        bottomRange = DataRange1D()
        bottomRange.sources = [plotData.get_data("imgData")]
        topRange = DataRange1D()
        topRange.sources = [plotData.get_data("imgData2")]
        plot.plots['plot0'][0].color_mapper = chaco.default_colormaps.gray(bottomRange)
        plot.plots['plot1'][0].color_mapper = chaco.default_colormaps.jet(topRange)
        #
        colormapperBottom = plot.plots['plot0'][0].color_mapper
        colormapperTop = plot.plots['plot1'][0].color_mapper
        #
        colorbarBottom = ColorBar(index_mapper=LinearMapper(range=colormapperBottom.range), color_mapper=colormapperBottom, orientation='v', resizable='v', width=30, padding=20)
        colorbarBottom.padding_top = plot.padding_top
        colorbarBottom.padding_bottom = plot.padding_bottom
        #
        colorbarTop = ColorBar(index_mapper=LinearMapper(range=colormapperTop.range), color_mapper=colormapperTop, orientation='v', resizable='v', width=30, padding=20)
        colorbarTop.padding_top = plot.padding_top
        colorbarTop.padding_bottom = plot.padding_bottom
        #
        container = HPlotContainer(resizable = "hv", bgcolor='transparent', fill_padding=True, padding=0)
        container.spacing = 0
        container.add(plot)
        container.add(colorbarBottom)
        container.add(colorbarTop)
        #
        return container

if __name__ == "__main__":
    ImagePlot().configure_traits()

Chaco での画像プロットの重ね合わせ

于 2015-06-05T10:43:41.967 に答える
1

私はこれを 100% 信用しているわけではありません。オンラインで簡単に検索すると、以下のコードで簡単なオーバーレイを実行できることがわかりました。

見つかったソース:

http://docs.enthought.com/chaco/user_manual/containers.html#overlayplotcontainer

参照コード:

class OverlayImageExample(HasTraits):

plot = Instance(OverlayImage)

traits_view = View(
    Item('plot', editor=ComponentEditor(), show_label=False),
    width=800, height=600, resizable=True
)

def _plot_default(self):
    # Create data
    x = linspace(-5, 15.0, 100)
    y = jn(3, x)
    pd = ArrayPlotData(index=x, value=y)

    zoomable_plot = Plot(pd)
    zoomable_plot.plot(('index', 'value'),
                       name='external', color='red', line_width=3)

    # Attach tools to the plot
    zoom = ZoomTool(component=zoomable_plot,
                    tool_mode="box", always_on=False)
    zoomable_plot.overlays.append(zoom)
    zoomable_plot.tools.append(PanTool(zoomable_plot))

    # Create a second inset plot, not resizable, not zoom-able
    inset_plot = Plot(pd)
    inset_plot.plot(('index', 'value'), color='blue')
    inset_plot.set(resizable = '',
                   bounds = [250, 150],
                   position = [450, 350],
                   border_visible = True
                   )

    # Create a container and add our plots
    container = OverlayPlotContainer()
    container.add(zoomable_plot)
    container.add(inset_plot)
    return container
于 2015-06-05T10:45:40.660 に答える