On Tue, Jan 31, 2012 at 1:15 PM, Cousoulis, Paul <pcousou...@meso-scale.com> wrote: > The second image is a 32 bit tif, so you need to use something like ImageJ or > Fiji.
not in the code you sent -- it was just garbage, but that wasn't the issue you were testing here. > Microsoft image viewer won't work. Why in the world would I even try that? ;-) > I think I shouldn't have to fiddle with the row/column order, If you use the same method to convert to/from numpy, then you don't need to fiddle with it. You only needed to fiddle if you used one method to go one way, and a different method to go the other. > but I guess it needs to stay the way it is. I do agree that it's not ideal like this, but not bad, once you expect it. -Chris Thanks for the help. > > Paul > > -----Original Message----- > From: Chris Barker [mailto:chris.bar...@noaa.gov] > Sent: Tuesday, January 31, 2012 1:18 PM > To: Cousoulis, Paul; image-sig@python.org > Subject: [SPAM] - Re: [Image-SIG] fromarray rotates image - Email found in > subject > > <putting the image-sig list back on the thread... > > > On Tue, Jan 31, 2012 at 8:38 AM, Cousoulis, Paul <pcousou...@meso-scale.com> > wrote: >> I'm sorry but I still think there is a bug. > > I still don't think so: explanation below. > > By the way, there is another problem with your example -- I get an all-black > second image. I think you need to specify the image mode when you create the > new image: > > newimage = Image.fromarray(npArray, mode=image1.mode) > > though that still makes a mess of it! -- more debugging to be done here -- > see below > >> In [4]: print image1.size >> (516, 356) >> >> In [5]: npArray = np.array(image1.getdata()) >> >> In [6]: print npArray.shape >> (183696L,) > > OK so far > > >> In [7]: npArray.shape = image1.size > >> In [8]: print npArray.shape >> (516L, 356L) > > here I would swap -- as numpy naturally stores data the other way: > > and now it works: > > In [8]: run pil-numpy-test.py > <PIL.TiffImagePlugin.TiffImageFile image mode=L size=516x356 at 0x3A86468> > input image size: (516, 356) numpy image shape before: (183696,) numpy image > shape after: (356, 516) <PIL.Image.Image image mode=L size=516x356 at > 0x176C1E8> new image size (516, 356) > > (though the colors are still screwed up -- I don't know what's up with > that...) > > I can see how you'd expect it to work the way you had it, but I think the > problem is that you are mixing two ways to push raw data to/froim numpy > arrays: > > npArray = np.array(image1.getdata()) > > is using PIL's getdata() to put the raw data in a string, then turning that > into a numpy array (oh, and that may be the source of teh data mess up > too...np.array is expecting a sequence of numbers or something, not raw data > -- you want: > > OOPS, actually, getdata returns something else altogether: > > """ > getdata > > im.getdata() => sequence > > Returns the contents of an image as a sequence object containing pixel > values. The sequence object is flattened, so that values for line one follow > directly after the values of line zero, and so on. > > Note that the sequence object returned by this method is an internal PIL data > type, which only supports certain sequence operations, including iteration > and basic sequence access. To convert it to an ordinary sequence (e.g. for > printing), use list(im.getdata()). > """ > so it should be: > > npArray = np.fromstring(image1.tostring(), dtype=np.uint8) > > npArray.shape = (image1.size[1], image1.size[0] ) > > and that now works -- correct size, and correct final image. > > However: > > newimage = Image.fromarray(npArray) > > is using the numpy "array protocol", which is a bit different than > fromstring/tostring -- it carries shape information -- hence the need to > specify the shape of the numpy array as I did. > > you can use that protocol both ways: > > npArray = np.asarray(image1) > > which then preserved size info. > > Here's my new version: > > from PIL import Image > import numpy as np > > > image1 = Image.open("LineGraph.tif") > print image1 > print "input image size:", image1.size > > npArray = np.asarray(image1) > > print "numpy image shape after:", npArray.shape > > newimage = Image.fromarray(npArray, mode=image1.mode) > > print newimage > print "new image size", newimage.size > > newimage.save("LineGraph2.tif") > > > NOTE: if you do fromstring/tostring (or tobuffer) consistently, then it > doesn't matter what shape you make the numpy array: > > > image1 = Image.open("LineGraph.tif") > print image1 > print "input image size:", image1.size > > npArray = np.fromstring(image1.tostring(), dtype=np.uint8) > > print "numpy image shape:", npArray.shape > > newimage = Image.fromstring(image1.mode, image1.size, npArray.tostring()) > > print newimage > print "new image size", newimage.size > > newimage.save("LineGraph2.tif") > > But that's less efficient, and messier. > > NOTE: it might have been nicer if the array protocol were used such that the > array created was fortran-order, and thus (w,h) in shape, but so it goes. > > HTH, > > -Chris > > > > > -- > > Christopher Barker, Ph.D. > Oceanographer > > Emergency Response Division > NOAA/NOS/OR&R (206) 526-6959 voice > 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) > 526-6317 main reception > > chris.bar...@noaa.gov -- Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/OR&R (206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception chris.bar...@noaa.gov _______________________________________________ Image-SIG maillist - Image-SIG@python.org http://mail.python.org/mailman/listinfo/image-sig