PreviewImage: Use LUTs for image coloring
This commit is contained in:
+25
-10
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user