Enthought Canopy Chaco img_plot with grey scale data

181 Views Asked by At

I am finally getting around to trying out Chaco so this question might be naive. Currently I am trying to plot a very large 8-bit (aka grey scale aka single channel) image of type numpy.uint8. It seems no matter what I do the image comes out in color. Here is my code based on the image_plot.py example that comes with Chaco:

#!/usr/bin/env python
"""
Draws an simple RGB image
 - Left-drag pans the plot.
 - Mousewheel up and down zooms the plot in and out.
 - Pressing "z" brings up the Zoom Box, and you can click-drag a rectangular
   region to zoom.  If you use a sequence of zoom boxes, pressing alt-left-arrow
   and alt-right-arrow moves you forwards and backwards through the "zoom
   history".
"""

# Major library imports
from numpy import zeros, uint8



# Enthought library imports
from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import Item, Group, View

# Chaco imports
from chaco.api import ArrayPlotData, Plot, ImageData
from chaco.tools.api import PanTool, ZoomTool
from chaco.tools.image_inspector_tool import ImageInspectorTool, \
     ImageInspectorOverlay

#===============================================================================
# # Create the Chaco plot.
#===============================================================================
def _create_plot_component():

    # Create some uint8 image data
    imageSize = 10000
    image = zeros((imageSize,imageSize), dtype=uint8)
    for x in range(0,imageSize):
        image[x,x] = 255

    print image.shape
    print type(image[0][0])

    # Create a plot data obect and give it this data
    pd = ArrayPlotData()
    pd.set_data("imagedata", image)

    # Create the plot
    plot = Plot(pd, default_origin="top left")
    plot.x_axis.orientation = "top"
    img_plot = plot.img_plot("imagedata")[0]

    # Tweak some of the plot properties
    plot.bgcolor = "white"

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

    # imgtool = ImageInspectorTool(img_plot)
    # img_plot.tools.append(imgtool)
    # plot.overlays.append(ImageInspectorOverlay(component=img_plot,
    #                                            image_inspector=imgtool))
    return plot

#===============================================================================
# Attributes to use for the plot view.
size = (600, 600)
title="Simple image plot"
bg_color="lightgray"

#===============================================================================
# # Demo class that is used by the demo.py application.
#===============================================================================
class Demo(HasTraits):
    plot = Instance(Component)

    traits_view = View(
                    Group(
                        Item('plot', editor=ComponentEditor(size=size,
                                                            bgcolor=bg_color),
                             show_label=False),
                        orientation = "vertical"),
                    resizable=True, title=title
                    )

    def _plot_default(self):
         return _create_plot_component()

demo = Demo()

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

#--EOF---
1

There are 1 best solutions below

0
On BEST ANSWER

What you're seeing is just pseudo-color: A 2D image needs some way to go from pixel values to "color" (grayscale is still color in this case). The default colormap is something colorful, but you can specify the colormap keyword argument to get a grayscale image. Here's a simplified example:

import numpy as np

from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import UItem, View

from chaco.api import ArrayPlotData, Plot, gray


class Demo(HasTraits):

    plot = Instance(Component)

    traits_view = View(
        UItem('plot', editor=ComponentEditor(size=(600, 600))),
        resizable=True, title="Simple image plot"
    )

    def _plot_default(self):
        image = np.random.random_integers(0, 255, size=(100, 100))
        image = image.astype(np.uint8)
        data = ArrayPlotData(imagedata=image)

        plot = Plot(data, default_origin="top left")
        plot.img_plot("imagedata", colormap=gray)
        return plot


demo = Demo()
demo.configure_traits()