MayaFlux 0.5.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 74 of file Gradient.cpp.

75{
76 const size_t n = static_cast<size_t>(w) * h;
78 r.dx.resize(n);
79 r.dy.resize(n);
80 std::vector<float> tmp(n);
81 sobel(gray, r.dx, r.dy, tmp, w, h);
82
83 const auto en = static_cast<Eigen::Index>(n);
84 auto dx = Eigen::Map<const Eigen::ArrayXf>(r.dx.data(), en);
85 auto dy = Eigen::Map<const Eigen::ArrayXf>(r.dy.data(), en);
86 r.magnitude.resize(n);
87 r.angle.resize(n);
88
89 Eigen::Map<Eigen::ArrayXf>(r.magnitude.data(), en) = (dx.square() + dy.square()).sqrt();
90 const float peak = Eigen::Map<const Eigen::ArrayXf>(r.magnitude.data(), en).maxCoeff();
91 if (peak > 0.0F)
92 Eigen::Map<Eigen::ArrayXf>(r.magnitude.data(), en) /= peak;
93
94 P::transform(P::par_unseq, r.dx.begin(), r.dx.end(), r.dy.begin(), r.angle.begin(),
95 [](float gx, float gy) { return std::atan2(gy, gx); });
96 return r;
97}
uint32_t h
Definition InkPress.cpp:28
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:66
double peak(const std::vector< double > &data)
Find peak amplitude in single-channel data.
Definition Yantra.cpp:268
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, MayaFlux::peak(), and sobel().

+ Here is the call graph for this function: