iptransform: correct profile based distortion/CA before rotation
Like perspective correction also rotation correction should be applied after distortion/CA correction.
This commit is contained in:
@@ -515,14 +515,14 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector<Coord2D> &src,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pLCPMap && params->lensProf.useDist) {
|
|
||||||
pLCPMap->correctDistortion(x_d, y_d, w2, h2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// rotate
|
// rotate
|
||||||
double Dx = x_d * cost - y_d * sint;
|
double Dx = x_d * cost - y_d * sint;
|
||||||
double Dy = x_d * sint + y_d * cost;
|
double Dy = x_d * sint + y_d * cost;
|
||||||
|
|
||||||
|
if (pLCPMap && params->lensProf.useDist) {
|
||||||
|
pLCPMap->correctDistortion(Dx, Dy, w2, h2);
|
||||||
|
}
|
||||||
|
|
||||||
// distortion correction
|
// distortion correction
|
||||||
double s = 1;
|
double s = 1;
|
||||||
|
|
||||||
@@ -1240,25 +1240,25 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enableLCPDist) {
|
|
||||||
pLCPMap->correctDistortion(x_d, y_d, w2, h2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// rotate
|
// rotate
|
||||||
const double Dxc = x_d * cost - y_d * sint;
|
double Dxr = x_d * cost - y_d * sint;
|
||||||
const double Dyc = x_d * sint + y_d * cost;
|
double Dyr = x_d * sint + y_d * cost;
|
||||||
|
|
||||||
|
if (enableLCPDist) {
|
||||||
|
pLCPMap->correctDistortion(Dxr, Dyr, w2, h2);
|
||||||
|
}
|
||||||
|
|
||||||
// distortion correction
|
// distortion correction
|
||||||
double s = 1.0;
|
double s = 1.0;
|
||||||
|
|
||||||
if (enableDistortion) {
|
if (enableDistortion) {
|
||||||
const double r = sqrt(Dxc * Dxc + Dyc * Dyc) / maxRadius;
|
const double r = sqrt(Dxr * Dxr + Dyr * Dyr) / maxRadius;
|
||||||
s = 1.0 - distAmount + distAmount * r;
|
s = 1.0 - distAmount + distAmount * r;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int c = 0; c < (enableCA ? 3 : 1); ++c) {
|
for (int c = 0; c < (enableCA ? 3 : 1); ++c) {
|
||||||
double Dx = Dxc * (s + chDist[c]);
|
double Dx = Dxr * (s + chDist[c]);
|
||||||
double Dy = Dyc * (s + chDist[c]);
|
double Dy = Dyr * (s + chDist[c]);
|
||||||
|
|
||||||
// de-center
|
// de-center
|
||||||
Dx += w2;
|
Dx += w2;
|
||||||
@@ -1522,4 +1522,3 @@ bool ImProcFunctions::needsTransform (int oW, int oH, int rawRotationDeg, const
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user