From help-octave-request at bevo dot che dot wisc dot edu Mon Dec 6 07:20:29 1999 Subject: Re: How do I read an image into octave? From: Clif Kussmaul To: Alasdair dot McAndrew at vu dot edu dot au CC: help-octave at bevo dot che dot wisc dot edu Date: Mon, 06 Dec 1999 08:20:27 -0500 This is a multi-part message in MIME format. --------------421017250D7BB19B408C44EB Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Here's a modified "loadimage" that reads a variety of PPM/PGM/PBM formats. It's not perfect (for example, there are legal PPM comments that will derail it), but it does seem to be able to read images generated by xv, etc. Please share problems or suggestions... Clif Alasdair McAndrew wrote: > I've just successfully compiled octave under linux; I'd like to use it > to test some image processing algorithms. But according to the info > pages, images must be in octave's "img" format. This is all very > well, but how do I get a pgm/tif/gif/png image into that format? Are > there any file handling routines which will take, say, a 256 grey level > pgm image and produce a matrix in octave? > > In other word, is there an octave equivalent to MATLAB's "imread" > command? -- -------------------------------------------------------------------- Clif Kussmaul mailto:kussmaul at cs dot moravian dot edu ph:610-861-1570 (Asst Prof) http://www.cs.moravian.edu/~kussmaul fax:610-861-3979 Computer Science, Moravian College, 1200 Main St, Bethlehem PA 18018 --------------421017250D7BB19B408C44EB Content-Type: text/plain; charset=us-ascii; name="loadimage2.m" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="loadimage2.m" ## Copyright (C) 1996 John W. Eaton ## ## This file is part of Octave. ## ## Octave is free software; you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2, or (at your option) ## any later version. ## ## Octave is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Octave; see the file COPYING. If not, write to the ## Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA ## 02111-1307, USA. ## Load an image file. ## ## [img, map] = loadimage (img_file) ## loads an image and its associated color map from file img_file, ## which must be in octave's image format. ## ## [img, map] = loadimage (img_file, "img") ## is the same as loadimage (img_file). ## ## [r, g, b] = loadimage (img_file, "ppm") ## loads an image from file img_file, ## which must be in color ppm format (ascii or binary). ## ## [img, map] = loadimage (img_file, "ppm") ## loads an image from file img_file, ## which may be in any ppm format (ascii or binary). ## If the image is in color (ppm, not pgm or pbm), ## rgb2ind() is used to convert it to an indexed image. ## ## if no output arguments are specified, the image is displayed ## ## SEE ALSO: saveimage, load, save ## Author: Tony Richardson ## Created: July 1994 ## Adapted-By: jwe ## Updated Nov 1999 to include ppm,pgm.pbm image formats by ## Clif Kussmaul ## and Tricia Salomonsen . function [...] = loadimage2 (filename, img_form) ## process arguments if (nargin < 1 || nargin > 2) usage ("[img, map] = loadimage (filename, [format])"); endif if (! isstr (filename)) error ("loadimage: file name must be a string"); endif if (nargin < 2) img_form = "img"; endif ######################################## ## load image in octave's image format if (strcmp (img_form, "img")) ## file is in octave's image format, ## and is assumed to have variables img and map, or X and map. file = file_in_path (IMAGEPATH, filename); if (isempty (file)) error ("loadimage: unable to find image file"); endif eval (['load ', file]); if (exist ("img")) img_retval = img; elseif (exist ("X")) img_retval = X; else error ("loadimage: invalid image file found"); endif if (exist ("map")) map_retval = map; else error ("loadimage: invalid image file found"); endif if (nargout == 0) imshow(img_retval, map_retval); else vr_val(img_retval); vr_val(map_retval); endif ## end of img format ######################################## ## load image in PBM/PGM/PPM image format elseif (strcmp (img_form, "ppm") || strcmp (img_form, "pgm") || strcmp (img_form, "pbm") ) ## check magic number fp = fopen(filename,"r"); magic = fscanf(fp,"%c",2); if (magic(1) != "P") error ("loadimage: invalid image file (bad magic number)"); endif ## read 2 values (W,H) for pbm, 3 (W,H,M) for pgm or ppm if (magic(2) == "1" || magic(2) == "4") dneed = 2; else dneed = 3; endif while (dneed > 0) ## skip blank lines and comment lines while (1) data = fgetl(fp); if (length(data) > 0 && ! strcmp(data(1),"#")) break; endif endwhile ## try to read values [dvals, dcnt] = sscanf(data, "%d", dneed); if (dneed >= 3 && dneed - dcnt < 3) dsize(3) = dvals(dneed - 2); endif if (dneed >= 2 && dneed - dcnt < 2) dsize(2) = dvals(dneed - 1); endif if (dneed >= 1 && dneed - dcnt < 1) dsize(1) = dvals(dneed - 0); endif dneed = dneed - dcnt; endwhile if (magic(2) == "1" || magic(2) == "4") # read binary PBM in ascii ("1") or binary ("4") and transpose if (magic(2) == "1") data = fscanf(fp, "%d", [ dsize(2) dsize(1)] )'; else idata = fread(fp, [ceil(dsize(2)/8) dsize(1)], "uchar")'; ## unpack bits from bytes data = zeros(dsize(1),dsize(2)); for i=8:-1:1 data(:,i:8:size(data,2)) = rem(idata, 2); idata = floor(idata / 2); endfor endif # would like to make 2-entry colormap, but imshow crashes in saveimage.m data = (!data) * 255; map = gray(256); if (nargout == 0) imshow(data, map); else vr_val(data); vr_val(map); endif elseif (magic(2) == "2" || magic(2) == "5") ## read greyscale PGM in ascii ("2") or binary ("5") and transpose if (magic(2) == "2") data = fscanf(fp, "%d", [dsize(3) dsize(2)] )'; else data = fread( fp, [dsize(3) dsize(2)], "uchar")'; endif map = gray(dsize(1)); if (nargout == 0) imshow(data, map); else vr_val(data); vr_val(map); endif elseif (magic(2) == "3" || magic(2) == "6") ## read color PPM in ascii ("3") or binary ("6") if (magic(2) == "3") data = fscanf(fp, "%d", [dsize(3)*3 dsize(2)] ); else data = fread( fp, [dsize(3)*3 dsize(2)], "uchar"); endif # extract R,G,B values between 0 and 1 data = data / dsize(1); r = data(1:3:size(data,1),:)'; g = data(2:3:size(data,1),:)'; b = data(3:3:size(data,1),:)'; if (nargout == 0) imshow(r,g,b); elseif (nargout < 3) [img_retval, map_retval] = rgb2ind(r, g, b); vr_val(img_retval); vr_val(map_retval); elseif (nargout == 3) vr_val(r); vr_val(g); vr_val(b); endif else error("loadimage: invalid image file (bad magic number)"); endif fclose(fp); ## end of ppm/pgm/pbm format else error ("loadimage: image format not supported."); endif endfunction --------------421017250D7BB19B408C44EB-- ----------------------------------------------------------------------- Octave is freely available under the terms of the GNU GPL. Octave's home on the web: http://www.che.wisc.edu/octave/octave.html How to fund new projects: http://www.che.wisc.edu/octave/funding.html Subscription information: http://www.che.wisc.edu/octave/archive.html -----------------------------------------------------------------------