Алгоритм регулировки уровней изображенияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Алгоритм регулировки уровней изображения

Сообщение Anonymous »

Мне нужно реализовать на C++ алгоритм настройки уровней изображения, который работает аналогично функции «Уровни» в Photoshop или GIMP. Т.е. Входные данные: цветное изображение RGB, подлежащее настройке, настройка, точка, точка черного, точка средних тонов, вывод из/в значения. Но я пока не нашел информации о том, как выполнить эту настройку. Возможно, кто-то порекомендует мне описание алгоритма или материалы для изучения.

На данный момент я сам придумал следующий код, но он не дает ожидаемого результата, аналогичного то, что я вижу, например, в GIMP, изображение становится слишком светлым. Ниже приведен мой текущий фрагмент кода:

const int normalBlackPoint = 0;
const int normalMidtonePoint = 127;
const int normalWhitePoint = 255;
const double normalLowRange = normalMidtonePoint - normalBlackPoint + 1;
const double normalHighRange = normalWhitePoint - normalMidtonePoint;

int blackPoint = 53;
int midtonePoint = 110;
int whitePoint = 168;
int outputFrom = 0;
int outputTo = 255;

double outputRange = outputTo - outputFrom + 1;
double lowRange = midtonePoint - blackPoint + 1;
double highRange = whitePoint - midtonePoint;
double fullRange = whitePoint - blackPoint + 1;
double lowPart = lowRange / fullRange;
double highPart = highRange / fullRange;

int dim(256);
cv::Mat lut(1, &dim, CV_8U);
for(int i = 0; i < 256; ++i)
{
double p = i > normalMidtonePoint
? (static_cast(i - normalMidtonePoint) / normalHighRange) * highRange * highPart + lowPart
: (static_cast(i + 1) / normalLowRange) * lowRange * lowPart;
int v = static_cast(outputRange * p ) + outputFrom - 1;
if(v < 0) v = 0;
else if(v > 255) v = 255;
lut.at(i) = v;
}

....

cv::Mat sourceImage = cv::imread(inputFileName, CV_LOAD_IMAGE_COLOR);
if(!sourceImage.data)
{
std::cerr

Подробнее здесь: https://stackoverflow.com/questions/395 ... age-levels
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»