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. |
|
68 [im, map] = loadimage (im); |
|
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"; |
|
106 displayrange = varargin{narg++}; |
|
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 |
5934
|
118 ## Set default display range. |
7328
|
119 if (isempty (display_range)) |
7074
|
120 display_range = [min(im(:)), max(im(:))]; |
|
121 else |
|
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. |
7328
|
150 if (! indexed || 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"); |
7074
|
169 |
|
170 if (nargout > 0) |
|
171 h = tmp; |
|
172 endif |
|
173 |
559
|
174 endfunction |
4836
|
175 |
|
176 %!error imshow () # no arguments |
5934
|
177 %!error imshow ({"cell"}) # No image or filename given |
|
178 %!error imshow (ones(4,4,4)) # Too many dimensions in image |
4836
|
179 |
|
180 %!demo |
7074
|
181 %! imshow ("default.img"); |
|
182 |
|
183 %!demo |
|
184 %! imshow ("default.img"); |
|
185 %! colormap ("autumn"); |
4836
|
186 |
|
187 %!demo |
|
188 %! [I, M] = loadimage ("default.img"); |
5318
|
189 %! imshow (I, M); |
|
190 |
|
191 %!demo |
|
192 %! [I, M] = loadimage ("default.img"); |
5934
|
193 %! imshow (cat(3, I, I*0.5, I*0.8)); |
5318
|
194 |
|
195 %!demo |
7074
|
196 %! imshow (rand (100, 100)); |
|
197 |
|
198 %!demo |
|
199 %! imshow (rand (100, 100, 3)); |
|
200 |
|
201 %!demo |
|
202 %! imshow (100*rand (100, 100, 3)); |
|
203 |
|
204 %!demo |
|
205 %! imshow (rand (100, 100)); |
|
206 %! colormap (jet); |