MayaFlux 0.5.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 214 of file PixelOps.cpp.

215{
216 const size_t n = gray.size();
217 const float* src = gray.data();
218 float* out = dst.data();
219
220#ifdef MAYAFLUX_ARCH_X64
221 const __m256 thresh = _mm256_set1_ps(value);
222 const __m256 one = _mm256_set1_ps(1.0F);
223 size_t i = 0;
224 for (; i + 8 <= n; i += 8) {
225 __m256 v = _mm256_loadu_ps(src + i);
226 __m256 mask = _mm256_cmp_ps(v, thresh, _CMP_GE_OS);
227 _mm256_storeu_ps(out + i, _mm256_and_ps(mask, one));
228 }
229 for (; i < n; ++i)
230 out[i] = src[i] >= value ? 1.0F : 0.0F;
231
232#elif defined(MAYAFLUX_ARCH_ARM64)
233 const float32x4_t thresh = vdupq_n_f32(value);
234 const float32x4_t one = vdupq_n_f32(1.0F);
235 size_t i = 0;
236 for (; i + 4 <= n; i += 4) {
237 float32x4_t v = vld1q_f32(src + i);
238 uint32x4_t mask = vcgeq_f32(v, thresh);
239 vst1q_f32(out + i,
240 vreinterpretq_f32_u32(vandq_u32(mask, vreinterpretq_u32_f32(one))));
241 }
242 for (; i < n; ++i)
243 out[i] = src[i] >= value ? 1.0F : 0.0F;
244
245#else
246 P::transform(P::par_unseq, gray.begin(), gray.end(), dst.begin(),
247 [value](float v) { return v >= value ? 1.0F : 0.0F; });
248#endif
249}
float value

References value.