From e496ab1e39573eee94225ac40f4d1b6be4e6dad4 Mon Sep 17 00:00:00 2001 From: Anton Dukhovnikov Date: Mon, 25 Nov 2024 15:21:13 +1300 Subject: [PATCH 1/6] feat(IBA) scale Signed-off-by: Anton Dukhovnikov --- src/doc/figures/scale.jpg | Bin 0 -> 101783 bytes src/doc/imagebufalgo.rst | 32 ++++++++++ src/doc/oiiotool.rst | 21 ++++++ src/doc/pythonbindings.rst | 17 +++++ src/include/OpenImageIO/imagebufalgo.h | 11 ++++ src/libOpenImageIO/imagebufalgo_muldiv.cpp | 60 ++++++++++++++++++ src/oiiotool/oiiotool.cpp | 4 ++ src/python/py_imagebufalgo.cpp | 21 ++++++ testsuite/docs-examples-cpp/ref/out-arm.txt | 1 + testsuite/docs-examples-cpp/ref/out.txt | 1 + testsuite/docs-examples-cpp/run.py | 2 + .../src/docs-examples-imagebufalgo.cpp | 14 ++++ .../docs-examples-python/ref/out-arm.txt | 1 + testsuite/docs-examples-python/ref/out.txt | 1 + testsuite/docs-examples-python/run.py | 2 + .../src/docs-examples-imagebufalgo.py | 11 ++++ testsuite/oiiotool/run.py | 5 ++ .../src/test_imagebufalgo.py | 9 +++ 18 files changed, 213 insertions(+) create mode 100644 src/doc/figures/scale.jpg diff --git a/src/doc/figures/scale.jpg b/src/doc/figures/scale.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a6d684a757a2f01be3ac81ba74d642184093314 GIT binary patch literal 101783 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 z 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 Cv(zB~ literal 0 HcmV?d00001 diff --git a/src/doc/imagebufalgo.rst b/src/doc/imagebufalgo.rst index dc355f2b8a..2ffaf311d4 100644 --- a/src/doc/imagebufalgo.rst +++ b/src/doc/imagebufalgo.rst @@ -1329,6 +1329,38 @@ Image arithmetic | +.. doxygenfunction:: scale(const ImageBuf &A, const ImageBuf &B, ROI roi = {}, int nthreads = 0) +.. + + Result-as-parameter version: + + .. doxygenfunction:: scale(ImageBuf &dst, const ImageBuf &A, const ImageBuf &B, ROI roi = {}, int nthreads = 0) + + Examples: + + .. tabs:: + + .. tab:: C++ + .. literalinclude:: ../../testsuite/docs-examples-cpp/src/docs-examples-imagebufalgo.cpp + :language: c++ + :start-after: BEGIN-imagebufalgo-scale + :end-before: END-imagebufalgo-scale + :dedent: 4 + + .. tab:: Python + .. literalinclude:: ../../testsuite/docs-examples-python/src/docs-examples-imagebufalgo.py + :language: py + :start-after: BEGIN-imagebufalgo-scale + :end-before: END-imagebufalgo-scale + :dedent: 4 + + .. code-tab:: bash oiiotool + + # Pixel-by-pixel multiplication of all channels of one image by the only channel of another image + oiiotol a.exr mono.exr --scale -o scale.exr + +| + .. doxygenfunction:: mul(Image_or_Const A, Image_or_Const B, ROI roi = {}, int nthreads = 0) .. diff --git a/src/doc/oiiotool.rst b/src/doc/oiiotool.rst index 8c30a25b52..54fe603ad9 100644 --- a/src/doc/oiiotool.rst +++ b/src/doc/oiiotool.rst @@ -2507,6 +2507,27 @@ current top image. Include/exclude subimages (see :ref:`sec-oiiotool-subimage-modifier`). +.. option:: --scale + + Replace the *two* top images with a new image that is the pixel-by-pixel + multiplicative product of those images. One of the images must have a single + channel, that channel's pixel value is used to scale all channels of the + other image by. + + + Example:: + + # Apply vertical gradient + oiiotool tahoe.jpg --pattern fill:top=0.5:bottom=1 512x384 1 --scale -o scale.jpg + .. + + .. image:: figures/tahoe-small.jpg + :width: 2.0 in + .. image:: figures/scale.jpg + :width: 2.0 in + | + + .. option:: --mul --mulc --mulc diff --git a/src/doc/pythonbindings.rst b/src/doc/pythonbindings.rst index 70924aba2b..fd73aad426 100644 --- a/src/doc/pythonbindings.rst +++ b/src/doc/pythonbindings.rst @@ -2833,6 +2833,23 @@ Image arithmetic +.. py:method:: ImageBuf ImageBufAlgo.scale (A, B, roi=ROI.All, nthreads=0) + bool ImageBufAlgo.scale (dst, A, B, roi=ROI.All, nthreads=0) + + Per-pixel multiply all channels of one image by the single channle of the + other image. One of the input images must have only one channel. + + Example: + + .. code-block:: python + + # Scale one image by the other + buf = ImageBufAlgo.scale (ImageBuf("a.exr"), ImageBuf("mono.exr")) + + # Scale one image by the other, in place + ImageBufAlgo.scale (buf, buf, ImageBuf("mono.exr")) + + .. py:method:: ImageBuf ImageBufAlgo.mul (A, B, roi=ROI.All, nthreads=0) bool ImageBufAlgo.mul (dst, A, B, roi=ROI.All, nthreads=0) diff --git a/src/include/OpenImageIO/imagebufalgo.h b/src/include/OpenImageIO/imagebufalgo.h index 99930b3271..695cd44f72 100644 --- a/src/include/OpenImageIO/imagebufalgo.h +++ b/src/include/OpenImageIO/imagebufalgo.h @@ -953,6 +953,17 @@ ImageBuf OIIO_API abs (const ImageBuf &A, ROI roi={}, int nthreads=0); bool OIIO_API abs (ImageBuf &dst, const ImageBuf &A, ROI roi={}, int nthreads=0); +/// Compute per-pixel product `A * B`, returning the result image. +/// +/// All channels of one of the images get multiplied by the value in the only channel of the other image. +/// Either `A` or `B` must be a single channel image. +ImageBuf OIIO_API scale (const ImageBuf &A, const ImageBuf &B, ROI roi={}, + int nthreads=0); +/// Write to an existing image `dst` (allocating if it is uninitialized). +bool OIIO_API scale (ImageBuf &dst, const ImageBuf &A, const ImageBuf &B, + ROI roi={}, int nthreads=0); + + /// Compute per-pixel product `A * B`, returning the result image. /// /// Either both `A` and `B` are images, or one is an image and the other is diff --git a/src/libOpenImageIO/imagebufalgo_muldiv.cpp b/src/libOpenImageIO/imagebufalgo_muldiv.cpp index 2ea526340f..1ac39df35f 100644 --- a/src/libOpenImageIO/imagebufalgo_muldiv.cpp +++ b/src/libOpenImageIO/imagebufalgo_muldiv.cpp @@ -25,6 +25,64 @@ OIIO_NAMESPACE_BEGIN +template +static bool +scale_impl(ImageBuf& R, const ImageBuf& A, const ImageBuf& B, ROI roi, + int nthreads) +{ + ImageBufAlgo::parallel_image(roi, nthreads, [&](ROI roi) { + ImageBuf::Iterator r(R, roi); + ImageBuf::ConstIterator a(A, roi); + ImageBuf::ConstIterator b(B, roi); + for (; !r.done(); ++r, ++a, ++b) + for (int c = roi.chbegin; c < roi.chend; ++c) + r[c] = a[c] * b[0]; + }); + return true; +} + + + +bool +ImageBufAlgo::scale(ImageBuf& dst, const ImageBuf& A, const ImageBuf& B, + ROI roi, int nthreads) +{ + pvt::LoggedTimer logtime("IBA::scale"); + bool ok = false; + if (B.nchannels() == 1) { + if (IBAprep(roi, &dst, &A, &B)) + OIIO_DISPATCH_COMMON_TYPES3(ok, "scale", scale_impl, + dst.spec().format, A.spec().format, + B.spec().format, dst, A, B, roi, + nthreads); + } else if (A.nchannels() == 1) { + if (IBAprep(roi, &dst, &A, &B)) + OIIO_DISPATCH_COMMON_TYPES3(ok, "scale", scale_impl, + dst.spec().format, B.spec().format, + A.spec().format, dst, B, A, roi, + nthreads); + } else { + dst.errorfmt( + "ImageBufAlgo::scale(): one of the arguments must be a single channel image."); + } + + return ok; +} + + + +ImageBuf +ImageBufAlgo::scale(const ImageBuf& A, const ImageBuf& B, ROI roi, int nthreads) +{ + ImageBuf result; + bool ok = scale(result, A, B, roi, nthreads); + if (!ok && !result.has_error()) + result.errorfmt("ImageBufAlgo::scale() error"); + return result; +} + + + template static bool mul_impl(ImageBuf& R, const ImageBuf& A, const ImageBuf& B, ROI roi, @@ -91,6 +149,8 @@ ImageBufAlgo::mul(ImageBuf& dst, Image_or_Const A_, Image_or_Const B_, ROI roi, pvt::LoggedTimer logtime("IBA::mul"); if (A_.is_img() && B_.is_img()) { const ImageBuf &A(A_.img()), &B(B_.img()); + if (A.nchannels() == 1 || B.nchannels() == 1) + return scale(dst, A, B, roi, nthreads); if (!IBAprep(roi, &dst, &A, &B, IBAprep_CLAMP_MUTUAL_NCHANNELS)) return false; bool ok; diff --git a/src/oiiotool/oiiotool.cpp b/src/oiiotool/oiiotool.cpp index 7ff84634e6..0afbe76a46 100644 --- a/src/oiiotool/oiiotool.cpp +++ b/src/oiiotool/oiiotool.cpp @@ -3090,6 +3090,7 @@ BINARY_IMAGE_OP(add, ImageBufAlgo::add); // --add BINARY_IMAGE_OP(sub, ImageBufAlgo::sub); // --sub BINARY_IMAGE_OP(mul, ImageBufAlgo::mul); // --mul BINARY_IMAGE_OP(div, ImageBufAlgo::div); // --div +BINARY_IMAGE_OP(scale, ImageBufAlgo::scale); // --scale BINARY_IMAGE_OP(absdiff, ImageBufAlgo::absdiff); // --absdiff BINARY_IMAGE_COLOR_OP(addc, ImageBufAlgo::add, 0); // --addc @@ -6644,6 +6645,9 @@ Oiiotool::getargs(int argc, char* argv[]) ap.arg("--csub %s:VAL") .hidden() // Deprecated synonym .OTACTION(action_subc); + ap.arg("--scale") + .help("Scale all channels of one image by the single channel of another image") + .OTACTION(action_scale); ap.arg("--mul") .help("Multiply two images") .OTACTION(action_mul); diff --git a/src/python/py_imagebufalgo.cpp b/src/python/py_imagebufalgo.cpp index b93f928ab0..40655d3e21 100644 --- a/src/python/py_imagebufalgo.cpp +++ b/src/python/py_imagebufalgo.cpp @@ -652,6 +652,22 @@ IBA_abs_ret(const ImageBuf& A, ROI roi = ROI::All(), int nthreads = 0) +bool +IBA_scale_images(ImageBuf& dst, const ImageBuf& A, const ImageBuf& B, + ROI roi = ROI::All(), int nthreads = 0) +{ + py::gil_scoped_release gil; + return ImageBufAlgo::scale(dst, A, B, roi, nthreads); +} + +ImageBuf +IBA_scale_images_ret(const ImageBuf& A, const ImageBuf& B, ROI roi = ROI::All(), + int nthreads = 0) +{ + py::gil_scoped_release gil; + return ImageBufAlgo::scale(A, B, roi, nthreads); +} + bool IBA_mul_color(ImageBuf& dst, const ImageBuf& A, py::object values_tuple, ROI roi = ROI::All(), int nthreads = 0) @@ -2625,6 +2641,11 @@ declare_imagebufalgo(py::module& m) .def_static("abs", &IBA_abs_ret, "A"_a, "roi"_a = ROI::All(), "nthreads"_a = 0) + .def_static("scale", &IBA_scale_images, "dst"_a, "A"_a, "B"_a, + "roi"_a = ROI::All(), "nthreads"_a = 0) + .def_static("scale", &IBA_scale_images_ret, "A"_a, "B"_a, + "roi"_a = ROI::All(), "nthreads"_a = 0) + .def_static("mul", &IBA_mul_images, "dst"_a, "A"_a, "B"_a, "roi"_a = ROI::All(), "nthreads"_a = 0) .def_static("mul", &IBA_mul_color, "dst"_a, "A"_a, "B"_a, diff --git a/testsuite/docs-examples-cpp/ref/out-arm.txt b/testsuite/docs-examples-cpp/ref/out-arm.txt index b74e8bcec3..72373f6058 100644 --- a/testsuite/docs-examples-cpp/ref/out-arm.txt +++ b/testsuite/docs-examples-cpp/ref/out-arm.txt @@ -33,6 +33,7 @@ example_add example_sub example_absdiff example_abs +example_scale example_mul example_div example_fixNonFinite diff --git a/testsuite/docs-examples-cpp/ref/out.txt b/testsuite/docs-examples-cpp/ref/out.txt index 76c7941b0e..58889fdab0 100644 --- a/testsuite/docs-examples-cpp/ref/out.txt +++ b/testsuite/docs-examples-cpp/ref/out.txt @@ -33,6 +33,7 @@ example_add example_sub example_absdiff example_abs +example_scale example_mul example_div example_fixNonFinite diff --git a/testsuite/docs-examples-cpp/run.py b/testsuite/docs-examples-cpp/run.py index 9a22369326..452b4d33c4 100755 --- a/testsuite/docs-examples-cpp/run.py +++ b/testsuite/docs-examples-cpp/run.py @@ -20,6 +20,8 @@ command += run_app("cmake -E copy " + test_source_dir + "/../common/unpremult.tif unpremult.tif") command += run_app("cmake -E copy " + test_source_dir + "/../common/bayer.png bayer.png") +command += run_app("oiiotool --pattern fill:top=0:bottom=1 256x256 1 -o mono.exr") + # Copy the grid to both a tiled and scanline version command += oiio_app("iconvert") + "../common/grid.tif --scanline scanline.tif > out.txt ;" command += oiio_app("iconvert") + "../common/grid.tif --tile 64 64 tiled.tif > out.txt ;" diff --git a/testsuite/docs-examples-cpp/src/docs-examples-imagebufalgo.cpp b/testsuite/docs-examples-cpp/src/docs-examples-imagebufalgo.cpp index 76f970ce0b..0909a5173b 100644 --- a/testsuite/docs-examples-cpp/src/docs-examples-imagebufalgo.cpp +++ b/testsuite/docs-examples-cpp/src/docs-examples-imagebufalgo.cpp @@ -557,6 +557,19 @@ void example_abs() Abs.write("abs.exr"); } +void example_scale() +{ + print("example_scale\n"); + // BEGIN-imagebufalgo-scale + // Pixel-by-pixel multiplication of all channels of A by the single channel of B + ImageBuf A("A.exr"); + ImageBuf B("mono.exr"); + ImageBuf Product = ImageBufAlgo::scale(A, B); + + // END-imagebufalgo-scale + Product.write("scale.exr"); +} + void example_mul() { print("example_mul\n"); @@ -725,6 +738,7 @@ int main(int /*argc*/, char** /*argv*/) example_sub(); example_absdiff(); example_abs(); + example_scale(); example_mul(); example_div(); diff --git a/testsuite/docs-examples-python/ref/out-arm.txt b/testsuite/docs-examples-python/ref/out-arm.txt index 9b898f1f90..cfd8a4b071 100644 --- a/testsuite/docs-examples-python/ref/out-arm.txt +++ b/testsuite/docs-examples-python/ref/out-arm.txt @@ -34,6 +34,7 @@ example_add example_sub example_absdiff example_abs +example_scale example_mul example_div example_fixNonFinite diff --git a/testsuite/docs-examples-python/ref/out.txt b/testsuite/docs-examples-python/ref/out.txt index 258489c8f1..502bbda4cd 100644 --- a/testsuite/docs-examples-python/ref/out.txt +++ b/testsuite/docs-examples-python/ref/out.txt @@ -34,6 +34,7 @@ example_add example_sub example_absdiff example_abs +example_scale example_mul example_div example_fixNonFinite diff --git a/testsuite/docs-examples-python/run.py b/testsuite/docs-examples-python/run.py index 59058657ef..147a2c8be6 100755 --- a/testsuite/docs-examples-python/run.py +++ b/testsuite/docs-examples-python/run.py @@ -20,6 +20,8 @@ command += run_app("cmake -E copy " + test_source_dir + "/../common/unpremult.tif unpremult.tif") command += run_app("cmake -E copy " + test_source_dir + "/../common/bayer.png bayer.png") +command += run_app("oiiotool --pattern fill:top=0:bottom=1 256x256 1 -o mono.exr") + # Copy the grid to both a tiled and scanline version command += oiio_app("iconvert") + "../common/grid.tif --scanline scanline.tif > out.txt ;" command += oiio_app("iconvert") + "../common/grid.tif --tile 64 64 tiled.tif > out.txt ;" diff --git a/testsuite/docs-examples-python/src/docs-examples-imagebufalgo.py b/testsuite/docs-examples-python/src/docs-examples-imagebufalgo.py index daae8b3476..7c35f7d947 100644 --- a/testsuite/docs-examples-python/src/docs-examples-imagebufalgo.py +++ b/testsuite/docs-examples-python/src/docs-examples-imagebufalgo.py @@ -485,6 +485,16 @@ def example_abs(): # END-imagebufalgo-absolute Abs.write("abs.exr", "half") +def example_scale(): + print("example_scale") + # BEGIN-imagebufalgo-scale + # Pixel-by-pixel multiplication of all channels of one image A by the single channel of the other image + A = ImageBuf("A.exr") + B = ImageBuf("mono.exr") + Product = ImageBufAlgo.scale (A, B) + #END-imagebufalgo-scale + Product.write("scale.exr", "half") + def example_mul(): print("example_mul") # BEGIN-imagebufalgo-mul @@ -626,6 +636,7 @@ def example_make_texture(): example_sub() example_absdiff() example_abs() + example_scale() example_mul() example_div() diff --git a/testsuite/oiiotool/run.py b/testsuite/oiiotool/run.py index 315406f7f0..1709064763 100755 --- a/testsuite/oiiotool/run.py +++ b/testsuite/oiiotool/run.py @@ -44,6 +44,11 @@ + " --sub -d half -o sub.exr") command += oiiotool ("--pattern constant:color=.1,.2,.3 64x64+0+0 3 " + " --subc 0.1,0.1,0.1 -d half -o subc.exr") + +# Test -- scale +command += oiiotool ("--pattern fill:topleft=0,0,1:topright=0,1,0:bottomleft=1,0,1:bottomright=1,1,0 64x64 3" + + " --pattern fill:top=0:bottom=1 64x64 1" + + " --scale -o scale.exr") # test --mul of images command += oiiotool ("grey64.exr -pattern constant:color=1.5,1,0.5 64x64 3 --mul -o mul.exr") diff --git a/testsuite/python-imagebufalgo/src/test_imagebufalgo.py b/testsuite/python-imagebufalgo/src/test_imagebufalgo.py index 5a9b67c407..74e528d46f 100755 --- a/testsuite/python-imagebufalgo/src/test_imagebufalgo.py +++ b/testsuite/python-imagebufalgo/src/test_imagebufalgo.py @@ -225,6 +225,15 @@ def test_iba (func, *args, **kwargs) : b = test_iba (ImageBufAlgo.absdiff, a, (0.2,0.2,0.2)) write (b, "absdiff.exr", oiio.HALF) a = ImageBuf() + + # scale + a = ImageBuf(ImageSpec(128, 128, 3, oiio.HALF)) + ImageBufAlgo.fill(a, topleft = (0, 0, 1), topright = (0, 1, 0), + bottomleft = (1, 0, 1), bottomright = (1, 1, 0)) + b = ImageBuf(ImageSpec(128, 128, 1, oiio.HALF)) + ImageBufAlgo.fill(a, top = 0, bottom = 1) + b = test_iba(ImageBufAlgo.scale, a, b) + a = ImageBuf() # mul b = ImageBufAlgo.mul (gray128, 1.5) From 39957b6d4d633599992e37f57522ca5a62643e67 Mon Sep 17 00:00:00 2001 From: Anton Dukhovnikov Date: Mon, 25 Nov 2024 16:09:41 +1300 Subject: [PATCH 2/6] feat(IBA) scale - fix tests Signed-off-by: Anton Dukhovnikov --- src/doc/imagebufalgo.rst | 2 +- testsuite/docs-examples-cpp/run.py | 2 +- testsuite/docs-examples-python/run.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/doc/imagebufalgo.rst b/src/doc/imagebufalgo.rst index 2ffaf311d4..c0815568f0 100644 --- a/src/doc/imagebufalgo.rst +++ b/src/doc/imagebufalgo.rst @@ -1357,7 +1357,7 @@ Image arithmetic .. code-tab:: bash oiiotool # Pixel-by-pixel multiplication of all channels of one image by the only channel of another image - oiiotol a.exr mono.exr --scale -o scale.exr + oiiotool a.exr mono.exr --scale -o scale.exr | diff --git a/testsuite/docs-examples-cpp/run.py b/testsuite/docs-examples-cpp/run.py index 452b4d33c4..ffae73e247 100755 --- a/testsuite/docs-examples-cpp/run.py +++ b/testsuite/docs-examples-cpp/run.py @@ -20,7 +20,7 @@ command += run_app("cmake -E copy " + test_source_dir + "/../common/unpremult.tif unpremult.tif") command += run_app("cmake -E copy " + test_source_dir + "/../common/bayer.png bayer.png") -command += run_app("oiiotool --pattern fill:top=0:bottom=1 256x256 1 -o mono.exr") +command += oiio_app("oiiotool") + "--pattern fill:top=0:bottom=1 256x256 1 -o mono.exr > out.txt ;" # Copy the grid to both a tiled and scanline version command += oiio_app("iconvert") + "../common/grid.tif --scanline scanline.tif > out.txt ;" diff --git a/testsuite/docs-examples-python/run.py b/testsuite/docs-examples-python/run.py index 147a2c8be6..3bab2e8957 100755 --- a/testsuite/docs-examples-python/run.py +++ b/testsuite/docs-examples-python/run.py @@ -20,7 +20,7 @@ command += run_app("cmake -E copy " + test_source_dir + "/../common/unpremult.tif unpremult.tif") command += run_app("cmake -E copy " + test_source_dir + "/../common/bayer.png bayer.png") -command += run_app("oiiotool --pattern fill:top=0:bottom=1 256x256 1 -o mono.exr") +command += oiio_app("oiiotool") + "--pattern fill:top=0:bottom=1 256x256 1 -o mono.exr > out.txt ;" # Copy the grid to both a tiled and scanline version command += oiio_app("iconvert") + "../common/grid.tif --scanline scanline.tif > out.txt ;" From a07bddf420bf4e400142e898416d12ae1541fc8f Mon Sep 17 00:00:00 2001 From: Anton Dukhovnikov Date: Fri, 29 Nov 2024 09:52:40 +1300 Subject: [PATCH 3/6] feat(IBA) scale - add KWArgs parameter Signed-off-by: Anton Dukhovnikov --- src/include/OpenImageIO/imagebufalgo.h | 6 +++--- src/libOpenImageIO/imagebufalgo_muldiv.cpp | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/include/OpenImageIO/imagebufalgo.h b/src/include/OpenImageIO/imagebufalgo.h index 695cd44f72..007f630939 100644 --- a/src/include/OpenImageIO/imagebufalgo.h +++ b/src/include/OpenImageIO/imagebufalgo.h @@ -957,11 +957,11 @@ bool OIIO_API abs (ImageBuf &dst, const ImageBuf &A, ROI roi={}, int nthreads=0) /// /// All channels of one of the images get multiplied by the value in the only channel of the other image. /// Either `A` or `B` must be a single channel image. -ImageBuf OIIO_API scale (const ImageBuf &A, const ImageBuf &B, ROI roi={}, - int nthreads=0); +ImageBuf OIIO_API scale (const ImageBuf &A, const ImageBuf &B, + KWArgs options = {}, ROI roi={}, int nthreads=0); /// Write to an existing image `dst` (allocating if it is uninitialized). bool OIIO_API scale (ImageBuf &dst, const ImageBuf &A, const ImageBuf &B, - ROI roi={}, int nthreads=0); + KWArgs options = {}, ROI roi={}, int nthreads=0); /// Compute per-pixel product `A * B`, returning the result image. diff --git a/src/libOpenImageIO/imagebufalgo_muldiv.cpp b/src/libOpenImageIO/imagebufalgo_muldiv.cpp index 1ac39df35f..e393c8a22a 100644 --- a/src/libOpenImageIO/imagebufalgo_muldiv.cpp +++ b/src/libOpenImageIO/imagebufalgo_muldiv.cpp @@ -45,7 +45,7 @@ scale_impl(ImageBuf& R, const ImageBuf& A, const ImageBuf& B, ROI roi, bool ImageBufAlgo::scale(ImageBuf& dst, const ImageBuf& A, const ImageBuf& B, - ROI roi, int nthreads) + KWArgs options, ROI roi, int nthreads) { pvt::LoggedTimer logtime("IBA::scale"); bool ok = false; @@ -72,10 +72,11 @@ ImageBufAlgo::scale(ImageBuf& dst, const ImageBuf& A, const ImageBuf& B, ImageBuf -ImageBufAlgo::scale(const ImageBuf& A, const ImageBuf& B, ROI roi, int nthreads) +ImageBufAlgo::scale(const ImageBuf& A, const ImageBuf& B, KWArgs options, + ROI roi, int nthreads) { ImageBuf result; - bool ok = scale(result, A, B, roi, nthreads); + bool ok = scale(result, A, B, options, roi, nthreads); if (!ok && !result.has_error()) result.errorfmt("ImageBufAlgo::scale() error"); return result; @@ -149,8 +150,6 @@ ImageBufAlgo::mul(ImageBuf& dst, Image_or_Const A_, Image_or_Const B_, ROI roi, pvt::LoggedTimer logtime("IBA::mul"); if (A_.is_img() && B_.is_img()) { const ImageBuf &A(A_.img()), &B(B_.img()); - if (A.nchannels() == 1 || B.nchannels() == 1) - return scale(dst, A, B, roi, nthreads); if (!IBAprep(roi, &dst, &A, &B, IBAprep_CLAMP_MUTUAL_NCHANNELS)) return false; bool ok; From a106ab8506d0634845f03c66a81d476f5b7053a8 Mon Sep 17 00:00:00 2001 From: Anton Dukhovnikov Date: Fri, 29 Nov 2024 10:57:45 +1300 Subject: [PATCH 4/6] feat(IBA) scale - fix py bindings Signed-off-by: Anton Dukhovnikov --- src/python/py_imagebufalgo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/py_imagebufalgo.cpp b/src/python/py_imagebufalgo.cpp index 40655d3e21..4b6af20fbf 100644 --- a/src/python/py_imagebufalgo.cpp +++ b/src/python/py_imagebufalgo.cpp @@ -657,7 +657,7 @@ IBA_scale_images(ImageBuf& dst, const ImageBuf& A, const ImageBuf& B, ROI roi = ROI::All(), int nthreads = 0) { py::gil_scoped_release gil; - return ImageBufAlgo::scale(dst, A, B, roi, nthreads); + return ImageBufAlgo::scale(dst, A, B, {}, roi, nthreads); } ImageBuf @@ -665,7 +665,7 @@ IBA_scale_images_ret(const ImageBuf& A, const ImageBuf& B, ROI roi = ROI::All(), int nthreads = 0) { py::gil_scoped_release gil; - return ImageBufAlgo::scale(A, B, roi, nthreads); + return ImageBufAlgo::scale(A, B, {}, roi, nthreads); } bool From b7eef844b957a9f2790d38c556e6633b4de4a891 Mon Sep 17 00:00:00 2001 From: Anton Dukhovnikov Date: Sun, 1 Dec 2024 15:26:12 +1300 Subject: [PATCH 5/6] Update src/doc/imagebufalgo.rst Co-authored-by: Larry Gritz Signed-off-by: Anton Dukhovnikov --- src/doc/imagebufalgo.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/doc/imagebufalgo.rst b/src/doc/imagebufalgo.rst index c0815568f0..2118829b90 100644 --- a/src/doc/imagebufalgo.rst +++ b/src/doc/imagebufalgo.rst @@ -1329,12 +1329,12 @@ Image arithmetic | -.. doxygenfunction:: scale(const ImageBuf &A, const ImageBuf &B, ROI roi = {}, int nthreads = 0) +.. doxygenfunction:: scale(const ImageBuf &A, const ImageBuf &B, KWArgs options = {}, ROI roi = {}, int nthreads = 0) .. Result-as-parameter version: - .. doxygenfunction:: scale(ImageBuf &dst, const ImageBuf &A, const ImageBuf &B, ROI roi = {}, int nthreads = 0) + .. doxygenfunction:: scale(ImageBuf &dst, const ImageBuf &A, const ImageBuf &B, KWArgs options = {}, ROI roi = {}, int nthreads = 0) Examples: From bb7824f46212edccd73d0463b49fb5dc52c608cc Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Sun, 1 Dec 2024 10:50:41 -0800 Subject: [PATCH 6/6] Update src/include/OpenImageIO/imagebufalgo.h Signed-off-by: Larry Gritz --- src/include/OpenImageIO/imagebufalgo.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/include/OpenImageIO/imagebufalgo.h b/src/include/OpenImageIO/imagebufalgo.h index 007f630939..02ea537945 100644 --- a/src/include/OpenImageIO/imagebufalgo.h +++ b/src/include/OpenImageIO/imagebufalgo.h @@ -953,10 +953,14 @@ ImageBuf OIIO_API abs (const ImageBuf &A, ROI roi={}, int nthreads=0); bool OIIO_API abs (ImageBuf &dst, const ImageBuf &A, ROI roi={}, int nthreads=0); -/// Compute per-pixel product `A * B`, returning the result image. +/// Compute per-pixel product `A * B`, returning the result image. At least +/// one of `A` and `B` must be a single channel image, whose value is used to +/// scale all channels of the other image. +/// +/// @param options +/// Optional ParamValue's that may control the reconstruction. +/// (Reserved for future expansion.) /// -/// All channels of one of the images get multiplied by the value in the only channel of the other image. -/// Either `A` or `B` must be a single channel image. ImageBuf OIIO_API scale (const ImageBuf &A, const ImageBuf &B, KWArgs options = {}, ROI roi={}, int nthreads=0); /// Write to an existing image `dst` (allocating if it is uninitialized).