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