From b445bc64a496075305b7726cb71fcbeca53981fd Mon Sep 17 00:00:00 2001 From: "Vlad (Kuzmin) Erium" Date: Sat, 26 Aug 2023 10:35:18 +0900 Subject: [PATCH] feat(IBA): IBA::normalize() - Normalize 3D vectors (i.e., divide by their length) textures. (#3945) Normalize 3D vectors (i.e., divide by their length) textures. inCenter and outCenter define 0.0 coordinate in input and output 3D vectors encodings (e.g. 0.0f for [-1,1] or 0.5f for [0,1] encoding). scale defines the scale factor to apply to the normalized vectors (i.e. 1.0f for a full range normalization, 0.5f for 0.0-1.0 range encoding). Default values are for [-1,1] encoding and full range normalization. Functions required 3 or 4 channels. If destination have no alpha channel, but source have, alpha channel will be dropped. ## Tests ``` int main(int argc, const char* argv[]) { ImageBuf input(argv[1]); ImageBuf output; bool ok = ImageBufAlgo::normalize(output, input, 0.0f, 0.0f, 1.0f); if (ok) { ok = output.write(argv[2]); } else { std::cerr << "Could not normalize image: " << argv[1] << std::endl; return -1; } return 0; } ``` --------- Signed-off-by: ssh4net Signed-off-by: Anton Dukhovnikov Signed-off-by: Vlad Erium Signed-off-by: Larry Gritz Co-authored-by: Anton Dukhovnikov <131838425+antond-weta@users.noreply.github.com> Co-authored-by: Larry Gritz --- src/include/OpenImageIO/imagebufalgo.h | 28 ++++++++ src/libOpenImageIO/imagebufalgo_pixelmath.cpp | 65 ++++++++++++++++++ src/oiiotool/oiiotool.cpp | 16 ++++- src/python/py_imagebufalgo.cpp | 29 ++++++++ testsuite/common/vectorschart_raw.tif | Bin 0 -> 37280 bytes testsuite/common/vectorschart_raw_xyza.exr | Bin 0 -> 24143 bytes .../ref/normalize_flfl.exr | Bin 0 -> 31894 bytes .../ref/normalize_flui.tif | Bin 0 -> 10027 bytes .../ref/normalize_flui_na.tif | Bin 0 -> 10027 bytes .../ref/normalize_uifl.exr | Bin 0 -> 10895 bytes .../ref/normalize_uiui.tif | Bin 0 -> 22614 bytes .../out-freetype2.4.11-py2.7-pybind2.3.txt | 10 +++ .../ref/out-freetype2.4.11.txt | 10 +++ .../ref/out-python2-alt.txt | 10 +++ .../ref/out-python3-freetype2.4.11.txt | 10 +++ .../python-imagebufalgo/ref/out-python3.txt | 10 +++ testsuite/python-imagebufalgo/ref/out.txt | 10 +++ testsuite/python-imagebufalgo/run.py | 3 + .../src/test_imagebufalgo.py | 17 +++++ 19 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 testsuite/common/vectorschart_raw.tif create mode 100644 testsuite/common/vectorschart_raw_xyza.exr create mode 100644 testsuite/python-imagebufalgo/ref/normalize_flfl.exr create mode 100644 testsuite/python-imagebufalgo/ref/normalize_flui.tif create mode 100644 testsuite/python-imagebufalgo/ref/normalize_flui_na.tif create mode 100644 testsuite/python-imagebufalgo/ref/normalize_uifl.exr create mode 100644 testsuite/python-imagebufalgo/ref/normalize_uiui.tif diff --git a/src/include/OpenImageIO/imagebufalgo.h b/src/include/OpenImageIO/imagebufalgo.h index ceb393b243..8805d74426 100644 --- a/src/include/OpenImageIO/imagebufalgo.h +++ b/src/include/OpenImageIO/imagebufalgo.h @@ -1028,6 +1028,34 @@ ImageBuf OIIO_API pow (const ImageBuf &A, cspan B, bool OIIO_API pow (ImageBuf &dst, const ImageBuf &A, cspan B, ROI roi={}, int nthreads=0); +/// Normalize a 3D vector texture (i.e., divide each pixel by its length). +/// This function assumes a 3-channel image that represents a 3-vector, or a +/// 4-channel image that represents a 3-vector plus an alpha value. If an +/// alpha channel is present, its value is merely copied, and is not part of +/// the normalization computation. If the destination has no alpha channel but +/// the sources do, the alpha channel will be dropped. +/// +/// `inCenter` and `outCenter` define the pixel value that corresponds to a +/// 0.0 vector value for input and output, respectively. `scale` defines the +/// scale factor to apply to the normalized vectors. +/// +/// Thus, if the input image encodes vector components into [0,1] range pixel +/// values so that a pixel value 0.5 indicates a 0-length vector, then you +/// should use `inCenter=0.5`, whereas if they are already using the full +/// range (0.0 is encoded as 0.0), then you want `inCenter=0.0`. Similarly, if +/// you want the output normalized vectors to be in the range [0,1], use +/// `outCenter=0.5` and `scale=0.5`, but if you want them to be in the range +/// [-1,1], use `outCenter=0.0` and `scale=1.0` (this probably will only work +/// if you intend to write the results in `float` or `half` format). +/// +bool OIIO_API normalize(ImageBuf& dst, const ImageBuf& A, float inCenter=0.0f, + float outCenter=0.0f, float scale=1.0f, + ROI roi={}, int nthreads=0); + +ImageBuf OIIO_API normalize(const ImageBuf& A, float inCenter=0.0f, + float outCenter=0.0, float scale=1.0f, + ROI roi={}, int nthreads=0); + /// Converts a multi-channel image into a one-channel image via a weighted /// sum of channels: diff --git a/src/libOpenImageIO/imagebufalgo_pixelmath.cpp b/src/libOpenImageIO/imagebufalgo_pixelmath.cpp index 6650a32a18..96c1f18b01 100644 --- a/src/libOpenImageIO/imagebufalgo_pixelmath.cpp +++ b/src/libOpenImageIO/imagebufalgo_pixelmath.cpp @@ -433,6 +433,71 @@ ImageBufAlgo::pow(const ImageBuf& A, cspan b, ROI roi, int nthreads) return result; } +template +static bool +normalize_impl(ImageBuf& R, const ImageBuf& A, float inCenter, float outCenter, + float scale, ROI roi, int nthreads) +{ + ImageBufAlgo::parallel_image(roi, nthreads, [&](ROI roi) { + ImageBuf::ConstIterator a(A, roi); + for (ImageBuf::Iterator r(R, roi); !r.done(); ++r, ++a) { + float x = a[0] - inCenter; + float y = a[1] - inCenter; + float z = a[2] - inCenter; + + float length = std::sqrt(x * x + y * y + z * z); + + float s = (length > 0.0f) ? scale / length : 0.0f; + + r[0] = x * s + outCenter; + r[1] = y * s + outCenter; + r[2] = z * s + outCenter; + + if (R.spec().nchannels == 4) { + r[3] = a[3]; + } + } + }); + return true; +} + +bool +ImageBufAlgo::normalize(ImageBuf& dst, const ImageBuf& src, float inCenter, + float outCenter, float scale, ROI roi, int nthreads) +{ + if (!ImageBufAlgo::IBAprep(roi, &dst, &src)) + return false; + + if (src.spec().nchannels != 3 && src.spec().nchannels != 4) { + src.errorfmt("normalize can only handle 3- or 4-channel images"); + return false; + } + if (src.spec().nchannels < dst.spec().nchannels) { + dst.errorfmt( + "destination buffer can`t have more channels than the source"); + return false; + } + + bool ok; + OIIO_DISPATCH_COMMON_TYPES(ok, "normalize", normalize_impl, + dst.spec().format, dst, src, inCenter, outCenter, + scale, roi, nthreads); + + return ok; +} + +ImageBuf +ImageBufAlgo::normalize(const ImageBuf& A, float inCenter, float outCenter, + float scale, ROI roi, int nthreads) +{ + ImageBuf result; + bool ok = ImageBufAlgo::normalize(result, A, inCenter, outCenter, scale, + roi, nthreads); + if (!ok && !result.has_error()) + result.errorfmt("normalize error"); + return result; +} + template diff --git a/src/oiiotool/oiiotool.cpp b/src/oiiotool/oiiotool.cpp index d0004d0c4b..562c086796 100644 --- a/src/oiiotool/oiiotool.cpp +++ b/src/oiiotool/oiiotool.cpp @@ -4655,8 +4655,6 @@ OIIOTOOL_OP(unsharp, 1, [&](OiiotoolOp& op, span img) { threshold); }); - - UNARY_IMAGE_OP(laplacian, ImageBufAlgo::laplacian); // --laplacian UNARY_IMAGE_OP(fft, ImageBufAlgo::fft); // --fft UNARY_IMAGE_OP(ifft, ImageBufAlgo::ifft); // --ifft @@ -4665,6 +4663,17 @@ UNARY_IMAGE_OP(unpolar, ImageBufAlgo::polar_to_complex); // --unpolar +// --normalize +OIIOTOOL_OP(normalize, 1, [&](OiiotoolOp& op, span img) { + float inCenter = op.options().get_float("incenter", 0.0f); + float outCenter = op.options().get_float("outcenter", 0.0f); + float scale = op.options().get_float("scale", 1.0f); + return ImageBufAlgo::normalize(*img[0], *img[1], inCenter, outCenter, + scale); +}); + + + // --fixnan void action_fixnan(Oiiotool& ot, cspan argv) @@ -6864,6 +6873,9 @@ Oiiotool::getargs(int argc, char* argv[]) ap.arg("--laplacian") .help("Laplacian filter the image") .OTACTION(action_laplacian); + ap.arg("--normalize") + .help("Normalize the image (options: incenter=0.5, outcenter=0.5, scale=0.5)") + .OTACTION(action_normalize); ap.arg("--fft") .help("Take the FFT of the image") .OTACTION(action_fft); diff --git a/src/python/py_imagebufalgo.cpp b/src/python/py_imagebufalgo.cpp index 6ae4b58fa1..f8c9db0abf 100644 --- a/src/python/py_imagebufalgo.cpp +++ b/src/python/py_imagebufalgo.cpp @@ -1699,6 +1699,28 @@ IBA_complex_to_polar_ret(const ImageBuf& src, ROI roi, int nthreads) +bool +IBA_normalize(ImageBuf& dst, const ImageBuf& src, float inCenter, + float outCenter, float scale, ROI roi, int nthreads) +{ + py::gil_scoped_release gil; + return ImageBufAlgo::normalize(dst, src, inCenter, outCenter, scale, roi, + nthreads); +} + + + +ImageBuf +IBA_normalize_ret(const ImageBuf& src, float inCenter, float outCenter, + float scale, ROI roi, int nthreads) +{ + py::gil_scoped_release gil; + return ImageBufAlgo::normalize(src, inCenter, outCenter, scale, roi, + nthreads); +} + + + bool IBA_fillholes_pushpull(ImageBuf& dst, const ImageBuf& src, ROI roi, int nthreads) @@ -2959,6 +2981,13 @@ declare_imagebufalgo(py::module& m) "mode"_a = ImageBufAlgo::NONFINITE_BOX3, "roi"_a = ROI::All(), "nthreads"_a = 0) + .def_static("normalize", &IBA_normalize, "dst"_a, "src"_a, + "inCenter"_a = 0.0f, "outCenter"_a = 0.0f, "scale"_a = 1.0f, + "roi"_a = ROI::All(), "nthreads"_a = 0) + .def_static("normalize", &IBA_normalize_ret, "src"_a, + "inCenter"_a = 0.0f, "outCenter"_a = 0.0f, "scale"_a = 1.0f, + "roi"_a = ROI::All(), "nthreads"_a = 0) + .def_static("fillholes_pushpull", &IBA_fillholes_pushpull, "dst"_a, "src"_a, "roi"_a = ROI::All(), "nthreads"_a = 0) .def_static("fillholes_pushpull", &IBA_fillholes_pushpull_ret, "src"_a, diff --git a/testsuite/common/vectorschart_raw.tif b/testsuite/common/vectorschart_raw.tif new file mode 100644 index 0000000000000000000000000000000000000000..59713d04f641e2e6093242a8b561f8816b0e747a GIT binary patch literal 37280 zcmeFZc|4Te|35wqNisuO5)~qCvSk}HV{C;Q#$Lt}W-QspzKfe;ri`(Ngb;VhQc8%F z6iTFQSxXYa*q5<f><;C{+$2q^`a zlp+YO>`Sn+am0HHTI1~;ToA$&6_14l9dHO?6Irw*nxKZachK~A#~b+T7~1$d+9=|L zm66-vzA#^Bf-~OJO3>HY$;AWaix9S=mktAHI$J_ma9zdI5h467tTSkgpqi^YUQqFv zl(>zgq?Dk%;xQ`)+;MqXnWKXA&?F>fB&21;fdFOYU^4Q8-!Eb0Hh_Y=<7{F2>Lm$`CH~0> zXR~2L@N#!r4-ID{fp@|?<6S&G06VFFv;#0jqc=?du{dYvf3)=Q)bIvs@EwtVwDd6a zBj6?U@gA;T?lyQ0Zy=KW{}jB3r#}8CxSMbVsQ;rQ!jFdd&v9*t|1FH34z~X$5W3{w zn&EvN{*4)3^380$O?`XRZ~%3fnmgXg)79P3)zu04FWpGynDozX1ef@`{?AtP(-mIb z$`g+STD7#eq_nuSw4sz7Oj;f$BYi|t5hf}5i<57ffAfI`x)9FF)9Qy8dan?dmNNX& zZGZLh7u~=6am6{<`fbX~Pt9L^;A~*FuI|oOo=690D?7Xd9e23IPwp?O>undN<>KLK zQoUQ%4a`nbHfg1oh?xIA87MiysnYa=IbvyKNE z{j2%ExK?+y@uGJh!1cGG2Ip!6xZh|-FiD)1w5>G`FK(l#XeDl~a2zjgeOv}Ft|+Z& zV4(me}!OGnOPw&wP z;U8UkV~pDv!ss^ZBLmFJhCbLKZRpJ$kAqA6h5IwC4a@Il4*&W%HwVEt|G$|3`!am& z@h<-WsJ5%n9szo`E|tQHRM?(pAfkH18@fr#M$f2;RD?rfWzzkYYNpL56h$oba^ z?8m(OuM-}9%>>N+>fc)733@l754`{N{02->z{(T$%N+A##j)Ap@o(mT>2u$`18a;Q zi;n-^8sJ-SznK4%ch~>vO5j$%H2BZulbWlOt2^2iheradq<>=n z;*&mV!GHx0FxgtIFD#_s>ubZm@cyoUhQ3g7@>eSUY2@PIiIo0c+TYl}SkYe+VC!HQ0B^>4q@1j*j4WK@@9e)@U>tn$PG{5|fF-I2 zeW@iS2UKj`=4c7(~n<0L~wHcH)bbiCN0mWvB-*9aPr460m zaBV=b8R9own?Y$q=Qms%P;7?y4cBH++R*t8*9H`uA%4TP8I(43e#5l^#b$`#aBT*q z4V~X`Z9uUZ;x}BIL1{zhH(VP~Y=-y^*Je=K(D@D51{9kie#5mHls0sJ!?gj$W{BT# zZ3d+co!@Y6K(QI(H(Z-RX+!5XTpLhqhWHKFW>DJD`3=_w6q_M_!?hWdHgtZ&wE@Lu zh~IE+2Bi(1-*9a}u^HkwT$@2@L+3YK8&GV9_zl-)P}

4c7(~n<0L~wHcH)bbiCN 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 literal 0 HcmV?d00001 diff --git a/testsuite/common/vectorschart_raw_xyza.exr b/testsuite/common/vectorschart_raw_xyza.exr new file mode 100644 index 0000000000000000000000000000000000000000..210d19bc162ff2fa3e87a461967f1d646a7613e8 GIT binary patch literal 24143 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 nv;SG(^FjOnF7ToA#@TYofGLYE{7r+ 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 literal 0 HcmV?d00001 diff --git a/testsuite/python-imagebufalgo/ref/normalize_flui_na.tif b/testsuite/python-imagebufalgo/ref/normalize_flui_na.tif new file mode 100644 index 0000000000000000000000000000000000000000..c646fb5b225f816d8736b3b27c7189ca3fbfb3d2 GIT binary patch literal 10027 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 literal 0 HcmV?d00001 diff --git a/testsuite/python-imagebufalgo/ref/normalize_uifl.exr b/testsuite/python-imagebufalgo/ref/normalize_uifl.exr new file mode 100644 index 0000000000000000000000000000000000000000..113c7ad2eb6fa3d7ee9eb3890d664767ef198c12 GIT binary patch literal 10895 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�Xxcl#eg2^9fXF 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 IPszCd0$!Xl00000 literal 0 HcmV?d00001 diff --git a/testsuite/python-imagebufalgo/ref/out-freetype2.4.11-py2.7-pybind2.3.txt b/testsuite/python-imagebufalgo/ref/out-freetype2.4.11-py2.7-pybind2.3.txt index 35d0317238..5629f32cda 100644 --- a/testsuite/python-imagebufalgo/ref/out-freetype2.4.11-py2.7-pybind2.3.txt +++ b/testsuite/python-imagebufalgo/ref/out-freetype2.4.11-py2.7-pybind2.3.txt @@ -172,6 +172,16 @@ Comparing "resample.tif" and "../../../testsuite/oiiotool-xform/ref/resample.tif PASS Comparing "fit.tif" and "../../../testsuite/oiiotool-xform/ref/fit.tif" PASS +Comparing "normalize_uiui.tif" and "ref/normalize_uiui.tif" +PASS +Comparing "normalize_uifl.exr" and "ref/normalize_uifl.exr" +PASS +Comparing "normalize_flfl.exr" and "ref/normalize_flfl.exr" +PASS +Comparing "normalize_flui.tif" and "ref/normalize_flui.tif" +PASS +Comparing "normalize_flui_na.tif" and "ref/normalize_flui_na.tif" +PASS Comparing "bsplinekernel.exr" and "../../../testsuite/oiiotool/ref/bsplinekernel.exr" PASS Comparing "bspline-blur.tif" and "../../../testsuite/oiiotool/ref/bspline-blur.tif" diff --git a/testsuite/python-imagebufalgo/ref/out-freetype2.4.11.txt b/testsuite/python-imagebufalgo/ref/out-freetype2.4.11.txt index e8f06cb7b3..13e9d9f792 100644 --- a/testsuite/python-imagebufalgo/ref/out-freetype2.4.11.txt +++ b/testsuite/python-imagebufalgo/ref/out-freetype2.4.11.txt @@ -172,6 +172,16 @@ Comparing "resample.tif" and "../../../testsuite/oiiotool-xform/ref/resample.tif PASS Comparing "fit.tif" and "../../../testsuite/oiiotool-xform/ref/fit.tif" PASS +Comparing "normalize_uiui.tif" and "ref/normalize_uiui.tif" +PASS +Comparing "normalize_uifl.exr" and "ref/normalize_uifl.exr" +PASS +Comparing "normalize_flfl.exr" and "ref/normalize_flfl.exr" +PASS +Comparing "normalize_flui.tif" and "ref/normalize_flui.tif" +PASS +Comparing "normalize_flui_na.tif" and "ref/normalize_flui_na.tif" +PASS Comparing "bsplinekernel.exr" and "../../../testsuite/oiiotool/ref/bsplinekernel.exr" PASS Comparing "bspline-blur.tif" and "../../../testsuite/oiiotool/ref/bspline-blur.tif" diff --git a/testsuite/python-imagebufalgo/ref/out-python2-alt.txt b/testsuite/python-imagebufalgo/ref/out-python2-alt.txt index d3dfb36240..2e20341393 100644 --- a/testsuite/python-imagebufalgo/ref/out-python2-alt.txt +++ b/testsuite/python-imagebufalgo/ref/out-python2-alt.txt @@ -172,6 +172,16 @@ Comparing "resample.tif" and "../../../testsuite/oiiotool-xform/ref/resample.tif PASS Comparing "fit.tif" and "../../../testsuite/oiiotool-xform/ref/fit.tif" PASS +Comparing "normalize_uiui.tif" and "ref/normalize_uiui.tif" +PASS +Comparing "normalize_uifl.exr" and "ref/normalize_uifl.exr" +PASS +Comparing "normalize_flfl.exr" and "ref/normalize_flfl.exr" +PASS +Comparing "normalize_flui.tif" and "ref/normalize_flui.tif" +PASS +Comparing "normalize_flui_na.tif" and "ref/normalize_flui_na.tif" +PASS Comparing "bsplinekernel.exr" and "../../../testsuite/oiiotool/ref/bsplinekernel.exr" PASS Comparing "bspline-blur.tif" and "../../../testsuite/oiiotool/ref/bspline-blur.tif" diff --git a/testsuite/python-imagebufalgo/ref/out-python3-freetype2.4.11.txt b/testsuite/python-imagebufalgo/ref/out-python3-freetype2.4.11.txt index d0e252a2c9..d857d072ec 100644 --- a/testsuite/python-imagebufalgo/ref/out-python3-freetype2.4.11.txt +++ b/testsuite/python-imagebufalgo/ref/out-python3-freetype2.4.11.txt @@ -172,6 +172,16 @@ Comparing "resample.tif" and "../../../testsuite/oiiotool-xform/ref/resample.tif PASS Comparing "fit.tif" and "../../../testsuite/oiiotool-xform/ref/fit.tif" PASS +Comparing "normalize_uiui.tif" and "ref/normalize_uiui.tif" +PASS +Comparing "normalize_uifl.exr" and "ref/normalize_uifl.exr" +PASS +Comparing "normalize_flfl.exr" and "ref/normalize_flfl.exr" +PASS +Comparing "normalize_flui.tif" and "ref/normalize_flui.tif" +PASS +Comparing "normalize_flui_na.tif" and "ref/normalize_flui_na.tif" +PASS Comparing "bsplinekernel.exr" and "../../../testsuite/oiiotool/ref/bsplinekernel.exr" PASS Comparing "bspline-blur.tif" and "../../../testsuite/oiiotool/ref/bspline-blur.tif" diff --git a/testsuite/python-imagebufalgo/ref/out-python3.txt b/testsuite/python-imagebufalgo/ref/out-python3.txt index cf16cb3c70..4c96630ed9 100644 --- a/testsuite/python-imagebufalgo/ref/out-python3.txt +++ b/testsuite/python-imagebufalgo/ref/out-python3.txt @@ -172,6 +172,16 @@ Comparing "resample.tif" and "../../../testsuite/oiiotool-xform/ref/resample.tif PASS Comparing "fit.tif" and "../../../testsuite/oiiotool-xform/ref/fit.tif" PASS +Comparing "normalize_uiui.tif" and "ref/normalize_uiui.tif" +PASS +Comparing "normalize_uifl.exr" and "ref/normalize_uifl.exr" +PASS +Comparing "normalize_flfl.exr" and "ref/normalize_flfl.exr" +PASS +Comparing "normalize_flui.tif" and "ref/normalize_flui.tif" +PASS +Comparing "normalize_flui_na.tif" and "ref/normalize_flui_na.tif" +PASS Comparing "bsplinekernel.exr" and "../../../testsuite/oiiotool/ref/bsplinekernel.exr" PASS Comparing "bspline-blur.tif" and "../../../testsuite/oiiotool/ref/bspline-blur.tif" diff --git a/testsuite/python-imagebufalgo/ref/out.txt b/testsuite/python-imagebufalgo/ref/out.txt index b5f5ab928a..e945cc9c32 100644 --- a/testsuite/python-imagebufalgo/ref/out.txt +++ b/testsuite/python-imagebufalgo/ref/out.txt @@ -172,6 +172,16 @@ Comparing "resample.tif" and "../../../testsuite/oiiotool-xform/ref/resample.tif PASS Comparing "fit.tif" and "../../../testsuite/oiiotool-xform/ref/fit.tif" PASS +Comparing "normalize_uiui.tif" and "ref/normalize_uiui.tif" +PASS +Comparing "normalize_uifl.exr" and "ref/normalize_uifl.exr" +PASS +Comparing "normalize_flfl.exr" and "ref/normalize_flfl.exr" +PASS +Comparing "normalize_flui.tif" and "ref/normalize_flui.tif" +PASS +Comparing "normalize_flui_na.tif" and "ref/normalize_flui_na.tif" +PASS Comparing "bsplinekernel.exr" and "../../../testsuite/oiiotool/ref/bsplinekernel.exr" PASS Comparing "bspline-blur.tif" and "../../../testsuite/oiiotool/ref/bspline-blur.tif" diff --git a/testsuite/python-imagebufalgo/run.py b/testsuite/python-imagebufalgo/run.py index 58bb0ce264..56a0fa292b 100755 --- a/testsuite/python-imagebufalgo/run.py +++ b/testsuite/python-imagebufalgo/run.py @@ -50,6 +50,9 @@ "contrast-sigmoid5.tif", "saturate-0.tif", "saturate-2.tif", "resize.tif", "resample.tif", "fit.tif", + "normalize_uiui.tif", "normalize_uifl.exr", + "normalize_flfl.exr", "normalize_flui.tif", + "normalize_flui_na.tif", "bsplinekernel.exr", "bspline-blur.tif", "tahoe-median.tif", "dilate.tif", "erode.tif", "unsharp.tif", "unsharp-median.tif", "tahoe-laplacian.tif", diff --git a/testsuite/python-imagebufalgo/src/test_imagebufalgo.py b/testsuite/python-imagebufalgo/src/test_imagebufalgo.py index cf03e6e168..5acb070458 100755 --- a/testsuite/python-imagebufalgo/src/test_imagebufalgo.py +++ b/testsuite/python-imagebufalgo/src/test_imagebufalgo.py @@ -264,6 +264,23 @@ def test_iba (func, *args, **kwargs) : b = test_iba (ImageBufAlgo.invert, a) write (b, "invert.tif", oiio.UINT8) + # normalize + a = ImageBuf (OIIO_TESTSUITE_ROOT+"/common/vectorschart_raw.tif") + b = test_iba (ImageBufAlgo.normalize, a, 0.5, 0.5, 0.5) + write (b, "normalize_uiui.tif", oiio.UINT16) + b = test_iba (ImageBufAlgo.normalize, a, 0.5, 0.0, 1.0) + write (b, "normalize_uifl.exr", oiio.HALF) + + a = ImageBuf (OIIO_TESTSUITE_ROOT+"/common/vectorschart_raw_xyza.exr") + b = test_iba (ImageBufAlgo.normalize, a, 0.0, 0.0, 1.0) + write (b, "normalize_flfl.exr", oiio.HALF) + b = test_iba (ImageBufAlgo.normalize, a, 0.0, 0.5, 0.5) + write (b, "normalize_flui.tif", oiio.UINT16) + b = ImageBuf() + b.specmod().nchannels = 3 + b = test_iba (ImageBufAlgo.normalize, a, 0.0, 0.5, 0.5) + write (b, "normalize_flui_na.tif", oiio.UINT16) + # pow b = ImageBufAlgo.pow (gray128, 2) write (b, "cpow1.exr")