PreviewImage: Use LUTs for image coloring

This commit is contained in:
2026-01-30 10:37:59 +01:00
parent 253b90329f
commit 8fd02c47d4
+25 -10
View File
@@ -46,7 +46,6 @@ void PreviewImage::spot(std::vector<rgb> &ret, int64_t in_xpixel, int64_t in_ypi
void PreviewImage::roi(std::vector<rgb> &ret, int64_t in_xpixel, int64_t in_ypixel, int64_t roi_number) const {
color_pixel(ret, in_xpixel, in_ypixel, plotly[roi_number % 10]);
}
template<class T>
std::vector<rgb> PreviewImage::GenerateRGB(const uint8_t *value_8,
int64_t special_value_64,
@@ -87,16 +86,32 @@ std::vector<rgb> PreviewImage::GenerateRGB(const uint8_t *value_8,
}
// LUT-based mapping (fast path)
const auto &lut = scale.LUTData();
const int64_t lut_size = static_cast<int64_t>(lut.size());
const float lut_scale = static_cast<float>(lut_size - 1);
const float inv_range = (foreground > background)
? (lut_scale / (foreground - background))
: 0.0f;
const rgb gap_color = scale.Apply(ColorScaleSpecial::Gap);
const rgb bad_color = scale.Apply(ColorScaleSpecial::BadPixel);
std::vector<rgb> ret(xpixel * ypixel);
for (int i = 0; i < xpixel*ypixel; i++) {
if (mask[i] == MaskGap)
ret[i] = scale.Apply(ColorScaleSpecial::Gap);
else if ((value[i] == special_value)
|| (mask[i] == MaskDet)
|| (settings.show_user_mask && (mask[i] == MaskUsr))) {
ret[i] = scale.Apply(ColorScaleSpecial::BadPixel);
} else
ret[i] = scale.Apply(value[i], background, foreground);
for (int i = 0; i < xpixel * ypixel; i++) {
if (mask[i] == MaskGap) {
ret[i] = gap_color;
} else if ((value[i] == special_value)
|| (mask[i] == MaskDet)
|| (settings.show_user_mask && (mask[i] == MaskUsr))) {
ret[i] = bad_color;
} else {
const float v = static_cast<float>(value[i]);
int64_t idx = static_cast<int64_t>((v - background) * inv_range + 0.5f);
if (idx < 0) idx = 0;
else if (idx >= lut_size) idx = lut_size - 1;
ret[i] = lut[idx];
}
}
return ret;
}