2009/10/21 Stéfan van der Walt <stefan@sun.ac.za>

Hey Ralf

2009/10/21 Ralf Gommers <ralf.gommers@googlemail.com>:
> Fixed in my asgrey branch:
> http://github.com/rgommers/scikits.image/tree/asgrey
> I sent Stefan a pull request but grab it there if you need it now.
>
> If you only have grey-scale images setting as_grey to False should do the
> right thing as well.

Seeing the problem Holger reported makes me think that imread's
behaviour is rather counter-intuitive.  Should we not introduce a
dtype flag, so that the outcome type is always as expected?

There is a dtype argument already, you merged my patch for that, commit 44679c7aae5d6b3747c88d46756a3dc96c9a727f.

I.e.

imread('x.png') -> (uint8, uint8, uint8, ...)
imread('x.png', flatten=True) -> uint8
imread('x.png', flatten=True, dtype=float) -> float
imread('x.png', dtype=float) -> (float, float, float, ...)

When it comes to dtypes, surprises are seldom good.

What do you think?


I think a "flatten" keyword is useful, and float32 is a reasonable default. imread should just not try to flatten images that are already flat.

Note that flatten does not only change the dtype, but also does color -> grey-scale correctly. i.e. it returns a 2-D instead of 3-D array:

>>> lena = imread(os.path.join(data_dir, 'lena.png'), dtype="float32")
>>> lena.shape
(128, 128, 3)
>>> lena.dtype
dtype('float32')

>>> lena = imread(os.path.join(data_dir, 'lena.png'), flatten=True)
>>> lena.shape
(128, 128)
>>> lena.dtype
dtype('float32')

Cheers,
Ralf


Cheers
Stéfan