Displaying Data
Starting IPython 启动
SPy使用IPython提供GUI窗口而不会阻塞交互式Python解释器。 要启用它,你必须以“pylab”模式启动IPython。 如果您已经在matplotlibrc文件中将matplotlib后端设置为“WX”或“WXAgg”(请参阅下面的注释),您应该可以像这样启动IPython for SPy:
您也可以通过这种方式启动IPython时显式设置后端:
注意:如果你不能在你的系统上运行WX后端,你仍然可以使用不同的后端(例如Qt4Agg或TkAgg)。
但是你将无法调用view_cube或view_nd函数。
Raster Displays栅格数据显示
SPy 的imshow()函数是一个名字相同的matplotlib函数的包装。 主要区别在于,SPy版本可以很容易地显示来自多光谱/高光谱图像的波段,它呈现分类图像,并支持多种其他类型的交互性。
Image Data Display
的imshow函数产生与np.ndarray或SpyFile对象相关联的数据的一个光栅显示。
In [1]: from spectral import *
In [2]: img = open_image('92AV3C.lan')
In [3]: view = imshow(img, (29, 19, 9))
当以交互方式显示图像时,matplotlib按钮控件可用于平移和缩放显示的图像。 如果您按下“z”键盘键,将会打开一个缩放窗口,其中显示图像的放大视图。 通过按住CONTROL键并左键单击原始窗口,缩放窗口将平移到原始窗口中单击的像素。
在版本0.16.0中更改:默认情况下,imshow函数应用RGB显示数据的线性直方图拉伸。 颜色拉伸可以通过关于imshow函数的stretch,bounds和stretch_all关键字来控制(有关这些关键字的含义,请参阅get_rgb)。 要调整显示图像的颜色延伸,可以调用ImageView对象的set_rgb_options方法。
显示图像的RGB数据限制可以从ImageView对象的__str__方法打印:
In [4]: print view
ImageView object:
Display bands : (29, 19, 9)
Interpolation :
RGB data limits :
R: [2054.0, 6317.0]
G: [2775.0, 7307.0]
B: [3560.0, 7928.0]
Class Map Display分类地图显示
要使用imshow显示地面实况图像,请在imshow函数中设置classes参数:
In [5]: gt = open_image('92AV3GT.GIS').read_band(0)
In [6]: view = imshow(classes=gt)
也可以在显示图像带和分类颜色之间切换,以及显示覆盖在图像数据显示器上的分类颜色掩模。 为此,请在调用imshow时指定数据和类的值:
In [7]: view = imshow(img, (30, 20, 10), classes=gt)
默认的显示模式是显示图像的波段。 按“d”,“c”或“C”(焦点位于图像窗口上),将显示切换为数据,类别或类别叠加。 设置显示参数也可以通过编程来完成。 例如,要显示覆盖类掩码的图像,使用0.5的alpha透明度,在调用imshow之后键入以下命令
In [8]: view = imshow(img, (30, 20, 10), classes=gt)
In [9]: view.set_display_mode('overlay')
In [10]: view.class_alpha = 0.5
Interactive Class Labeling交互式类标签
ImageView窗口提供了通过选择图像中的矩形区域并分配新的类ID来交互地修改像素类ID的功能。 将类ID应用于矩形区域使用以下步骤完成:
- 调用imshow,为类参数提供一个初始数组。 这必须是一个非负的,整数值的数组。 类ID值为零表示一个未标记的像素,以便从完全未标记的图像开始,为类参数传递一个全零的数组。
- 按住SHIFT键的同时,用鼠标左键点击要选择的矩形左上角。 拖动鼠标光标,松开矩形区域右下角的鼠标按钮。 请注意释放鼠标按钮之前释放SHIFT键将导致取消选择操作。
- 焦点仍在ImageView窗口上,输入数字类ID以应用于区域。 班级ID可以包含多个数字。 数字不会在命令行中回显。 按ENTER键应用班级ID。 命令行将要求确认操作。 再次按ENTER键应用班级ID或按任何其他键取消操作。
类可以从主ImageView窗口或关联的缩放窗口分配。 虽然选择工具只生成矩形区域,但您可以将类分配给非矩形区域,方法是首先将类ID分配给覆盖所有感兴趣像素的超级矩形,然后将子矩形重新分配回0级(或其他任何 原始课程ID)。
Additional Capabilities附加功能
要获得有关ImageView键盘和鼠标功能的帮助,请在焦点位于图像窗口上时按下“h”键以显示所有的键控和鼠标功能:
Mouse Functions:
----------------
ctrl+left-click -> pan zoom window to pixel
shift+left-click&drag -> select rectangular image region
left-dblclick -> plot pixel spectrum
Keybinds:
---------
0-9 -> enter class ID for image pixel labeling
ENTER -> apply specified class ID to selected rectangular region
a/A -> decrease/increase class overlay alpha value
c -> set display mode to "classes" (if classes set)
C -> set display mode to "overlay" (if data and classes set)
d -> set display mode to "data" (if data set)
h -> print help message
i -> toggle pixel interpolation between "nearest" and SPy default.
z -> open zoom window
See matplotlib imshow documentation for addition key binds.
要自定义超出imshow函数提供的图像显示的行为,可以直接创建一个ImageView对象并在调用其show方法之前对其进行自定义。 您还可以从imshow返回的ImageView对象的axes属性中访问matplotlib图形和画布属性。 最后,您可以通过修改模块的SpySettings对象的成员来自定义图像显示的一些默认行为
Saving RGB Image Files保存RGB图像文件
要将图像显示保存到文件,请使用save_rgb函数,该函数使用与imshow相同的参数,但保存的图像文件名称作为第一个参数。
In [11]: save_rgb('rgb.jpg', img, [29, 19, 9])
保存索引的彩色图像与保存RGB图像相似; 但是,save_rgb无法确定要保存的图像是单色(灰度)图像还是索引彩色图像。 因此,要保存为索引的彩色图像,调色板必须作为关键字参数显式传递:
In [12]: save_rgb('gt.jpg', gt, colors=spy_colors)
Spectrum Plots光谱图
图像显示窗口提供了一些交互功能。 如果使用imshow(或view)创建图像显示,然后双击窗口中的特定位置,将会为点击的像素创建一个带有二维光谱图的新窗口。 它应该看起来像这样:
请注意,双击像素的行/列被打印在命令提示符处。 由于在我们的示例图像文件中没有光谱波段元数据,所以光谱图的轴是未标记的,并且像素波段值相对于波段数而不是波长绘制。 为了将数据绘制成波长,我们必须首先将光谱带信息与图像相关联。
In [13]: import spectral.io.aviris as aviris
In [14]: img.bands = aviris.read_aviris_bands('92AV3C.spc')
现在,关闭图像和光谱图窗口,再次调用视图并单击图像显示中的几个位置。 您会注意到x轴现在显示了与每个波段相关的波长。
请注意,光谱现在是针对它们相关的波长绘制的。
光谱图旨在方便用户快速查看图像中的光谱。 如果您想要更漂亮的相同数据的绘图,可以使用SPy从图像中读取光谱,并直接使用matplotlib创建自定义绘图。
Hypercube Display光谱立方体显示
在高光谱图像的情况下,3D超立方体是高光谱图像的三维表示,其中x和y维度是图像的空间维度,第三维度是光谱维度。 超立方体显示器的分析实用性是有争议的,但是没有争议的是它们看起来非常酷。
调用view_cube后,将打开一个新窗口,并显示3D超立方体。 将命令焦点移到新创建的窗口之后,可以使用键盘输入来更改超立方体的视图。 使用关键字参数,可以更改多维数据集顶部显示的图像以及多维数据集边上使用的色彩比例。
In [15]: view_cube(img, bands=[29, 19, 9])
Mouse Functions:
----------------
left-click & drag -> Rotate cube
CTRL+left-click & drag -> Zoom in/out
SHIFT+left-click & drag -> Pan
Keybinds:
---------
l -> toggle light
t/g -> stretch/compress z-dimension
h -> print help message
q -> close window
注意如果view_cube打开的窗口生成空白画布(不显示多维数据集),则可能是由于显示适配器不支持32位深度缓冲区。 您可以通过发出以下命令将view_cube和view_nd使用的深度缓冲区的大小减小到较小的值(例如16)
In [16]: import spectral
In [17]: spectral.settings.WX_GL_DEPTH_SIZE = 16
N-Dimensional Feature DisplayN维特征显示
由于高光谱图像包含数百个窄的连续带,因此频带(特别是相邻频带)之间通常具有强相关性。 为了增加所显示的信息量,通常将图像的维度降低到具有较高信息密度的较小的一组特征(例如,通过主分量转换)。
尽管如此,在转换的图像中通常仍然存在多于三个的特征,因此分析者必须确定哪些是要显示数据集的某些方面(例如,光谱类别的可分离性)的“最佳”三个特征。 希望能够快速切换显示的特征以在短时间跨度内检查许多特征的组合。
在大多数情况下,通过在查看数据之前首先执行降维(例如通过选择一定数量的主成分),显示将更加有用。
In [18]: data = open_image('92AV3C.lan').load()
In [19]: gt = open_image('92AV3GT.GIS').read_band(0)
In [20]: pc = principal_components(data)
Covariance.....done
In [21]: xdata = pc.transform(data)
In [22]: w = view_nd(xdata[:,:,:15], classes=gt)
一个新的窗口应该打开并显示如下
N维窗口的初始视图
python提示符将显示ND窗口所接受的一组键盘和鼠标命令:
Mouse functions:
---------------
Left-click & drag --> Rotate viewing geometry (or pan)
CTRL+Left-click & drag --> Zoom viewing geometry
CTRL+SHIFT+Left-click --> Print image row/col and class of selected pixel
SHIFT+Left-click & drag --> Define selection box in the window
Right-click --> Open GLUT menu for pixel reassignment
Keyboard functions:
-------------------
a --> Toggle axis display
c --> View dynamic raster image of class values
d --> Cycle display mode between single-quadrant, mirrored octants,
and independent octants (display will not change until features
are randomzed again)
f --> Randomize features displayed
h --> Print this help message
m --> Toggle mouse function between rotate/zoom and pan modes
p/P --> Increase/Decrease the size of displayed points
q --> Exit the application
r --> Reset viewing geometry
u --> Toggle display of unassigned points (points with class == 0)
下图显示了旋转显示后的同一窗口,未标记的像素(白色)被抑制,显示的像素尺寸增加:
N-Dimensinal窗口的修改视图
Display Modes显示模式
为了促进高维图像的交互式可视化分析,view_nd函数提供了多种模式来在三维显示窗口中显示高维数据:
- 单八度模式 - 在此模式下,图像中的三个要素被选中并映射到三维窗口中的x,y和z轴。数据被翻译和缩放,使得显示的点填充3D空间的正x / y / z八分度。用户可以选择随机选择一组新的三个功能来显示。通过这种随机化能力,用户可以快速循环各种特征组合,以确定合意的投影。
- 镜像十进制模式 - 在这种模式下,三个特征映射到x轴,y轴和z轴,如单八度模式。然而,另外三个特征被选择并且映射x,y和z轴的负部分。然后,图像像素被显示在3D显示的八个八分区中的每一个八分区中,使用与特定八分圆的三个半轴相关联的任何特征。在这种模式下,由两个半轴定义的每个部分平面可以被认为是一面镜子,两个垂直的半轴代表不同的特征。例如,如果x,y,z,-x,-y和-z半轴分别与特征1至6相关联,则x / y / z和x / y / z象限将在x / y平面上具有共同的投影。但是,由于z和-z被映射到不同的特征,所以数据点将沿着z和-z轴具有不同的投影。与单卦模式一样,用户可以随机显示6个特征。
- 独立八分模式 - 在此模式下,三维空间的每个八分区代表3个独立的功能,最多可显示24个功能。 与其他两种模式一样,数据点被平移和缩放,使得整组图像像素完全填充每个八分圆。 一个特定的特征可能会被用于多个八分圆。
用户可以选择切换显示模式。 哪种显示模式最好取决于与所使用的数据集或运行应用程序的系统有关的许多因素。 对于像素数量足够大的图像,系统的显示刷新率可能开始受镜像八分体或独立八分体模式的影响,因为每个图像像素必须呈现8次。 当性能不成问题时,后两种模式提供了更多的数据同步预测,可以使用户更快地探索数据集。
User Interaction用户交互
渲染的图像数据的初始3D视图几乎肯定不会是理想的3D观看几何体; 因此,该窗口允许用户通过使用鼠标输入来缩放,平移和旋转查看几何图形来操纵视图。 用户还可以增加/减小显示图像像素的大小,并切换未标记(0级)像素的显示。
虽然像素颜色允许用户区分显示像素的类别,但是给定颜色与哪个类别相关联可能并不明显。 为了识别特定像素的类别,用户可以点击一个像素,python命令行将打印图像中的像素位置(行和列值)和像素类别的编号(ID)。 由于点击单个屏幕像素是困难的,因此用户可以首先增加显示的图像像素的尺寸,使得可以用鼠标容易地选择图像像素。
Data Manipulation数据操作
分析师通常要检查无监督分类的结果,然后合并像素类或将像素重新分配给新的或不同的类。类似地,分析师可能想要评估地面实况数据,并可能重新分配在地面真实图像开发时错误地包括在类中的像素。为了支持这种功能,N-D窗口允许用户用鼠标点击并拖动以选择矩形区域,然后重新分配位于定义框内的所有像素。该应用程序不仅可以重新分配选择框内可见的像素,而且还可以通过3D空间重新分配框内投影的所有像素。
当调用view_nd时,它将返回一个代理对象,该代理对象具有一个类成员,该成员表示与ND显示关联的当前类值的数组。通过ND窗口重新分配图像像素后,代理对象可用于访问更新的类数组。代理对象也有一个set_features方法来指定在3D窗口中显示的一组功能
提示在重新分配像素类值之前,按“c”键打开第二个窗口,显示当前图像像素类值的栅格视图。 然后,当您在ND窗口中重新分配像素类时,类栅格视图将自动更新,提供并指示源图像中哪些像素被修改。