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

◆ threshold() [2/2]

MAYAFLUX_API void MayaFlux::Kinesis::Vision::threshold ( std::span< const float >  gray,
std::span< float >  dst,
float  value 
)

Global threshold writing into caller-supplied buffer.

Parameters
grayInput span, size must be w * h.
dstOutput span, size must be w * h.
valueThreshold value in [0, 1].

Definition at line 194 of file PixelOps.cpp.

195{
196 const size_t n = gray.size();
197 const float* src = gray.data();
198 float* out = dst.data();
199
200#ifdef MAYAFLUX_ARCH_X64
201 const __m256 thresh = _mm256_set1_ps(value);
202 const __m256 one = _mm256_set1_ps(1.0F);
203 size_t i = 0;
204 for (; i + 8 <= n; i += 8) {
205 __m256 v = _mm256_loadu_ps(src + i);
206 __m256 mask = _mm256_cmp_ps(v, thresh, _CMP_GE_OS);
207 _mm256_storeu_ps(out + i, _mm256_and_ps(mask, one));
208 }
209 for (; i < n; ++i)
210 out[i] = src[i] >= value ? 1.0F : 0.0F;
211
212#elif defined(MAYAFLUX_ARCH_ARM64)
213 const float32x4_t thresh = vdupq_n_f32(value);
214 const float32x4_t one = vdupq_n_f32(1.0F);
215 size_t i = 0;
216 for (; i + 4 <= n; i += 4) {
217 float32x4_t v = vld1q_f32(src + i);
218 uint32x4_t mask = vcgeq_f32(v, thresh);
219 vst1q_f32(out + i,
220 vreinterpretq_f32_u32(vandq_u32(mask, vreinterpretq_u32_f32(one))));
221 }
222 for (; i < n; ++i)
223 out[i] = src[i] >= value ? 1.0F : 0.0F;
224
225#else
226 std::transform(std::execution::par_unseq, gray.begin(), gray.end(), dst.begin(),
227 [value](float v) { return v >= value ? 1.0F : 0.0F; });
228#endif
229}
uint32_t * dst
const uint32_t * src
std::vector< float > * out
glm::vec3 value

References dst, out, src, and value.