Tobias Wood wrote:
> Hi everyone,
> After getting fed severely fed up with Matlab in recent months I 
> downloaded Python, Numpy and Matplotlib to try out as an alternative. So 
> far I'm pleasantly impressed, even if building from source on Mac OS X 
> is an experience ;) However, I have discovered a couple of problems with 
> Matplotlib's imread() function and, shall we say, 'esoteric' PNG files. 
> My research group uses a 12-bit CCD controlled through Labview to 
> capture high dynamic range image stacks. Often there are ~30 images in a 
> single data set. These get read into Matlab in one go for processing as 
> a stack. I tried converting my code over to Python but, after digging 
> through the _png.cpp source file found the following that are problems 
> from my point of view:
> 
> 1) All .png files in imread() are converted to 4-plane RGBA files 
> regardless of original format. I would prefer greyscale images to return 
> a single plane.
> 2) 16-bit PNGs are stripped to 8 bit, losing any extra precision.
> 3) The significant bits option in the PNG header was not being checked. 
> Our camera software will automatically save the PNGs at the maximum 
> bit-depth required to cover the dynamic range in the image, and can sum 
> images before saving, so pixels can be anywhere from 6- to 16-bits (at 
> least those are the values I have observed whilst using the camera).
> 
> I have attached the results of an svn diff after I made an attempt at 
> correcting these issues. This is the first time I have contributed to an 
> open source project, so am not sure of the etiquette here. Also, I have 
> only had Python and Matplotlib for a fortnight so am still unfamiliar 
> with them and haven't programmed with libpng before so I apologise in 
> advance if there any stupid mistakes in my code. I am aware that 
> imread() is a pretty important function in Matplotlib and hence any 
> changes I suggest would need comprehensive testing. In brief, I made the 
> following changes:

Tobias,

Thank you very much for the patch and the careful explanation.  I'm not 
the right person to review it, but I expect someone familiar with libpng 
use in mpl will do so soon.  Mike D. would be a candidate, but I think 
he will be unavailable for several days.  If you have not gotten any 
feedback within a week, *please* ping us with a reminder.  If it comes 
to that, you could do it by forwarding your original message to 
matplotlib-devel.

Eric

> 
> 1) Removed the libpng 16- to 8-bit strip command
> 2) Added in the libpng calls to cope with variable bit-depth and 
> converting 16-bit pngs from big-endian to little-endian
> 3) Added a large if/else if stucture at the end to return different 
> PyArrays depending on the input data. RGBA images are 4 plane, RGB 3 
> plane and greyscale 1 plane. Numbers within these are still floats 
> scaled between 0 and 1, except 16-bit images which are doubles (Are 
> floats preferable to doubles?). The scaling factor is worked out from 
> the significant bits struct.
> 
> There are still a couple of issues with this code, mainly that I have 
> only tested it with PNGs I have lying to hand, all of which display 
> correctly with imshow() and I have not made much attempt at supporting 
> 1,2 and 4 bit pngs. I'm personally not a big fan of large if/else ifs 
> but in this case thought it was the clearest way to return the different 
> types.
> 
> I would finally like to point out that no software I have used so far 
> has been able to read the images produced by this camera completely 
> correctly. PIL interprets the variable bit-depth images as binary (?!), 
> and we had to write a wrapper round the Matlab imread() function using 
> iminfo() as Matlab ignores the significant bits setting as well.
> 
> Oh, almost forgot, I'm compiling on Mac OS X 10.5, Python 2.6.1 
> (r261:67515) and the latest Numpy and Matplotlib SVN checkouts.
> 
> Kind regards,
> Tobias Wood

------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to