changeset 20664:a278de349250

Add more tests for color space conversion functions (patch #8709) * scripts/image/hsv2rgb.m, scripts/image/ntsc2rgb.m, scripts/image/rgb2hsv.m, scripts/image/rgb2ntsc.m: most existing tests only checked conversion of colormaps (because those are easier to write). Add test for actual small images (MxNx3 arrays) converted. Also add tests for the output class.
author Carnë Draug <carandraug@octave.org>
date Wed, 28 Oct 2015 19:51:02 +0000
parents a5ed88c9eb14
children 67e6343cd29a
files scripts/image/hsv2rgb.m scripts/image/ntsc2rgb.m scripts/image/rgb2hsv.m scripts/image/rgb2ntsc.m
diffstat 4 files changed, 199 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/image/hsv2rgb.m	Mon Oct 26 02:34:29 2015 +0000
+++ b/scripts/image/hsv2rgb.m	Wed Oct 28 19:51:02 2015 +0000
@@ -143,3 +143,53 @@
 %!   rgb(:,:,:,i) = hsv2rgb (hsv(:,:,:,i));
 %! endfor
 %! assert (hsv2rgb (hsv), rgb)
+
+## Test output class and size for input images.
+## Most of the tests only test for colormap input.
+
+%!test
+%! rgb = hsv2rgb (rand (10, 10, 3));
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = hsv2rgb (rand (10, 10, 3, "single"));
+%! assert (class (rgb), "single")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = (rand (10, 10, 3) * 3 ) - 0.5; # values outside range [0 1]
+%! rgb = hsv2rgb (rgb);
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = (rand (10, 10, 3, "single") * 3 ) - 0.5; # values outside range [0 1]
+%! rgb = hsv2rgb (rgb);
+%! assert (class (rgb), "single")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = hsv2rgb (randi ([0 255], 10, 10, 3, "uint8"));
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = hsv2rgb (randi ([0 65535], 10, 10, 3, "uint16"));
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = hsv2rgb (randi ([-128 127], 10, 10, 3, "uint16"));
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! hsv_double = reshape ([2/3 1/3 1 0 1 1 1 0, 1 1 1 1], [2 2 3]);
+%! hsv_uint8  = reshape (uint8 ([170 85 255 0 255 255 255 0 255 255 255 255]),
+%!                       [2 2 3]);
+%! expected = reshape ([0 0 1 1 0 1 0 1 1 0 0 1], [2 2 3]);
+%!
+%! assert (hsv2rgb (hsv_double), expected)
+%! assert (hsv2rgb (hsv_uint8), expected)
+%! assert (hsv2rgb (single (hsv_double)), single (expected), eps (single (2)))
--- a/scripts/image/ntsc2rgb.m	Mon Oct 26 02:34:29 2015 +0000
+++ b/scripts/image/ntsc2rgb.m	Wed Oct 28 19:51:02 2015 +0000
@@ -133,3 +133,51 @@
 %!   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
+%! rgb = ntsc2rgb (randi ([0 255], 10, 10, 3, "uint8"));
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = ntsc2rgb (randi ([0 65535], 10, 10, 3, "uint16"));
+%! assert (class (rgb), "double")
+%! assert (size (rgb), [10 10 3])
+
+%!test
+%! rgb = ntsc2rgb (randi ([-128 127], 10, 10, 3, "uint16"));
+%! assert (class (rgb), "double")
+%! 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/rgb2hsv.m	Mon Oct 26 02:34:29 2015 +0000
+++ b/scripts/image/rgb2hsv.m	Wed Oct 28 19:51:02 2015 +0000
@@ -121,3 +121,53 @@
 %!   hsv(:,:,:,i) = rgb2hsv (rgb(:,:,:,i));
 %! endfor
 %! assert (rgb2hsv (rgb), hsv)
+
+## Test output class and size for input images.
+## Most of the tests only test for colormap input.
+
+%!test
+%! hsv = rgb2hsv (rand (10, 10, 3));
+%! assert (class (hsv), "double")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! hsv = rgb2hsv (rand (10, 10, 3, "single"));
+%! assert (class (hsv), "single")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! rgb = (rand (10, 10, 3) * 3 ) - 0.5; # values outside range [0 1]
+%! hsv = rgb2hsv (rgb);
+%! assert (class (hsv), "double")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! rgb = (rand (10, 10, 3, "single") * 3 ) - 0.5; # values outside range [0 1]
+%! hsv = rgb2hsv (rgb);
+%! assert (class (hsv), "single")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! hsv = rgb2hsv (randi ([0 255], 10, 10, 3, "uint8"));
+%! assert (class (hsv), "double")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! hsv = rgb2hsv (randi ([0 65535], 10, 10, 3, "uint16"));
+%! assert (class (hsv), "double")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! hsv = rgb2hsv (randi ([-128 127], 10, 10, 3, "uint16"));
+%! assert (class (hsv), "double")
+%! assert (size (hsv), [10 10 3])
+
+%!test
+%! rgb_double = reshape ([1 0 1 .5 1 1 0 .5 0 1 1 .5], [2 2 3]);
+%! rgb_uint8  = reshape (uint8 ([255 0 255 128 255 255 0 128 0 255 255 128]),
+%!                       [2 2 3]);
+%! expected = reshape ([1/6 1/2 5/6 0 1 1 1 0 1 1 1 .5], [2 2 3]);
+%!
+%! assert (rgb2hsv (rgb_double), expected)
+%! assert (rgb2hsv (rgb_uint8), expected, 0.005)
+%! assert (rgb2hsv (single (rgb_double)), single (expected))
--- a/scripts/image/rgb2ntsc.m	Mon Oct 26 02:34:29 2015 +0000
+++ b/scripts/image/rgb2ntsc.m	Wed Oct 28 19:51:02 2015 +0000
@@ -99,3 +99,54 @@
 %!   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, "uint16"));
+%! 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]);
+%! 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))