Я не могу на всю жизнь понять, как применять TCA- и коррекцию искажений, используя LensFun и OpenCV вместе.
LensFun - это база данных Open-Source-Lens-Database, содержащая параметры, которые можно применять к RAW-изображениям для исправления искажающих артефактов, возникающих при работе с RAW-данными.
В документации есть пример , в котором объясняется, как применять различные типы исправлений. Я особенно заинтересован в использовании ApplySubpixelGeometryDistortion
(документация здесь ), как говорится в заголовке. Функция считывает одну строку данных пикселей (по крайней мере, в примере; в строке 297 ) и записывает неискаженные данные в массив. Функция будет вызываться для каждой строки в изображении, а затем для каждого столбца (т. Е. Координаты x), результирующие неискаженные значения пикселей могут быть записаны в новый массив изображений .
I искал inte rnet и нашел это сообщение из списка рассылки . Я попытался приспособить то, что оригинальный плакат обнаружил к моей проблеме, которая в настоящее время выглядит следующим образом:
auto *mod = new lfModifier(lens, lens->MinFocal, cam->CropFactor, Img.cols, Img.rows, LF_PF_U8);
if (!mod) {
printf("Warning: Failed to create modifier!\n");
delete img;
delete ldb;
return -1;
}
mod->EnableTCACorrection();
mod->EnableDistortionCorrection();
unsigned height = Img.rows;
unsigned width = Img.cols;
unsigned lwidth = width * 2 * 3;
auto *pos = new float[lwidth];
bool ok = true;
cv::Mat mapX(height, width, CV_32FC1);
cv::Mat mapY(height, width, CV_32FC1);
for (unsigned y = 0; y < height; y++) {
ok = mod->ApplySubpixelGeometryDistortion(0.0, y, width, 1, pos);
if (ok) {
float *src = pos;
for (unsigned x = 0; x < width; x++) {
mapX.at<float>(y, x) = src[0];
mapY.at<float>(y, x) = src[1];
src += 2;
}
}
}
delete [] pos;
cv::Mat dest(height, width, CV_8UC3);
cv::remap(Img, dest, mapX, mapY, cv::INTER_NEAREST);
cv::imwrite("Corrected.png", dest);
Где Img
- это cv::Mat
. Полученное изображение Corrected.png
выглядит следующим образом:
В то время как исходное искаженное изображение выглядит следующим образом (это всего лишь cv::imwrite
после изображения RAW был распакован с помощью LibRaw):
Как вы можете видеть, по крайней мере виньетка исчезла, но поскольку все изображение является лишь вырезом оригинальное изображение это не такой сюрприз. Кроме того, искажения TCA не исчезли, так что я думаю, что что-то совершенно не так. Я действительно не знаю, чего я не понял или как я могу применить правильную коррекцию искажения.
Вся помощь приветствуется.