Skip to content

Commit 34d27ba

Browse files
committed
4.13.4: dewarping: replacing Lagrange with Akima spline
1 parent 5436dfb commit 34d27ba

File tree

3 files changed

+79
-13
lines changed

3 files changed

+79
-13
lines changed

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ Window:: Window()
3434
fileMenu->addAction("Paste Image", this, SLOT(openFromClipboard()));
3535
fileBtn->setMenu(fileMenu);
3636
QMenu *transformMenu = new QMenu(transformBtn);
37-
transformMenu->addAction("Mirror Image", this, SLOT(mirror()));
3837
QMenu *geometryMenu = transformMenu->addMenu("Geometry");
3938
geometryMenu->addAction("Un-tilt Image", this, SLOT(perspectiveTransform()));
4039
geometryMenu->addAction("DeWarping", this, SLOT(deWarping()));
4140
geometryMenu->addAction("DeOblique", this, SLOT(deOblique()));
4241
geometryMenu->addAction("Lens Distortion", this, SLOT(lensDistort()));
42+
transformMenu->addAction("Mirror Image", this, SLOT(mirror()));
4343
transformMenu->addAction("Rotate by ...", this, SLOT(rotateAny()));
4444
transformBtn->setMenu(transformMenu);
4545
QMenu *decorateMenu = new QMenu(decorateBtn);

src/transform.cpp

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ DeWarping(Canvas *canvas, QStatusBar *statusbar, int count) : QObject(canvas),
609609
lnd << QPointF(pixmap.width(), 0);
610610
lndt << QPointF(pixmap.width(), 0);
611611
// add buttons
612-
LagrangeCheck = new QCheckBox("Lagrange?", statusbar);
612+
LagrangeCheck = new QCheckBox("Akima?", statusbar);
613613
statusbar->addPermanentWidget(LagrangeCheck);
614614
EqualAreaCheck = new QCheckBox("Equal Area?", statusbar);
615615
statusbar->addPermanentWidget(EqualAreaCheck);
@@ -746,9 +746,10 @@ DeWarping:: EqualAreaMode()
746746
void
747747
DeWarping:: transform()
748748
{
749-
int i, n, y, x, w, h, ih, id, ic;
749+
int i, n, y, x, w, h, ih, id;
750+
// int ic; // InterpolateLagrangePolynomial
750751
float yh, yd, dyh, dyd, yk0, yk1, yk2, oy;
751-
QPolygonF lni;
752+
// QPolygonF lni; // InterpolateLagrangePolynomial
752753
n = lnh.count();
753754
if (n > 4)
754755
{
@@ -780,6 +781,7 @@ DeWarping:: transform()
780781
}
781782
if (flagrange)
782783
{
784+
/* // InterpolateLagrangePolynomial
783785
lni.clear();
784786
ic = (ih < 3) ? 3 : (ih > n - 3) ? (n - 3) : ih;
785787
for (i = ic - 2; i < ic + 2; i++)
@@ -792,21 +794,17 @@ DeWarping:: transform()
792794
yd = InterpolateLagrangePolynomial (x, lni);
793795
yh = (yh < 1.0f) ? 1.0f : ((yh < h - 1) ? yh : (h - 1));
794796
yd = (yd < 1.0f) ? 1.0f : ((yd < h - 1) ? yd : (h - 1));
797+
*/
798+
yh = InterpolateAkima (x, lnh);
799+
yd = InterpolateAkima (x, lnd);
800+
yh = (yh < 1.0f) ? 1.0f : ((yh < h - 1) ? yh : (h - 1));
801+
yd = (yd < 1.0f) ? 1.0f : ((yd < h - 1) ? yd : (h - 1));
795802
}
796803
else
797804
{
798805
yh = (float)lnh[ih - 1].y() + dyh * (x - lnh[ih - 1].x());
799806
yd = (float)lnd[id - 1].y() + dyd * (x - lnd[id - 1].x());
800807
}
801-
/*
802-
if (yh < yd)
803-
{
804-
yh += yd;
805-
yh *= 0.5f;
806-
yh += 0.5f;
807-
yd = yh - 1.0f;
808-
}
809-
*/
810808
yk0 = yd / ylnd;
811809
yk1 = (yh - yd) / (ylnh - ylnd);
812810
yk2 = (h - yh) / (h - ylnh);
@@ -1123,6 +1121,73 @@ float InterpolateLagrangePolynomial (float x, QPolygonF p)
11231121
return lagrange_pol;
11241122
}
11251123

1124+
float InterpolateAkima (float x, QPolygonF p)
1125+
{
1126+
int i, k, l, n = p.count();
1127+
float xt, dx, dy, a, b, fx, val, m[5], t[2];
1128+
1129+
k = 0;
1130+
dx = (p[n - 1].x() - p[0].x()) / n;
1131+
for (i = 1; i < (n - 1); i++)
1132+
{
1133+
xt = p[i].x();
1134+
k = (xt < x) ? i : k;
1135+
}
1136+
if (k < 2)
1137+
{
1138+
for (i = (2 - k); i < 5; i++)
1139+
{
1140+
l = k + i - 2;
1141+
dx = p[l + 1].x() - p[l].x();
1142+
dy = p[l + 1].y() - p[l].y();
1143+
m[i] = (dx > 0.0f) ? (dy / dx) : 0.0f;
1144+
}
1145+
for (i = (1 - k); i >= 0; i--)
1146+
{
1147+
m[i] = 2.0f * m[i + 1] - m[i + 2];
1148+
}
1149+
}
1150+
else
1151+
{
1152+
if (k > (n - 4))
1153+
{
1154+
for (i = 0; i < (n - k + 1); i++)
1155+
{
1156+
l = k + i - 2;
1157+
dx = p[l + 1].x() - p[l].x();
1158+
dy = p[l + 1].y() - p[l].y();
1159+
m[i] = (dx > 0.0f) ? (dy / dx) : 0.0f;
1160+
}
1161+
for (i = (n - k + 1); i < 5; i++)
1162+
{
1163+
m[i] = 2.0f * m[i - 1] - m[i - 2];
1164+
}
1165+
}
1166+
else
1167+
{
1168+
for (i = 0; i < 5; i++)
1169+
{
1170+
l = k + i - 2;
1171+
dx = p[l + 1].x() - p[l].x();
1172+
dy = p[l + 1].y() - p[l].y();
1173+
m[i] = (dx > 0.0f) ? (dy / dx) : 0.0f;
1174+
}
1175+
}
1176+
}
1177+
for(i = 0; i < 2; i++)
1178+
{
1179+
a = (m[i + 2] > m[i + 3]) ? (m[i + 2] - m[i + 3]) : (m[i + 3] - m[i + 2]);
1180+
b = (m[i] > m[i + 1]) ? (m[i] - m[i + 1]) : (m[i + 1] - m[i]);
1181+
t[i] = ((a + b) > 0) ? ((a * m[i + 1] + b * m[i + 2]) / (a + b)) : (0.5f * (m[i + 1] + m[i + 2]));
1182+
}
1183+
dx = x - p[k].x();
1184+
dy = p[k + 1].x() - p[k].x();
1185+
fx = (dy > 0.0f) ? (dx / dy) : 0.0f;
1186+
val = p[k].y() + t[0] * dx + (3.0f * m[2] - 2.0f * t[0] - t[1]) * dx * fx + (t[0] + t[1] - 2.0f * m[2]) * dx * fx * fx;
1187+
1188+
return val;
1189+
}
1190+
11261191
QRgb InterpolateBiCubic (QImage img, float y, float x)
11271192
{
11281193
int i, d, dn, xi, yi, xf, yf;

src/transform.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ void calcArc(QPointF center, QPointF from, QPointF to, QPointF through,
199199
float &start, float &span);
200200
float calcArea(QPolygonF p);
201201
float InterpolateLagrangePolynomial (float x, QPolygonF p);
202+
float InterpolateAkima (float x, QPolygonF p);
202203
QRgb InterpolateBiCubic (QImage img, float y, float x);
203204
// transformation end
204205

0 commit comments

Comments
 (0)