MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ sobel() [2/2]

MAYAFLUX_API GradientResult MayaFlux::Kinesis::Vision::sobel ( std::span< const float >  gray,
uint32_t  w,
uint32_t  h 
)

Sobel gradient operator.

3x3 Sobel kernels applied separably. dx and dy are in [-1, 1]. Magnitude is normalised by the theoretical maximum (4 * 255 / 255 = 4 for uint8 sources, but since input is already [0,1] the max magnitude is sqrt(2) which is divided out). Angle via atan2(dy, dx).

Parameters
graySingle-channel float span, size must be w * h.
wImage width in pixels.
hImage height in pixels.
Returns
GradientResult with all four maps populated.

Definition at line 72 of file Gradient.cpp.

73{
74 const size_t n = static_cast<size_t>(w) * h;
76 r.dx.resize(n);
77 r.dy.resize(n);
78 std::vector<float> tmp(n);
79 sobel(gray, r.dx, r.dy, tmp, w, h);
80
81 const auto en = static_cast<Eigen::Index>(n);
82 auto dx = Eigen::Map<const Eigen::ArrayXf>(r.dx.data(), en);
83 auto dy = Eigen::Map<const Eigen::ArrayXf>(r.dy.data(), en);
84 r.magnitude.resize(n);
85 r.angle.resize(n);
86
87 Eigen::Map<Eigen::ArrayXf>(r.magnitude.data(), en) = (dx.square() + dy.square()).sqrt();
88 const float peak = Eigen::Map<const Eigen::ArrayXf>(r.magnitude.data(), en).maxCoeff();
89 if (peak > 0.0F)
90 Eigen::Map<Eigen::ArrayXf>(r.magnitude.data(), en) /= peak;
91
92 std::transform(std::execution::par_unseq, r.dx.begin(), r.dx.end(), r.dy.begin(), r.angle.begin(),
93 [](float gx, float gy) { return std::atan2(gy, gx); });
94 return r;
95}
uint32_t h
Definition InkPress.cpp:29
void sobel(std::span< const float > gray, std::span< float > dx, std::span< float > dy, std::span< float > tmp, uint32_t w, uint32_t h)
Sobel gradient writing dx and dy into caller-supplied buffers.
Definition Gradient.cpp:64
std::vector< float > angle
Gradient angle in radians, [-pi, pi].
Definition Gradient.hpp:26
std::vector< float > magnitude
Gradient magnitude, normalised to [0, 1].
Definition Gradient.hpp:25
std::vector< float > dx
Horizontal gradient component.
Definition Gradient.hpp:23
std::vector< float > dy
Vertical gradient component.
Definition Gradient.hpp:24
Gradient maps produced by Sobel and Scharr operators.
Definition Gradient.hpp:22

References MayaFlux::Kinesis::Vision::GradientResult::angle, MayaFlux::Kinesis::Vision::GradientResult::dx, MayaFlux::Kinesis::Vision::GradientResult::dy, h, MayaFlux::Kinesis::Vision::GradientResult::magnitude, and sobel().

+ Here is the call graph for this function: