【python的Img的数据结构】我觉得这个数据的结构应该是个列表,但是感觉怪怪的
本帖最后由 somebodykiss 于 2013-03-22 16:58:22 编辑 我是一个python刚入门的新手,刚刚学习过python的syntax,现在用python的一个图像处理类库SimpleCV。
在一个讲解piexl and image这个环节,官方文档说,要访问图像的某一确定部分,可以用类似于二维数组的方法。(原话是: For the Python aficionados, it is also possible to do cropping by directly manipulating
the two dimensional array of the image.)
但是对于下面这段话,我就有点费解了:
For example, img[start_x:end_x, start_y:end_y] provides a cropped image from (start_x, start_y) to (end_x, end_y).
从img[start_x:end_x, start_y:end_y]的语法结构来看,这是python中的一个slicing, 但是我查看了《Learning.Python》这本书中讲解list的这部分,说对于list slicing, 都是list[i:j]的形式,没有list[i:j, k:l]这种形式。
我在python的interpreter中,用列表的形式构造了下列的二维数组:
matrix = [ [1,2,3], [4,5,6], [7,8,9] ]
然后用matrix[0:2,0:2],试图访问一个2x2的子矩阵,但是在interpreter中提示说:
TypeError: list indices must be integers, not tuple
我寻思着可能SimpleCV中Image的数据结构可能不是用嵌套列表的方法来实现的类似2 dimension array。如果这样的话, 那么img[start_x:end_x, start_y:end_y]这种形式的数据结构可能会是怎么样子的?
谢谢。
[解决办法]
建议好好阅读文档,如果你用过numpy和scipy这2个包,对于这种slice应该不会陌生,这是类matlab的二维数组索引方式,在数值计算包numpy和scipy中有具体实现,ndarray或者ndimage.为了实现像matlab一样方便的的矩阵切割.
例如:
>>> import numpy
>>> a = numpy.ndarray((2,3))
>>> a
array([[ 2.49208464e-306, -3.13264791e-294, 6.73606550e-310],
[ 2.49208610e-306, 3.91957011e+202, 1.43575936e-308]])
>>> a[1:2,1:2]
array([[ 3.91957011e+202]])
>>> a[1:,1:]
array([[ 3.91957011e+202, 1.43575936e-308]])
>>>
inited
you want get a item of slice(1, 3, None)
you give me a type: <class 'slice'>
you want get a item of 1
you give me a type: <class 'int'>
you want get a item of a
you give me a type: <class 'str'>
inited
you want get a item of <__main__.t object at 0x012EAFD0>
you give me a type: <class '__main__.t'>
you want get a item of (slice(1, 3, None), slice(4, 6, None))
you give me a type: <class 'tuple'>
Traceback (most recent call last):
File "C:\slic.py", line 21, in <module>
tt[1:3,4:6]
File "C:\slic.py", line 9, in __getitem__
raise TypeError('My list indices must be integers, str , object ,but not tuple')
TypeError: My list indices must be integers, str , object ,but not tuple
>>>
(说明 :如果有人在2.6下测试不一样,那么你可以去看python的源码,或者。。。。。。我无话可说)