PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::encoding::simd::window_level_lut Class Reference

Precomputed LUT for fast repeated window/level application. More...

#include <simd_windowing.h>

Collaboration diagram for kcenon::pacs::encoding::simd::window_level_lut:
Collaboration graph

Public Member Functions

void apply_8bit (const uint8_t *src, uint8_t *dst, size_t pixel_count) const noexcept
 Apply LUT to 8-bit data.
 
void apply_16bit (const uint16_t *src, uint8_t *dst, size_t pixel_count) const noexcept
 Apply LUT to 16-bit data (uses clamping for out-of-range values)
 
bool is_valid_8bit () const noexcept
 
bool is_valid_16bit () const noexcept
 

Static Public Member Functions

static window_level_lut create_8bit (const window_level_params &params)
 Construct LUT for 8-bit input.
 
static window_level_lut create_12bit (const window_level_params &params)
 Construct LUT for 12-bit input.
 
static window_level_lut create_16bit (const window_level_params &params)
 Construct LUT for 16-bit input.
 

Private Attributes

std::vector< uint8_t > lut_8bit_
 
std::vector< uint8_t > lut_16bit_
 

Detailed Description

Precomputed LUT for fast repeated window/level application.

Definition at line 62 of file simd_windowing.h.

Member Function Documentation

◆ apply_16bit()

void kcenon::pacs::encoding::simd::window_level_lut::apply_16bit ( const uint16_t * src,
uint8_t * dst,
size_t pixel_count ) const
inlinenoexcept

Apply LUT to 16-bit data (uses clamping for out-of-range values)

Definition at line 143 of file simd_windowing.h.

144 {
145 const size_t lut_size = lut_16bit_.size();
146 for (size_t i = 0; i < pixel_count; ++i) {
147 const uint16_t val = src[i];
148 if (val < lut_size) {
149 dst[i] = lut_16bit_[val];
150 } else {
151 dst[i] = lut_16bit_[lut_size - 1];
152 }
153 }
154 }

References lut_16bit_.

◆ apply_8bit()

void kcenon::pacs::encoding::simd::window_level_lut::apply_8bit ( const uint8_t * src,
uint8_t * dst,
size_t pixel_count ) const
inlinenoexcept

Apply LUT to 8-bit data.

Definition at line 133 of file simd_windowing.h.

134 {
135 for (size_t i = 0; i < pixel_count; ++i) {
136 dst[i] = lut_8bit_[src[i]];
137 }
138 }

References lut_8bit_.

◆ create_12bit()

static window_level_lut kcenon::pacs::encoding::simd::window_level_lut::create_12bit ( const window_level_params & params)
inlinestatic

Construct LUT for 12-bit input.

Definition at line 89 of file simd_windowing.h.

89 {
90 window_level_lut lut;
91 lut.lut_16bit_.resize(4096);
92
93 const double min_val = params.center - params.width / 2.0;
94 const double scale = 255.0 / params.width;
95
96 for (int i = 0; i < 4096; ++i) {
97 double val = (i - min_val) * scale;
98 val = std::clamp(val, 0.0, 255.0);
99 if (params.invert) {
100 val = 255.0 - val;
101 }
102 lut.lut_16bit_[i] = static_cast<uint8_t>(std::round(val));
103 }
104
105 return lut;
106 }

References kcenon::pacs::encoding::simd::window_level_params::center, kcenon::pacs::encoding::simd::window_level_params::invert, lut_16bit_, and kcenon::pacs::encoding::simd::window_level_params::width.

◆ create_16bit()

static window_level_lut kcenon::pacs::encoding::simd::window_level_lut::create_16bit ( const window_level_params & params)
inlinestatic

Construct LUT for 16-bit input.

Definition at line 111 of file simd_windowing.h.

111 {
112 window_level_lut lut;
113 lut.lut_16bit_.resize(65536);
114
115 const double min_val = params.center - params.width / 2.0;
116 const double scale = 255.0 / params.width;
117
118 for (int i = 0; i < 65536; ++i) {
119 double val = (i - min_val) * scale;
120 val = std::clamp(val, 0.0, 255.0);
121 if (params.invert) {
122 val = 255.0 - val;
123 }
124 lut.lut_16bit_[i] = static_cast<uint8_t>(std::round(val));
125 }
126
127 return lut;
128 }

References kcenon::pacs::encoding::simd::window_level_params::center, kcenon::pacs::encoding::simd::window_level_params::invert, lut_16bit_, and kcenon::pacs::encoding::simd::window_level_params::width.

◆ create_8bit()

static window_level_lut kcenon::pacs::encoding::simd::window_level_lut::create_8bit ( const window_level_params & params)
inlinestatic

Construct LUT for 8-bit input.

Definition at line 67 of file simd_windowing.h.

67 {
68 window_level_lut lut;
69 lut.lut_8bit_.resize(256);
70
71 const double min_val = params.center - params.width / 2.0;
72 const double scale = 255.0 / params.width;
73
74 for (int i = 0; i < 256; ++i) {
75 double val = (i - min_val) * scale;
76 val = std::clamp(val, 0.0, 255.0);
77 if (params.invert) {
78 val = 255.0 - val;
79 }
80 lut.lut_8bit_[i] = static_cast<uint8_t>(std::round(val));
81 }
82
83 return lut;
84 }

References kcenon::pacs::encoding::simd::window_level_params::center, kcenon::pacs::encoding::simd::window_level_params::invert, lut_8bit_, and kcenon::pacs::encoding::simd::window_level_params::width.

◆ is_valid_16bit()

bool kcenon::pacs::encoding::simd::window_level_lut::is_valid_16bit ( ) const
inlinenodiscardnoexcept

Definition at line 160 of file simd_windowing.h.

160 {
161 return !lut_16bit_.empty();
162 }

References lut_16bit_.

◆ is_valid_8bit()

bool kcenon::pacs::encoding::simd::window_level_lut::is_valid_8bit ( ) const
inlinenodiscardnoexcept

Definition at line 156 of file simd_windowing.h.

156 {
157 return !lut_8bit_.empty();
158 }

References lut_8bit_.

Member Data Documentation

◆ lut_16bit_

std::vector<uint8_t> kcenon::pacs::encoding::simd::window_level_lut::lut_16bit_
private

Definition at line 166 of file simd_windowing.h.

Referenced by apply_16bit(), create_12bit(), create_16bit(), and is_valid_16bit().

◆ lut_8bit_

std::vector<uint8_t> kcenon::pacs::encoding::simd::window_level_lut::lut_8bit_
private

Definition at line 165 of file simd_windowing.h.

Referenced by apply_8bit(), create_8bit(), and is_valid_8bit().


The documentation for this class was generated from the following file: