Мне удалось воспроизвести поведение MATLAB, но мне пришлось прибегнуть к ручной итерации по каждому пикселю и установить максимальное значение для глубины изображения или масштабировать его там, где это необходимо.
мой код выглядел примерно такthis
cv::minMaxLoc(dst, &min, &max);
double axisThreshold = floor(max / contrastLevel);
for (int i = 0; i < dst.rows; i++)
{
for (int j = 0; j < dst.cols; j++)
{
short pixel = dst.at<short>(i, j);
if (pixel >= axisThreshold)
{
pixel = USHRT_MAX;
}
else
{
pixel *= (USHRT_MAX / axisThreshold);
}
dst.at<short>(i, j) = cv::saturate_cast<short>(pixel);
}
}
В моем примере у меня был ползунок, который регулировал контрастность / яркость (мы называли это контрастом, оригинальная реализация называла его яркостью).
Когда контрастность / яркость были измененыпрограмма извлекает максимальное значение пикселя, а затем вычисляет предел оси, выполняя
selectedThreshold = максимальное значение пикселя / контрастность
Каждый пиксель, превышающий пороговое значение, устанавливается равным MAX, каждый пиксель нижечем пороговое значение умножается на масштабный коэффициент, рассчитанный на
scale = MAX Pixel Value / рассчитанныйThreshold.
TBH Я не могу сказать, что я полностью понимаю математику, стоящую за ним.Я просто использовал метод проб и ошибок, пока он не сработал;любая помощь в этом отделе была бы признательна, ОДНАКО она, кажется, делает то, что я хочу!
Мое понимание первоначальной реализации Matlab и терминологии «яркость» фактически является их попыткой масштабировать цветовую карту так, чтобы ««Чем ярче» изображение, тем менее интенсивным должен быть каждый пиксель для отображения на определенный цвет в карте цветов.
Поскольку applycolourmap работает только на 8-битных изображениях, когда яркость увеличивается, а значения оси цветов уменьшаются, мынеобходимо обеспечить соответственно масштабирование значений пикселей, чтобы они теперь соответствовали «более высоким» значениям интенсивности на карте.
Я видел множество учебных пособий OPENCV, в которых используется этот подход для изменения контрастности / яркости, ноони часто способствуют использованию оптимизированного convertTo (особенно, если вы пытаетесь использовать графический процессор).Однако, насколько я вижу, convertTo применяет значения aplha / beta равномерно, а не по пикселям, поэтому я не могу использовать этот подход.
Я обновлю этот вопрос, если я найду более подходящие функции OPENCV для достижения того, чего я хочу.