OpenCV تابعی به نام cv::LUT داره که شما باید مقادیر مربوط به پالت را دستی پر کنید و سپس با تابع مذکور بر روی تصویر اعمال کنید.
void doLUT(cv::InputArray _src, cv::OutputArray _dst, std::vector<cv::Range> ranges)
{
int size = 256;
CV_Assert(_src.depth() == CV_8U);
if (_dst.size() != _dst.size() || _src.type() != _dst.type())
_dst.create(_src.size(), _src.type());
cv::Mat src = _src.getMat();
cv::Mat dst = _dst.getMat();
int channels = _src.channels();
if (channels == 1){
cv::Mat lut_mat(1, size, CV_8UC1);
unsigned char* p_lut = (unsigned char*)lut_mat.ptr<unsigned char>(0);
for (int i = 0; i < lut_mat.total(); i++)
if (i < ranges[0].start)
p_lut[i] = 0;
else if (i > ranges[0].end)
p_lut[i] = 255;
else p_lut[i] = static_cast<unsigned char>(255.0 *(i - ranges[0].start) / (ranges[0].size()));
cv::LUT(_src, lut_mat, _dst);
}
else if (channels == 3){
std::vector<cv::Mat> imgs;
split(_src, imgs);
for (size_t i = 0; i < imgs.size(); i++)
{
std::vector<cv::Range> range;
range.push_back(ranges[i]);
doLUT(imgs[i], imgs[i], range);
}
}
}