Mercurial > octave
changeset 24611:afbef2f579c9
ngb2ntsc.m, ntsc2rgb.m: Remove functions moved to image package.
* ntsc2rgb.m, rgb2ntsc.m: Delete functions.
* scripts/image/module.mk: Remove scripts from build system.
* NEWS: Announce change.
* image.txi: Remove DOCSTRINGS from manual.
* hsv2rgb.m, ind2rgb.m: Remove functions from seealso references.
author | Rik <rik@octave.org> |
---|---|
date | Tue, 16 Jan 2018 21:23:51 -0800 |
parents | 3ad53e4793fc |
children | 6c8822790411 |
files | NEWS doc/interpreter/image.txi scripts/image/hsv2rgb.m scripts/image/ind2rgb.m scripts/image/module.mk scripts/image/ntsc2rgb.m scripts/image/rgb2ntsc.m |
diffstat | 7 files changed, 11 insertions(+), 352 deletions(-) [+] |
line wrap: on
line diff
--- a/NEWS Tue Jan 16 21:14:22 2018 -0800 +++ b/NEWS Tue Jan 16 21:23:51 2018 -0800 @@ -212,6 +212,12 @@ z_test.m z_test_2.m + ** The following image functions have been moved from core Octave to + the image package available from Octave Forge. + + ntsc2rgb + rgb2ntsc + ** Other new functions added in 4.4: bounds
--- a/doc/interpreter/image.txi Tue Jan 16 21:14:22 2018 -0800 +++ b/doc/interpreter/image.txi Tue Jan 16 21:23:51 2018 -0800 @@ -251,15 +251,12 @@ @node Color Conversion @section Color Conversion -Octave supports conversion from the RGB color system to NTSC and HSV -and vice versa. +Octave supports conversion from the RGB color system to the HSV color system +and vice versa. It is also possible to convert from a color RGB image to a +grayscale image. @DOCSTRING(rgb2hsv) @DOCSTRING(hsv2rgb) @DOCSTRING(rgb2gray) - -@DOCSTRING(rgb2ntsc) - -@DOCSTRING(ntsc2rgb)
--- a/scripts/image/hsv2rgb.m Tue Jan 16 21:14:22 2018 -0800 +++ b/scripts/image/hsv2rgb.m Tue Jan 16 21:23:51 2018 -0800 @@ -48,7 +48,7 @@ ## ## Output class and size will be the same as input. ## -## @seealso{rgb2hsv, ind2rgb, ntsc2rgb} +## @seealso{rgb2hsv, ind2rgb} ## @end deftypefn ## Author: Kai Habel <kai.habel@gmx.de>
--- a/scripts/image/ind2rgb.m Tue Jan 16 21:14:22 2018 -0800 +++ b/scripts/image/ind2rgb.m Tue Jan 16 21:23:51 2018 -0800 @@ -34,7 +34,7 @@ ## Multi-dimensional indexed images (of size @nospell{MxNx1xK}) are also ## supported. ## -## @seealso{rgb2ind, ind2gray, hsv2rgb, ntsc2rgb} +## @seealso{rgb2ind, ind2gray, hsv2rgb} ## @end deftypefn ## Author: Tony Richardson <arichard@stark.cc.oh.us>
--- a/scripts/image/module.mk Tue Jan 16 21:14:22 2018 -0800 +++ b/scripts/image/module.mk Tue Jan 16 21:23:51 2018 -0800 @@ -46,14 +46,12 @@ %reldir%/iscolormap.m \ %reldir%/jet.m \ %reldir%/lines.m \ - %reldir%/ntsc2rgb.m \ %reldir%/ocean.m \ %reldir%/pink.m \ %reldir%/prism.m \ %reldir%/rainbow.m \ %reldir%/rgb2hsv.m \ %reldir%/rgb2ind.m \ - %reldir%/rgb2ntsc.m \ %reldir%/rgb2gray.m \ %reldir%/rgbplot.m \ %reldir%/spinmap.m \
--- a/scripts/image/ntsc2rgb.m Tue Jan 16 21:14:22 2018 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +0,0 @@ -## Copyright (C) 1994-2017 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 3 of the License, 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, see -## <https://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {} {@var{rgb_map} =} ntsc2rgb (@var{yiq_map}) -## @deftypefnx {} {@var{rgb_img} =} ntsc2rgb (@var{yiq_img}) -## Transform a colormap or image from luminance-chrominance (NTSC) space to -## red-green-blue (RGB) color space. -## -## Implementation Note: -## The conversion matrix is chosen to be the inverse of the matrix used for -## rgb2ntsc such that -## -## @example -## x == ntsc2rgb (rgb2ntsc (x)) -## @end example -## -## @sc{matlab} uses a slightly different matrix where rounding means the -## equality above does not hold. -## @seealso{rgb2ntsc, hsv2rgb, ind2rgb} -## @end deftypefn - -## Author: Tony Richardson <arichard@stark.cc.oh.us> -## Created: July 1994 -## Adapted-By: jwe - -function rgb = ntsc2rgb (yiq) - - if (nargin != 1) - print_usage (); - endif - - ## Unlike other colorspace conversion functions, we do not accept - ## integers as valid input. We check this before - ## colorspace_conversion_input_check() which is general and would - ## convert integers to double assuming a [0 1] interval range. - ## The reason for not supporting integers here is that there's no - ## common such conversion. If we were to support a conversion - ## the most reasonable definition would be to convert the YIQ - ## from their integer range into the ranges: - ## Y = [ 0 1.106] - ## I = [-0.797 0.587] - ## Q = [-0.322 0.426] - ## See https://savannah.gnu.org/patch/?8709#comment11 - if (! isfloat (yiq)) - error ("ntsc2rgb: YIQ must be of floating point class"); - endif - [yiq, sz, is_im, is_nd] ... - = colorspace_conversion_input_check ("ntsc2rgb", "YIQ", yiq); - - ## Conversion matrix constructed from 'inv (rgb2ntsc matrix)'. - ## See programming notes in rgb2ntsc.m. Note: Matlab matrix for inverse - ## is slightly different. We prefer this matrix so that - ## x == ntsc2rgb (rgb2ntsc (x)) rather than maintaining strict compatibility - ## with Matlab. - trans = [ 1.0, 1.0, 1.0; - 0.95617, -0.27269, -1.10374; - 0.62143, -0.64681, 1.70062 ]; - rgb = yiq * trans; - ## Note that if the input is of class single, we also return an image - ## of class single. This is Matlab incompatible by design, since - ## Matlab always returning class double, is a Matlab bug (see patch #8709) - - ## truncating / scaling of double rgb values for Matlab compatibility - rgb = max (0, rgb); - idx = any (rgb > 1, 2); - rgb(idx,:) = rgb(idx,:) ./ max (rgb(idx,:), [], 2); - - rgb = colorspace_conversion_revert (rgb, sz, is_im, is_nd); - -endfunction - - -%!shared trans -%! trans = [ 1.0, 1.0, 1.0; -%! 0.95617, -0.27269, -1.10374; -%! 0.62143, -0.64681, 1.70062 ]; - -## Test pure R, G, B colors -%!assert (ntsc2rgb ([.299 .596 .211]), [1 0 0], 1e-5) -%!assert (ntsc2rgb ([.587 -.274 -.523]), [0 1 0], 1e-5) -%!assert (ntsc2rgb ([.114 -.322 .312]), [0 0 1], 1e-5) - -%!test -%! rgb_map = rand (64, 3); -%! assert (ntsc2rgb (rgb2ntsc (rgb_map)), rgb_map, 1e-3); - -%!test -%! rgb_img = rand (64, 64, 3); -%! assert (ntsc2rgb (rgb2ntsc (rgb_img)), rgb_img, 1e-3); - -## test cropping of rgb output -%!assert (ntsc2rgb ([1.5 0 0]), [1 1 1]) - -## Test scaling of output. After conversion, cut of negative values -## and scaling of all the others relative to the maximum above 1. -%!test -%! ntsc = [0.4229 0.0336 0.7184]; -%! rgb = ntsc * trans; # [0.9014 -0.0509 1.6075] -%! rgb(1) /= rgb(3); # scaled based on the maximum -%! rgb(2) = 0; # cut to 0 -%! rgb(3) = 1; # cut to 1 -%! assert (ntsc2rgb (ntsc), rgb); - -## test scaling when conversion has more than one value above 1 -## (check that it does pick the maximum) -%!test -%! ntsc = [0.8229 0.3336 0.7184]; -%! rgb = ntsc * trans; # [1.58831 0.26726 1.67642] -%! rgb /= rgb(3); -%! assert (ntsc2rgb (ntsc), rgb); - -## check scaling for more than 1 row -%!test -%! ntsc = [0.4229 0.0336 0.7184 -%! 0.8229 0.3336 0.7184]; -%! rgb = ntsc * trans; # [0.9014 -0.0509 1.6075; 1.58831 0.26726 1.67642] -%! rgb(1,1) /= rgb(1,3); -%! rgb(1,2) = 0; -%! rgb(1,3) = 1; -%! rgb(2,:) /= rgb(2,3); -%! assert (ntsc2rgb (ntsc), rgb); - -## Test input validation -%!error ntsc2rgb () -%!error ntsc2rgb (1,2) -%!error <YIQ must be of floating point class> ntsc2rgb (uint8 (1)) -%!error <YIQ must be a colormap or YIQ image> ntsc2rgb (ones (2,2)) -%!error <YIQ must be of floating point class> ntsc2rgb (ones ([10 10 3], "uint8")) -%!error <YIQ must be of floating point class> ntsc2rgb (ones ([10 10 3], "uint16")) -%!error <YIQ must be of floating point class> ntsc2rgb (ones ([10 10 3], "int16")) - -## Test ND input -%!test -%! yiq = rand (16, 16, 3, 5); -%! rgb = zeros (size (yiq)); -%! for i = 1:5 -%! rgb(:,:,:,i) = ntsc2rgb (yiq(:,:,:,i)); -%! endfor -%! assert (ntsc2rgb (yiq), rgb); - -## Test output class and size for input images. -## Most of the tests only test for colormap input. - -%!test -%! rgb = ntsc2rgb (rand (10, 10, 3)); -%! assert (class (rgb), "double"); -%! assert (size (rgb), [10 10 3]); - -%!test -%! rgb = ntsc2rgb (rand (10, 10, 3, "single")); -%! assert (class (rgb), "single"); -%! assert (size (rgb), [10 10 3]); - -%!test -%! ntsc = (rand (10, 10, 3) * 3 ) - 0.5; # values outside range [0 1] -%! rgb = ntsc2rgb (ntsc); -%! assert (class (rgb), "double"); -%! assert (size (rgb), [10 10 3]); - -%!test -%! ntsc = (rand (10, 10, 3, "single") * 3 ) - 0.5; # values outside range [0 1] -%! rgb = ntsc2rgb (ntsc); -%! assert (class (rgb), "single"); -%! assert (size (rgb), [10 10 3]); - -%!test -%! ntsc_double = reshape ([.299 .587 .114 0 .596 -.274 -.322 0 .211 -.523 .312 0], -%! [2 2 3]); -%! expected = reshape ([1 0 0 0 0 1 0 0 0 0 1 0], [2 2 3]); -%! -%! assert (ntsc2rgb (ntsc_double), expected, 1e-5); -%! assert (ntsc2rgb (single (ntsc_double)), single (expected), 1e-5);
--- a/scripts/image/rgb2ntsc.m Tue Jan 16 21:14:22 2018 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -## Copyright (C) 1994-2017 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 3 of the License, 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, see -## <https://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {} {@var{yiq_map} =} rgb2ntsc (@var{rgb_map}) -## @deftypefnx {} {@var{yiq_img} =} rgb2ntsc (@var{rgb_img}) -## Transform a colormap or image from red-green-blue (RGB) color space to -## luminance-chrominance (NTSC) space. The input may be of class uint8, -## uint16, single, or double. The output is of class double. -## -## Implementation Note: -## The reference matrix for the transformation is -## -## @example -## @group -## /Y\ 0.299 0.587 0.114 /R\ -## |I| = 0.596 -0.274 -0.322 |G| -## \Q/ 0.211 -0.523 0.312 \B/ -## @end group -## @end example -## -## @noindent -## as documented in @url{http://en.wikipedia.org/wiki/YIQ} and truncated to 3 -## significant figures. Note: The FCC version of NTSC uses only 2 significant -## digits and is slightly different. -## @seealso{ntsc2rgb, rgb2hsv, rgb2ind} -## @end deftypefn - -## Author: Tony Richardson <arichard@stark.cc.oh.us> -## Created: July 1994 -## Adapted-By: jwe - -function yiq = rgb2ntsc (rgb) - - if (nargin != 1) - print_usage (); - endif - - [rgb, sz, is_im, is_nd] ... - = colorspace_conversion_input_check ("rgb2ntsc", "RGB", rgb); - - ## Reference matrix for transformation from http://en.wikipedia.org/wiki/YIQ - ## and truncated to 3 significant figures. Matlab uses this matrix for their - ## conversion. - trans = [ 0.299, 0.596, 0.211; - 0.587, -0.274, -0.523; - 0.114, -0.322, 0.312 ]; - yiq = rgb * trans; - ## Note that if the input is of class single, we also return an image - ## of class single. This is Matlab incompatible by design, since - ## Matlab always returning class double, is a Matlab bug (see patch #8709) - - yiq = colorspace_conversion_revert (yiq, sz, is_im, is_nd); - -endfunction - - -## Test pure RED, GREEN, BLUE colors -%!assert (rgb2ntsc ([1 0 0]), [.299 .596 .211]) -%!assert (rgb2ntsc ([0 1 0]), [.587 -.274 -.523]) -%!assert (rgb2ntsc ([0 0 1]), [.114 -.322 .312]) - -%!test -%! rgb_map = rand (64, 3); -%! assert (ntsc2rgb (rgb2ntsc (rgb_map)), rgb_map, 1e-3); - -%!test -%! rgb_img = rand (64, 64, 3); -%! assert (ntsc2rgb (rgb2ntsc (rgb_img)), rgb_img, 1e-3); - -## test tolerance input checking on floats -%! assert (rgb2ntsc ([1.5 1 1]), [1.149 0.298 0.105], 1e-3); - -## Test input validation -%!error rgb2ntsc () -%!error rgb2ntsc (1,2) -%!error <invalid data type 'cell'> rgb2ntsc ({1}) -%!error <RGB must be a colormap or RGB image> rgb2ntsc (ones (2,2)) - -## Test ND input -%!test -%! rgb = rand (16, 16, 3, 5); -%! yiq = zeros (size (rgb)); -%! for i = 1:5 -%! yiq(:,:,:,i) = rgb2ntsc (rgb(:,:,:,i)); -%! endfor -%! assert (rgb2ntsc (rgb), yiq); - -## Test output class and size for input images. -## Most of the tests only test for colormap input. - -%!test -%! ntsc = rgb2ntsc (rand (10, 10, 3)); -%! assert (class (ntsc), "double"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! ntsc = rgb2ntsc (rand (10, 10, 3, "single")); -%! assert (class (ntsc), "single"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! rgb = (rand (10, 10, 3) * 3 ) - 0.5; # values outside range [0 1] -%! ntsc = rgb2ntsc (rgb); -%! assert (class (ntsc), "double"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! rgb = (rand (10, 10, 3, "single") * 3 ) - 0.5; # values outside range [0 1] -%! ntsc = rgb2ntsc (rgb); -%! assert (class (ntsc), "single"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! ntsc = rgb2ntsc (randi ([0 255], 10, 10, 3, "uint8")); -%! assert (class (ntsc), "double"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! ntsc = rgb2ntsc (randi ([0 65535], 10, 10, 3, "uint16")); -%! assert (class (ntsc), "double"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! ntsc = rgb2ntsc (randi ([-128 127], 10, 10, 3, "int8")); -%! assert (class (ntsc), "double"); -%! assert (size (ntsc), [10 10 3]); - -%!test -%! rgb_double = reshape ([1 0 0 0 0 1 0 0 0 0 1 0], [2 2 3]); -%! rgb_uint8 = reshape (uint8 ([255 0 0 0 0 255 0 0 0 0 255 0]), -%! [2 2 3]); -%! rgb_int16 = int16 (double (rgb_double * uint16 (65535)) -32768); -%! expected = reshape ([.299 .587 .114 0 .596 -.274 -.322 0 .211 -.523 .312 0], -%! [2 2 3]); -%! -%! assert (rgb2ntsc (rgb_double), expected); -%! assert (rgb2ntsc (rgb_uint8), expected); -%! assert (rgb2ntsc (single (rgb_double)), single (expected));