22enum class ImagePrecision :
unsigned int {
33enum class ImageChannel :
unsigned int {
47template <
typename VALUE_SRC,
typename VALUE_DST>
48inline VALUE_DST convert_channel_value(VALUE_SRC val);
50template <
typename PIX_SRC,
typename PIX_DST>
53 void operator()(
const PIX_SRC& src, PIX_DST& dst)
const;
57template <
typename TYPE>
60 static constexpr ImagePrecision precision = ImagePrecision::unknown;
61 static constexpr ImageChannel channel = ImageChannel::unknown;
64#ifdef LAGRANGE_IMAGE_TRAITS
65static_assert(
false,
"LAGRANGE_IMAGE_TRAITS was defined somewhere else")
66#elif LAGRANGE_IMAGE_COMMA
67static_assert(
false,
"LAGRANGE_IMAGE_COMMA was defined somewhere else")
70 #define LAGRANGE_IMAGE_TRAITS(TYPE, VALUE, SIZE_OF_VALUE, PRECISION, CHANNEL) \
72 struct ImageTraits<TYPE> \
74 typedef VALUE TValue; \
75 static constexpr size_t value_size = SIZE_OF_VALUE; \
76 static constexpr ImagePrecision precision = ImagePrecision::PRECISION; \
77 static constexpr ImageChannel channel = ImageChannel::CHANNEL; \
80 #define LAGRANGE_IMAGE_COMMA ,
81LAGRANGE_IMAGE_TRAITS(uint16_t, uint16_t, 1, uint16, one)
83 Eigen::Matrix<uint16_t LAGRANGE_IMAGE_COMMA 3 LAGRANGE_IMAGE_COMMA 1>,
89 Eigen::Matrix<uint16_t LAGRANGE_IMAGE_COMMA 4 LAGRANGE_IMAGE_COMMA 1>,
94LAGRANGE_IMAGE_TRAITS(
unsigned char,
unsigned char, 1, uint8, one)
96 Eigen::Matrix<unsigned char LAGRANGE_IMAGE_COMMA 3 LAGRANGE_IMAGE_COMMA 1>,
101LAGRANGE_IMAGE_TRAITS(
102 Eigen::Matrix<unsigned char LAGRANGE_IMAGE_COMMA 4 LAGRANGE_IMAGE_COMMA 1>,
107LAGRANGE_IMAGE_TRAITS(
char,
char, 1, int8, one)
108LAGRANGE_IMAGE_TRAITS(
109 Eigen::Matrix<char LAGRANGE_IMAGE_COMMA 3 LAGRANGE_IMAGE_COMMA 1>,
114LAGRANGE_IMAGE_TRAITS(
115 Eigen::Matrix<char LAGRANGE_IMAGE_COMMA 4 LAGRANGE_IMAGE_COMMA 1>,
120LAGRANGE_IMAGE_TRAITS(
unsigned int,
unsigned int, 1, uint32, one)
121LAGRANGE_IMAGE_TRAITS(
122 Eigen::Matrix<unsigned int LAGRANGE_IMAGE_COMMA 3 LAGRANGE_IMAGE_COMMA 1>,
127LAGRANGE_IMAGE_TRAITS(
128 Eigen::Matrix<unsigned int LAGRANGE_IMAGE_COMMA 4 LAGRANGE_IMAGE_COMMA 1>,
133LAGRANGE_IMAGE_TRAITS(
int,
int, 1, int32, one)
134LAGRANGE_IMAGE_TRAITS(Eigen::Vector3i,
int, 3, int32, three)
135LAGRANGE_IMAGE_TRAITS(Eigen::Vector4i,
int, 4, int32, four)
136LAGRANGE_IMAGE_TRAITS(
float,
float, 1, float32, one)
137LAGRANGE_IMAGE_TRAITS(Eigen::Vector3f,
float, 3, float32, three)
138LAGRANGE_IMAGE_TRAITS(Eigen::Vector4f,
float, 4, float32, four)
139LAGRANGE_IMAGE_TRAITS(
double,
double, 1, float64, one)
140LAGRANGE_IMAGE_TRAITS(Eigen::Vector3d,
double, 3, float64, three)
141LAGRANGE_IMAGE_TRAITS(Eigen::Vector4d,
double, 4, float64, four)
142LAGRANGE_IMAGE_TRAITS(Eigen::half, Eigen::half, 1, float16, one)
143LAGRANGE_IMAGE_TRAITS(
144 Eigen::Matrix<Eigen::half LAGRANGE_IMAGE_COMMA 3 LAGRANGE_IMAGE_COMMA 1>,
149LAGRANGE_IMAGE_TRAITS(
150 Eigen::Matrix<Eigen::half LAGRANGE_IMAGE_COMMA 4 LAGRANGE_IMAGE_COMMA 1>,
156 #undef LAGRANGE_IMAGE_TRAITS
157 #undef LAGRANGE_IMAGE_COMMA
160 template <
typename VALUE_SRC,
typename VALUE_DST>
161 inline VALUE_DST convert_channel_value(VALUE_SRC val)
164 if constexpr (std::is_same<VALUE_SRC, VALUE_DST>::value) {
169 std::is_same<VALUE_SRC, unsigned char>::value && std::is_floating_point<VALUE_DST>::value) {
170 return static_cast<VALUE_DST
>(val) /
171 static_cast<VALUE_DST
>(std::numeric_limits<unsigned char>::max());
175 std::is_floating_point<VALUE_SRC>::value && std::is_same<VALUE_DST, unsigned char>::value) {
176 return static_cast<unsigned char>(
177 std::clamp(val,
static_cast<VALUE_SRC
>(0),
static_cast<VALUE_SRC
>(1)) *
178 static_cast<VALUE_SRC
>(std::numeric_limits<unsigned char>::max()));
182 std::is_same<VALUE_SRC, uint16_t>::value && std::is_floating_point<VALUE_DST>::value) {
183 return static_cast<VALUE_DST
>(val) /
184 static_cast<VALUE_DST
>(std::numeric_limits<uint16_t>::max());
188 std::is_floating_point<VALUE_SRC>::value && std::is_same<VALUE_DST, uint16_t>::value) {
189 return static_cast<uint16_t
>(
190 std::clamp(val,
static_cast<VALUE_SRC
>(0),
static_cast<VALUE_SRC
>(1)) *
191 static_cast<VALUE_SRC
>(std::numeric_limits<uint16_t>::max()));
194 if constexpr (std::is_signed<VALUE_SRC>::value && !std::is_signed<VALUE_DST>::value) {
195 val = std::max(val,
static_cast<VALUE_SRC
>(0));
199 (std::is_integral<VALUE_SRC>::value && std::is_integral<VALUE_DST>::value) &&
200 (
sizeof(VALUE_SRC) >
sizeof(VALUE_DST) ||
201 (
sizeof(VALUE_SRC) ==
sizeof(VALUE_DST) && std::is_signed<VALUE_DST>::value))) {
202 return static_cast<VALUE_DST
>(
203 std::min(val,
static_cast<VALUE_SRC
>(std::numeric_limits<VALUE_DST>::max())));
207 return static_cast<VALUE_DST
>(val);
212template <
typename PIX_SRC,
typename PIX_DST>
213inline void convert_image_pixel<PIX_SRC, PIX_DST>::operator()(
const PIX_SRC& src, PIX_DST& dst)
218 constexpr size_t L_SRC =
static_cast<size_t>(ImageTraits<PIX_SRC>::channel);
219 constexpr size_t L_DST =
static_cast<size_t>(ImageTraits<PIX_DST>::channel);
221 if constexpr (1 == L_SRC && 1 == L_DST) {
222 dst = convert_channel_value<V_SRC, V_DST>(src);
225 else if constexpr (1 == L_SRC) {
226 dst(0) = convert_channel_value<V_SRC, V_DST>(src);
227 for (
size_t i = 1; i < L_DST; ++i) {
228 dst(i) =
static_cast<V_DST
>(0);
230 if constexpr (3 <= L_DST) {
234 if constexpr (4 == L_DST) {
235 if constexpr (std::is_floating_point<V_DST>::value) {
236 dst(3) =
static_cast<V_DST
>(1);
237 }
else if constexpr (!std::is_signed<V_DST>::value && 1 ==
sizeof(V_DST)) {
238 dst(3) = std::numeric_limits<V_DST>::max();
240 dst(3) =
static_cast<V_DST
>(0);
245 else if constexpr (1 == L_DST) {
246 dst = convert_channel_value<V_SRC, V_DST>(src(0));
250 constexpr size_t L_MIN = std::min(L_SRC, L_DST);
251 for (
size_t i = 0; i < L_MIN; ++i) {
252 dst(i) = convert_channel_value<V_SRC, V_DST>(src(i));
254 if constexpr (3 == L_MIN && 4 == L_DST) {
255 if constexpr (std::is_floating_point<V_DST>::value) {
256 dst(3) =
static_cast<V_DST
>(1);
257 }
else if constexpr (!std::is_signed<V_DST>::value && 1 ==
sizeof(V_DST)) {
258 dst(3) = std::numeric_limits<V_DST>::max();
260 dst(3) =
static_cast<V_DST
>(0);
263 for (
size_t i = L_MIN; i < L_DST; ++i) {
264 dst(i) =
static_cast<V_DST
>(0);
Basic image data structure.
Main namespace for Lagrange.
Definition ImageType.h:59
Definition ImageType.h:52