Mercurial > hg > octave-nkf
annotate scripts/image/imshow.m @ 8117:40aa36406a94
Fix for display_range in imshow
author | Kris Thielemans |
---|---|
date | Thu, 18 Sep 2008 10:46:47 -0400 |
parents | de26beacb20f |
children | eb63fbe60fab |
rev | line source |
---|---|
7017 | 1 ## Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2004, 2005, |
7074 | 2 ## 2006, 2007 John W. Eaton |
5934 | 3 ## |
2313 | 4 ## This file is part of Octave. |
5 ## | |
6 ## Octave is free software; you can redistribute it and/or modify it | |
7 ## under the terms of the GNU General Public License as published by | |
7016 | 8 ## the Free Software Foundation; either version 3 of the License, or (at |
9 ## your option) any later version. | |
2313 | 10 ## |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 ## General Public License for more details. | |
15 ## | |
16 ## You should have received a copy of the GNU General Public License | |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
18 ## <http://www.gnu.org/licenses/>. | |
1024 | 19 |
3381 | 20 ## -*- texinfo -*- |
5934 | 21 ## @deftypefn {Function File} {} imshow (@var{im}) |
22 ## @deftypefnx {Function File} {} imshow (@var{im}, @var{limits}) | |
23 ## @deftypefnx {Function File} {} imshow (@var{im}, @var{map}) | |
7074 | 24 ## @deftypefnx {Function File} {} imshow (@var{rgb}, @dots{}) |
5934 | 25 ## @deftypefnx {Function File} {} imshow (@var{filename}) |
6309 | 26 ## @deftypefnx {Function File} {} imshow (@dots{}, @var{string_param1}, @var{value1}, @dots{}) |
6368 | 27 ## Display the image @var{im}, where @var{im} can be a 2-dimensional |
7074 | 28 ## (gray-scale image) or a 3-dimensional (RGB image) matrix. |
5934 | 29 ## |
30 ## If @var{limits} is a 2-element vector @code{[@var{low}, @var{high}]}, | |
31 ## the image is shown using a display range between @var{low} and | |
32 ## @var{high}. If an empty matrix is passed for @var{limits}, the | |
33 ## display range is computed as the range between the minimal and the | |
34 ## maximal value in the image. | |
3426 | 35 ## |
5934 | 36 ## If @var{map} is a valid color map, the image will be shown as an indexed |
37 ## image using the supplied color map. | |
38 ## | |
39 ## If a file name is given instead of an image, the file will be read and | |
40 ## shown. | |
3426 | 41 ## |
5934 | 42 ## If given, the parameter @var{string_param1} has value |
43 ## @var{value1}. @var{string_param1} can be any of the following: | |
44 ## @table @samp | |
6368 | 45 ## @item "displayrange" |
5934 | 46 ## @var{value1} is the display range as described above. |
47 ## @end table | |
5642 | 48 ## @seealso{image, imagesc, colormap, gray2ind, rgb2ind} |
3373 | 49 ## @end deftypefn |
904 | 50 |
7074 | 51 ## Author: Stefan van der Walt <stefan@sun.ac.za> |
5934 | 52 ## Author: Soren Hauberg <hauberg at gmail dot com> |
2312 | 53 ## Adapted-By: jwe |
559 | 54 |
7074 | 55 function h = imshow (im, varargin) |
559 | 56 |
5934 | 57 if (nargin == 0) |
58 print_usage (); | |
5318 | 59 endif |
60 | |
7328 | 61 display_range = NA; |
7074 | 62 true_color = false; |
63 indexed = false; | |
64 | |
5935 | 65 ## Get the image. |
5934 | 66 if (ischar (im)) |
7074 | 67 ## Eventually, this should be imread. |
7931
de26beacb20f
imread.m: simplify; loadimage.m: deprecate
John W. Eaton <jwe@octave.org>
parents:
7930
diff
changeset
|
68 [im, map] = imread (im); |
7074 | 69 indexed = true; |
70 colormap (map); | |
71 endif | |
72 | |
73 if (! (isnumeric (im) && (ndims (im) == 2 || ndims (im) == 3))) | |
5934 | 74 error ("imshow: first argument must be an image or the filename of an image"); |
5318 | 75 endif |
7074 | 76 |
77 if (ndims (im) == 2) | |
78 if (! indexed) | |
79 colormap (gray ()); | |
80 endif | |
81 elseif (size (im, 3) == 3) | |
82 if (ismember (class (im), {"uint8", "uint16", "double", "single"})) | |
83 true_color = true; | |
84 else | |
85 error ("imshow: color image must be uint8, uint16, double, or single"); | |
86 endif | |
87 else | |
88 error ("imshow: expecting MxN or MxNx3 matrix for image"); | |
5318 | 89 endif |
90 | |
7074 | 91 narg = 1; |
92 while (narg <= numel (varargin)) | |
93 arg = varargin{narg++}; | |
94 if (isnumeric (arg)) | |
7331 | 95 if (numel (arg) == 2 || isempty (arg)) |
7074 | 96 display_range = arg; |
97 elseif (columns (arg) == 3) | |
98 indexed = true; | |
99 colormap (arg); | |
100 elseif (! isempty (arg)) | |
101 error ("imshow: argument number %d is invalid", narg+1); | |
102 endif | |
103 elseif (ischar (arg)) | |
104 switch (arg) | |
105 case "displayrange"; | |
8117 | 106 display_range = varargin{narg++}; |
7074 | 107 case {"truesize", "initialmagnification"} |
108 warning ("image: zoom argument ignored -- use GUI features"); | |
109 otherwise | |
110 warning ("imshow: unrecognized property %s", arg); | |
111 narg++; | |
112 endswitch | |
113 else | |
114 error ("imshow: argument number %d is invalid", narg+1); | |
115 endif | |
116 endwhile | |
117 | |
8117 | 118 ## Set default display range if display_range not set yet. |
7328 | 119 if (isempty (display_range)) |
7074 | 120 display_range = [min(im(:)), max(im(:))]; |
8117 | 121 elseif (isna (display_range)) |
7074 | 122 t = class (im); |
123 switch (t) | |
124 case {"double", "single", "logical"} | |
125 display_range = [0, 1]; | |
126 case {"int8", "int16", "int32", "uint8", "uint16", "uint32"} | |
7328 | 127 ## For compatibility, uint8 data should not be handled as |
128 ## double. Doing so is a quick fix to allow the images to be | |
129 ## displayed correctly. | |
130 display_range = double ([intmin(t), intmax(t)]); | |
7074 | 131 otherwise |
132 error ("imshow: invalid data type for image"); | |
133 endswitch | |
134 endif | |
5934 | 135 |
5935 | 136 ## Check for complex images. |
5934 | 137 if (iscomplex (im)) |
138 warning ("imshow: only showing real part of complex image"); | |
139 im = real (im); | |
5318 | 140 endif |
141 | |
6219 | 142 nans = isnan (im(:)); |
143 if (any (nans)) | |
144 warning ("Octave:imshow-NaN", | |
7074 | 145 "imshow: pixels with NaN or NA values are set to minimum pixel value"); |
6219 | 146 im(nans) = display_range(1); |
147 endif | |
148 | |
7074 | 149 ## This is for compatibility. |
7930
1f6eb3de1c4e
__img__.m, imshow.m, __go_draw_axes__.m: improve handling of truecolor images
John W. Eaton <jwe@octave.org>
parents:
7511
diff
changeset
|
150 if (! (indexed || (true_color && isinteger (im))) || islogical (im)) |
7074 | 151 im = double (im); |
152 endif | |
153 | |
5934 | 154 ## Scale the image to the interval [0, 1] according to display_range. |
7315 | 155 if (! (true_color || indexed || islogical (im))) |
7328 | 156 low = display_range(1); |
157 high = display_range(2); | |
158 im = (im-low)/(high-low); | |
5934 | 159 im(im < 0) = 0; |
160 im(im > 1) = 1; | |
4836 | 161 endif |
6368 | 162 |
7074 | 163 if (true_color) |
7315 | 164 tmp = __img__ ([], [], im); |
5934 | 165 else |
7074 | 166 tmp = image (round ((rows (colormap ()) - 1) * im)); |
5934 | 167 endif |
7315 | 168 set (gca (), "visible", "off"); |
7511
f028e7aa77a7
imshow.m: use axis ("image")
John W. Eaton <jwe@octave.org>
parents:
7331
diff
changeset
|
169 axis ("image"); |
7074 | 170 |
171 if (nargout > 0) | |
172 h = tmp; | |
173 endif | |
174 | |
559 | 175 endfunction |
4836 | 176 |
177 %!error imshow () # no arguments | |
5934 | 178 %!error imshow ({"cell"}) # No image or filename given |
179 %!error imshow (ones(4,4,4)) # Too many dimensions in image | |
4836 | 180 |
181 %!demo | |
7074 | 182 %! imshow ("default.img"); |
183 | |
184 %!demo | |
185 %! imshow ("default.img"); | |
186 %! colormap ("autumn"); | |
4836 | 187 |
188 %!demo | |
189 %! [I, M] = loadimage ("default.img"); | |
5318 | 190 %! imshow (I, M); |
191 | |
192 %!demo | |
193 %! [I, M] = loadimage ("default.img"); | |
5934 | 194 %! imshow (cat(3, I, I*0.5, I*0.8)); |
5318 | 195 |
196 %!demo | |
7074 | 197 %! imshow (rand (100, 100)); |
198 | |
199 %!demo | |
200 %! imshow (rand (100, 100, 3)); | |
201 | |
202 %!demo | |
203 %! imshow (100*rand (100, 100, 3)); | |
204 | |
205 %!demo | |
206 %! imshow (rand (100, 100)); | |
207 %! colormap (jet); |