Ocean
Loading...
Searching...
No Matches
PoissonBlending.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#ifndef META_OCEAN_CV_ADVANCED_POISSON_BLENDING_H
9#define META_OCEAN_CV_ADVANCED_POISSON_BLENDING_H
10
12
13#include "ocean/base/Frame.h"
14#include "ocean/base/Worker.h"
15
17
19
20namespace Ocean
21{
22
23namespace CV
24{
25
26namespace Advanced
27{
28
29/**
30 * Provides image blending based on Poisson Blending, a seamless image composition algorithm from Perez, et al. ("Poisson Image Editing", 2003).
31 * This class implements seamless cloning of a region of a source image into a target image.<br>
32 * This is performed by minimizing the difference between the Laplacians of source and result image region while using the region border of target pixels as boundary condition.
33 * @ingroup cvadvanced
34 */
35class OCEAN_CV_ADVANCED_EXPORT PoissonBlending
36{
37 public:
38
39 /**
40 * Performs Poisson Blending of the specified source frame into the specified target frame.
41 * Only source pixels defined by the specified source mask are inserted into the target frame.<br>
42 * The source frame in must not overlap with the border of the target frame for the specified insert position.<br>
43 * Source frame and source mask frame should have the same dimensions.<br>
44 * Only pixels with the specified mask value are considered to be inside of the source mask.
45 * @param source The source frame, pixel format must be 8 bit per color channel, must be valid
46 * @param sourceMask Mask of source frame, pixel format must be Y8, must be valid
47 * @param target The target frame into which the source frame is blended, the pixel format must be identical to the source frame, must be valid
48 * @param left Specifies the horizontal position of the left border of the inserted source frame in pixel, with range (-infinity, infinity)
49 * @param top Specifies the vertical position of the top border of the inserted source frame in pixel, with range (-infinity, infinity)
50 * @param maskValue The value of mask pixels to be considered inside of the source content that will be blended
51 * @param worker Optional worker object to distribute the computational load
52 */
53 static void poissonBlending(const Frame& source, const Frame& sourceMask, Frame& target, const int left, const int top, const uint8_t maskValue = 0xFFu, Worker* worker = nullptr);
54
55 protected:
56
57 /**
58 * Performs separate Poisson blending calculations for a range of color channels.
59 * @param indexLookup Index lookup frame for masked source pixels
60 * @param source The source frame, pixel format must be 8 bit per color channel
61 * @param target The target frame into which the source frame is blended, Pixel format must be identical to the source frame
62 * @param matrixA Sparse matrix representing the relations between neighbored source mask pixels
63 * @param sourceBoundingBox The source bounding box, must be valid
64 * @param targetLeft Left border of insert region in the target frame
65 * @param targetTop Top border of insert region in the target frame
66 * @param firstChannel Index of the first color channel to be handled, with range [0, target.channels() - channelCount]
67 * @param channelCount Number of color channels to be handled, with range [1, target.channels()]
68 */
69 static void poissonBlendingSubset(const Frame* indexLookup, const Frame* source, Frame* target, const SparseMatrixF* matrixA, const CV::PixelBoundingBox* sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int firstChannel, const unsigned int channelCount);
70
71 /**
72 * Creates an index lookup frame for masked source pixels.
73 * Pixels are considered to be part of the mask if they have the specified mask value.
74 * @param sourceMask Frame mask for which an index lookup is created, pixel format should be 8bit grayscale
75 * @param sourceBoundingBox The source bounding box, must be valid
76 * @param maskValue value of pixels to be considered inside of the source mask
77 * @param indexLookup Receives the created index lookup frame
78 * @return The number of pixels within the mask
79 */
80 static size_t createIndexLookup(const Frame& sourceMask, const CV::PixelBoundingBox& sourceBoundingBox, const uint8_t maskValue, Frame& indexLookup);
81
82 /**
83 * Creates a sparse matrix representing the relations between neighbored source mask pixels.
84 * @param indexLookup Index lookup frame
85 * @param sourceBoundingBox The source bounding box, must be valid
86 * @param targetLeft Left border of insert region in the target frame, with range [0, targetWidth)
87 * @param targetTop Top border of insert region in the target frame, with range [0, targetHeight)
88 * @param targetWidth Width of target frame in pixels
89 * @param targetHeight Height of target frame in pixels
90 * @param matrixA Receives the sparse matrix representing the relations between neighbored source mask pixels
91 */
92 static void createMaskNeighborRelationsMatrix(const Frame& indexLookup, const CV::PixelBoundingBox& sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int targetWidth, const unsigned int targetHeight, SparseMatrixF& matrixA);
93
94 /**
95 * Creates the vector representing the sum of border pixels and source frame laplacian for each pixel within the source mask.
96 * @param indexLookup Index lookup frame for masked source pixels
97 * @param source The source frame, pixel format must be 8 bit per color channel
98 * @param target The target frame into which the source frame is blended, Pixel format must be identical to the source frame
99 * @param sourceBoundingBox The source bounding box, must be valid
100 * @param targetLeft Left border of insert region in the target frame
101 * @param targetTop Top border of insert region in the target frame
102 * @param channelIndex The index of the color channel, with range [0, target.channels()]
103 * @param vectorB Receives the vector representing the sum of border pixels and source frame laplacian for each pixel within the source mask.
104 */
105 static void createSummedBorderLaplacianVector(const Frame& indexLookup, const Frame& source, const Frame& target, const CV::PixelBoundingBox& sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int channelIndex, MatrixF& vectorB);
106
107 /**
108 * Inserts the solved matrix into the output frame for the specified channel number.
109 * @param indexLookup Index lookup frame for masked source pixels
110 * @param vectorX Result vector containing the calculated Poisson blended values
111 * @param sourceBoundingBox The source bounding box, must be valid
112 * @param targetLeft Left border of insert region in the target frame
113 * @param targetTop Top border of insert region in the target frame
114 * @param channelIndex The index of the color channel, with range [0, target.channels()]
115 * @param target The target frame into which the source frame is blended, Pixel format must be identical to the source frame
116 */
117 static void insertResultDataToChannel(const Frame& indexLookup, const MatrixF& vectorX, const CV::PixelBoundingBox& sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int channelIndex, Frame& target);
118};
119
120}
121
122}
123
124}
125
126#endif // META_OCEAN_CV_ADVANCED_POISSON_BLENDING_H
Provides image blending based on Poisson Blending, a seamless image composition algorithm from Perez,...
Definition PoissonBlending.h:36
static size_t createIndexLookup(const Frame &sourceMask, const CV::PixelBoundingBox &sourceBoundingBox, const uint8_t maskValue, Frame &indexLookup)
Creates an index lookup frame for masked source pixels.
static void poissonBlendingSubset(const Frame *indexLookup, const Frame *source, Frame *target, const SparseMatrixF *matrixA, const CV::PixelBoundingBox *sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int firstChannel, const unsigned int channelCount)
Performs separate Poisson blending calculations for a range of color channels.
static void createMaskNeighborRelationsMatrix(const Frame &indexLookup, const CV::PixelBoundingBox &sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int targetWidth, const unsigned int targetHeight, SparseMatrixF &matrixA)
Creates a sparse matrix representing the relations between neighbored source mask pixels.
static void poissonBlending(const Frame &source, const Frame &sourceMask, Frame &target, const int left, const int top, const uint8_t maskValue=0xFFu, Worker *worker=nullptr)
Performs Poisson Blending of the specified source frame into the specified target frame.
static void createSummedBorderLaplacianVector(const Frame &indexLookup, const Frame &source, const Frame &target, const CV::PixelBoundingBox &sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int channelIndex, MatrixF &vectorB)
Creates the vector representing the sum of border pixels and source frame laplacian for each pixel wi...
static void insertResultDataToChannel(const Frame &indexLookup, const MatrixF &vectorX, const CV::PixelBoundingBox &sourceBoundingBox, const unsigned int targetLeft, const unsigned int targetTop, const unsigned int channelIndex, Frame &target)
Inserts the solved matrix into the output frame for the specified channel number.
This class implements Ocean's image class.
Definition Frame.h:1808
This class implements a matrix with arbitrary size.
Definition Matrix.h:63
This class implements a sparse matrix using a float type for its elements that is specified by T.
Definition SparseMatrix.h:61
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
The namespace covering the entire Ocean framework.
Definition Accessor.h:15