VIEW THIS AS

Auto mode follows the Route Engine until you choose a viewpoint.

YOU ARE HERE

ROUTE CHECK

CONNECTED TO

WHAT NEXT

Use the canonical route for this room, or HELP if you are unsure.

Why Mathematics? | Image Stitching, Homographies and Feature Matching

Why is mathematics important when a phone builds a panorama from several photographs? The camera does not know that two patches show the same window, tree or sign. Software must describe distinctive image locations, compare descriptions, reject coincidences, estimate a geometric transformation, warp coordinates and blend overlapping pixels. Image stitching is a chain of mathematical decisions.

The central transformation is often a homography: a 3×3 matrix that maps points between two views of the same plane, or between images made by a camera rotating about one centre under suitable assumptions. Homographies are powerful, but not universal. Parallax, moving subjects, exposure changes and lens distortion reveal where the model stops.


From overlapping photographs to one canvas

A simple panorama pipeline has several stages. Detect repeatable keypoints in each image. Compute a descriptor around each keypoint. Match descriptors between overlapping images. Estimate a transformation from the proposed correspondences. Warp one image into the other’s coordinate system. Choose a canvas, exposure adjustment, seam and blend. Validate the result.

Each stage has its own mathematics. Detection uses local intensity patterns and scale. Description turns a neighbourhood into a numeric vector or binary string. Matching uses distance or similarity. Transformation estimation uses linear algebra and optimisation. Warping uses functions and interpolation. Blending uses weights, frequency bands or energy minimisation.

The official OpenCV high-level Stitcher documentation distinguishes a homography model for photographic panoramas from an affine model suitable for some scans and specialised imagery. That choice is already modelling: the correct transformation family depends on how the images were produced.

Overlap is information

Two images can be joined only if they share enough scene content to constrain their relative geometry. A blank wall provides few distinctive correspondences. Repeating windows can create many ambiguous ones. Rich, stable texture gives stronger evidence.

More overlap is not automatically better. Very small camera motion can add little coverage, while extreme overlap may waste frames. The important concept is not a magic percentage but sufficient, well-distributed, reliable correspondence for the chosen model.

Stitching is not collage

A collage places pictures by manual or arbitrary rules. A geometric stitch attempts to make scene points agree in a common coordinate system. The panorama may still require artistic choices, but alignment has a testable claim: matched points should land near one another after transformation.

This is why residual errors matter. A beautiful blend can hide a bad geometric model, while a mathematically good alignment can look poor if exposure and seams are neglected.


A homography maps projective points

Represent an image point (x,y) using homogeneous coordinates p = (x,y,1)ᵀ. A homography H is a nonsingular 3×3 matrix. The mapped homogeneous point satisfies p′ ∼ Hp, where ∼ means equality up to a nonzero scale.

If Hp = (u,v,w)ᵀ and w is nonzero, convert back to ordinary coordinates with x′ = u/w and y′ = v/w. The division allows perspective effects: parallel lines in a plane can appear to converge in the image.

Why a 3×3 matrix has eight degrees of freedom

H contains nine entries, but multiplying every entry by the same nonzero scalar produces the same ordinary mapping because the final homogeneous scale cancels. One scale degree is therefore arbitrary, leaving eight independent degrees of freedom.

We may set h33 = 1 when that entry is safely nonzero, or normalise the matrix in another way. The choice fixes a representation, not the geometry itself.

Lines remain lines

A projective transformation maps lines to lines, although lengths, angles and parallelism are generally not preserved. That makes it appropriate for relating views of a plane under perspective projection. A photographed poster can look like a trapezium; a homography can map its corners to a rectangle.

Do not infer that all shapes are preserved. Circles can become general conics. Equal distances need not remain equal. Projective geometry preserves incidence—what lies on what—more fundamentally than Euclidean measurement.

Four point pairs are the minimum in general position

Each point correspondence supplies two independent coordinate equations. Eight degrees of freedom therefore require at least four point pairs. The points must not form a degenerate configuration such as all lying on one line.

Four pairs give an exact minimal solution in ideal arithmetic. Real image matches are noisy, so practical estimation usually uses more pairs and seeks a transformation that fits them well while resisting outliers.


From coordinates to linear equations

Let H have entries h11 through h33. For a source point (x,y) mapped to (x′,y′), homogeneous conversion gives x′ = (h11x+h12y+h13)/(h31x+h32y+h33) and y′ = (h21x+h22y+h23)/(h31x+h32y+h33).

Multiply through by the denominator. Each correspondence creates two equations linear in the unknown matrix entries when x, y, x′ and y′ are known. Stacking equations for many points creates a matrix problem commonly solved by a direct linear transform followed by refinement.

Normalisation improves conditioning

Pixel coordinates may be hundreds or thousands, while the homogeneous constant is 1. Poorly scaled coordinates can make numerical estimation sensitive to rounding. Translating points near the origin and scaling them to a comparable range before estimation can improve conditioning; the transformation is converted back afterward.

This is not cosmetic. Algebraically equivalent formulations can behave differently in finite-precision computation. Numerical mathematics asks not only “Is the equation correct?” but also “Is this representation stable?”

Least squares and geometric error differ

Solving the linear system minimises an algebraic quantity tied to the rearranged equations. The visually meaningful error is often a geometric reprojection distance in pixels. A refined estimate can minimise the sum of squared reprojection errors, possibly in both mapping directions.

The loss function defines what “best” means. A model that minimises one error measure need not minimise another.

Invertibility matters

A valid homography must be nonsingular. If its determinant is zero, it collapses the projective plane and has no inverse. Near-singular matrices can magnify noise severely in some regions.

Checking the determinant alone is insufficient; conditioning matters. A transformation can be mathematically invertible yet numerically fragile.


Feature matching turns appearance into correspondence

Images rarely arrive with labelled matching points. A feature detector searches for locations likely to be found again under moderate changes. Corners and textured blobs are useful because intensity changes in multiple directions. Long uniform edges are less distinctive along their length; flat regions are ambiguous everywhere.

A descriptor summarises the local neighbourhood. Some descriptors are real-valued vectors compared with Euclidean distance. Others are binary strings compared with Hamming distance. The distance is a proxy for appearance similarity, not proof that two points show the same physical scene location.

OpenCV’s feature matching and homography tutorial demonstrates detecting features, matching descriptors, estimating a homography and transforming object corners. Its pipeline makes the separation between appearance evidence and geometric verification explicit.

Nearest neighbour is only a proposal

For each descriptor in image A, find the closest descriptor in image B. If the scene contains repeated patterns, the nearest may still be wrong. A second-nearest comparison can reject ambiguous cases: accept a match only when the best distance is substantially smaller than the second best.

The ratio threshold is a heuristic whose suitable value depends on descriptor, data and cost of errors. It should be validated, not treated as a law of nature.

Mutual matching adds symmetry

Another check keeps a pair only if A’s best match in B points back to A as B’s best match. Mutual agreement can improve precision but reduce recall. That trade-off is common in information retrieval and classification: stricter rules remove false positives while losing some true cases.

Spatial distribution matters

Twenty matches clustered in one small corner constrain a global transformation less reliably than well-distributed matches across the overlap. Raw match count therefore is not a complete quality measure.

Plot the matches and examine coverage. Geometry has location, not just quantity.


RANSAC uses consensus to resist outliers

Random Sample Consensus, or RANSAC, repeatedly selects a minimal subset, estimates a model and counts how many correspondences agree within a chosen error threshold. The model with strong support is refined using its inliers.

This approach works because a small all-inlier sample can reveal the underlying model even when the full set contains bad matches. It does not guarantee success. Too many outliers, a poor threshold, repeated structures or multiple motions can defeat it.

The probability calculation

Suppose the inlier fraction is w, the minimal sample size is s and trials are independent. The probability that one random sample contains only inliers is w^s. The probability that N trials all miss an all-inlier sample is (1−w^s)^N. To achieve success probability p, choose N ≥ ln(1−p)/ln(1−w^s).

For homography estimation s=4. If w=0.5 and p=0.99, then w^s=0.0625 and N is at least about 72 trials. If w falls to 0.25, w^4 is only 0.003906, and the required number rises to about 1177. Outlier rate has a dramatic nonlinear effect.

Thresholds have units

An inlier threshold may be expressed in pixels of reprojection error. Resizing images changes the scale. A threshold suitable at one resolution may be too strict or too loose at another.

Always record the coordinate scale, error definition and threshold. A number without units and context cannot be reproduced meaningfully.

Consensus is not truth

A repeated pattern can create a large coherent set of wrong correspondences. RANSAC finds the model with consensus under its assumptions; it does not understand the scene. Validation should include plausibility, residual distribution, spatial coverage and visual inspection.


Worked example: a four-point homography

Map the unit square with corners (0,0), (1,0), (1,1), (0,1) to a quadrilateral with corners (0,0), (2,0), (3,1), (0,1). Consider H = [[2,0,0],[0,1,0],[0,1,1]]. We test rather than merely trust it.

For (0,0,1)ᵀ, Hp=(0,0,1)ᵀ, giving (0,0). For (1,0,1)ᵀ, Hp=(2,0,1)ᵀ, giving (2,0). For (1,1,1)ᵀ, Hp=(2,1,2)ᵀ, giving (1,0.5), so this proposed matrix does not map to the stated corner. The failed check is useful: it prevents a polished but wrong example.

Now use H = [[2,0,0],[0,1,0],[-1/3,0,1]]. The first two corners map to (0,0) and (3,0), not (2,0). Again, the target constraints expose the mismatch. Rather than guess a matrix, solve a simpler valid example deliberately.

A verified affine special case

Map the unit square to (1,2), (4,2), (5,4), (2,4). The transformation x′=3x+y+1 and y′=2y+2 is affine, represented by H = [[3,1,1],[0,2,2],[0,0,1]]. It is also a homography.

Check all corners. (0,0) maps to (1,2); (1,0) to (4,2); (1,1) to (5,4); and (0,1) to (2,4). The centre (0.5,0.5) maps to (3,3). Because the denominator stays 1, parallelism is preserved in this special case.

Why start with a special case

The example verifies homogeneous multiplication, coordinate conversion and corner constraints without cumbersome fractions. Students can then progress to a truly projective matrix with a nonconstant denominator.

For H = [[1,0,0],[0,1,0],[0.2,0,1]], the point (x,y) maps to (x/(0.2x+1), y/(0.2x+1)). Vertical lines remain lines, but horizontal scale changes with x. The denominator introduces perspective-like variation.


Worked example: reprojection error

Suppose a proposed transformation maps four source features to predicted points (101.2,80.4), (250.5,77.8), (248.7,199.6) and (99.4,202.0). Their observed matches are (101,80), (251,78), (249,200) and (100,202).

Euclidean reprojection errors are approximately 0.45, 0.54, 0.50 and 0.60 pixels. The root mean square error is √[(0.45²+0.54²+0.50²+0.60²)/4] ≈ 0.53 pixels.

A mean can hide structure

If three errors are 0.1 pixels and one is 2.0 pixels, the mean absolute error is 0.575 pixels—similar in scale—yet one location is badly aligned. Report a distribution, maximum or visual residual plot, not only one average.

Pixel error needs context

Half a pixel may be excellent for one application and inadequate for another. Image resolution, blur, viewing scale and downstream measurement determine significance. If the images were downsampled for estimation, convert errors back to the relevant coordinate scale before interpretation.

Symmetric transfer error

Forward error maps A to B. A symmetric measure can include mapping B back through H⁻¹ to A. This penalises transformations that look acceptable in one direction but behave poorly in the inverse.

Different metrics embody different priorities. State which one is used.


Warping asks an inverse question

After estimating H, software needs values for pixels on the output canvas. Forward mapping sends each source pixel to a destination location, which may leave holes or create overlaps. Inverse mapping visits each destination sample, maps it back to the source and interpolates a value.

If H maps source to destination, inverse warping uses H⁻¹. For each destination coordinate, compute the source coordinate, check whether it lies in bounds and sample the source image.

Interpolation estimates between samples

Nearest-neighbour interpolation chooses the closest source pixel and can look blocky. Bilinear interpolation uses four neighbours with weights based on fractional x and y positions. Bicubic methods use a wider neighbourhood and a cubic kernel.

Interpolation does not recover missing reality. It constructs values under a smoothness model. Repeated resampling can blur detail, so pipelines often compose transformations and resample once.

Canvas bounds require geometry

Warp the source image corners to estimate the output extent, then combine bounds with the reference image. Projective transformations can send directions toward infinity if the denominator approaches zero. Robust software checks validity before allocating an enormous canvas.

Rasterisation is the neighbouring problem

The related article Triangle Rasterisation, Barycentric Coordinates and Pixel Coverage explains how transformed geometry becomes discrete samples. Both topics connect continuous coordinates to a finite pixel grid, but they ask different coverage and interpolation questions.


Seams, exposure and blending

Even perfect geometric alignment can leave a visible seam if camera exposure, white balance, vignetting or scene illumination changed. Overlap may contain moving people, leaves or vehicles. A seam placed through inconsistent content creates ghosts or cut objects.

Simple feathering uses position-dependent weights that sum to one across the overlap. If image values are I1 and I2, output I = wI1+(1−w)I2. The weights change gradually, reducing a sharp boundary.

Weighted averages have assumptions

A blend between misaligned edges creates double edges. Averages cannot repair geometry. If brightness values are encoded nonlinearly, direct averaging may also differ from physically linear light mixing.

The broader lesson is to solve the right stage. Do not use smoothing to conceal a correspondence or motion problem.

Multiband blending separates scales

Low-frequency brightness differences may need gradual transitions, while high-frequency details need a narrower seam to remain sharp. Multiband blending decomposes images into spatial-frequency bands and blends each over a suitable scale.

This is a practical application of signal decomposition. Mathematics lets one operation behave differently on broad illumination and fine texture.

Seam finding is optimisation

A seam can be chosen to avoid strong differences or salient objects. Represent candidate locations as a grid or graph with costs, then search for a low-cost path. The “best” seam depends on the cost definition.

Optimisation does not remove judgement; it makes the objective explicit.


Parallax marks a model limit

A single homography aligns a planar scene viewed from different positions, or can describe a pure camera rotation under an appropriate camera model. If the camera translates while viewing objects at different depths, nearby and distant points shift by different amounts. This is parallax.

One global 3×3 matrix cannot generally align all depths. A building edge may match while a foreground railing doubles. The failure is not necessarily a bad optimiser; the model family may be wrong.

Rotation and translation are not interchangeable

Rotating a camera about its optical centre changes viewing direction without introducing translation-dependent depth parallax. Handheld capture often rotates around the photographer’s body, so the optical centre moves. Nearby scenes reveal the difference strongly.

The OpenCV homography tutorial warns that a simple rotating-camera stitching example illustrates the concept and is not a complete production panorama solution. Official documentation is valuable precisely when it states limits.

Local warps trade rigidity for flexibility

Mesh-based or spatially varying warps can fit parallax better by allowing different regions to transform differently. Greater flexibility can also bend straight structures or overfit unreliable matches. Regularisation penalises excessive distortion.

There is no free model. Flexibility reduces bias but can increase variance and artefacts.


Lens distortion and camera calibration

A pinhole model maps straight three-dimensional lines to straight image lines. Real lenses can cause radial distortion, making lines bow outward or inward. Tangential distortion arises from imperfect alignment. A homography alone does not describe these nonlinear effects globally.

Camera calibration estimates intrinsic parameters and distortion coefficients using known patterns or other evidence. Images can be undistorted before stitching, or distortion can be incorporated into a more complete model.

Focal length sets the projection scale

In pixel coordinates, focal length and principal point connect camera rays to the sensor grid. For a rotating panorama, converting pixels to rays, rotating rays and projecting them onto a cylinder or sphere can behave better than pretending every view belongs on one plane.

The LiDAR, Time of Flight and 3D Point Clouds article develops another coordinate pipeline in which calibration, frames and uncertainty determine whether measurements align.

Calibration is not forever

Zoom, focus, stabilisation, temperature and mechanical changes can affect camera parameters. A calibration belongs to a configuration and accuracy requirement. Reusing it blindly is another form of hidden assumption.


Failure cases are mathematically informative

A blue sky provides too little texture. A tiled facade provides too much repetition. Water and leaves change appearance. A person crossing the overlap violates the static-scene assumption. Strong exposure variation corrupts descriptor and blending behaviour. Narrow overlap weakens constraints.

Instead of labelling every failure “the AI got confused,” identify the violated mechanism. Was detection unstable? Were descriptors ambiguous? Did RANSAC select the wrong consensus? Was the homography family inadequate? Did warping magnify noise? Did blending hide or reveal motion?

Diagnostics beat mystery

Save visualisations of detected keypoints, raw matches, accepted inliers, residual vectors, warped outlines and overlap masks. A final panorama alone cannot identify where the chain broke.

This diagnostic habit transfers to algebra and science: inspect intermediate representations, not only the final answer.

Confidence should have reasons

Useful indicators include inlier count, inlier proportion, residual spread, spatial coverage, condition of the estimate and overlap area. No single threshold works for every scene.

A responsible system can decline to stitch when evidence is weak. “No result” is often better than a confident-looking false panorama.


More than two images create a network problem

With a sequence of images, estimating each adjacent pair independently can accumulate drift. A small rotation or scale error repeated across ten frames can leave the final horizon tilted or prevent the first and last views of a loop from meeting.

Represent images as nodes in a graph and reliable overlaps as edges. Pairwise matches propose relative transformations. A connected graph lets information propagate, while disconnected components cannot be placed together without new evidence.

Choose a reference frame

Every panorama needs a coordinate frame. Fixing one image removes global ambiguity: otherwise the entire solution can be transformed together without changing pairwise alignment. This is a gauge freedom, similar to choosing an origin on a number line.

The reference image also affects distortion distribution on a flat canvas. A middle view is often more balanced than an extreme end, but projection choice matters more in wide fields of view.

Bundle adjustment refines the whole system

Bundle adjustment jointly refines camera parameters and sometimes scene structure by minimising reprojection errors across many observations. In a panorama setting, it can adjust camera rotations and intrinsic parameters so that all overlaps agree better than a chain of independent pairwise fits.

The objective may be a sum of robust losses rather than plain squared errors. A robust loss grows more slowly for large residuals, reducing the influence of remaining mismatches without pretending they do not exist.

Sparsity makes large problems possible

Each observation links one feature to a small subset of parameters, so the optimisation matrix is sparse. Algorithms exploit this structure rather than treating every variable as connected to every other variable.

This is a recurring lesson in mathematics for computing: problem size alone does not determine difficulty. Structure—sparsity, locality, symmetry—can make a large calculation tractable.

Loop closure detects accumulated drift

If a capture sweeps through a full circle, the final image overlaps the first. That loop adds a constraint. A visible mismatch at closure signals accumulated error or an inadequate model.

Distributing correction across the sequence is preferable to hiding one large jump at the last seam. The same principle appears in robot mapping and survey networks.

Projection determines the final shape

A flat perspective canvas works for limited fields of view but stretches wide panoramas near the edges. Cylindrical projection maps rays onto a cylinder, preserving vertical lines under suitable capture while bending horizontal ones. Spherical projection supports very wide or full-view panoramas.

There is no projection that preserves every distance, angle and area from a sphere on a plane. Choosing a projection means choosing which distortions are acceptable for the viewing purpose.


Misconceptions worth correcting

Before correcting technical misconceptions, remember that stitching also changes how an image should be interpreted. Frames may be captured at different moments. A moving person can appear twice or vanish at a seam. Cropping and projection alter what remains visible. A panorama should not be presented as one instantaneous, distortion-free measurement unless the capture and processing support that claim.

Provenance supports responsible use

Record source filenames, capture order, timestamps when available, software settings and output projection. Preserve originals. If the panorama supports inspection, mapping or research, keep the match and residual diagnostics rather than only the flattened image.

Metadata does not guarantee authenticity, but it makes the processing chain auditable. Reproducibility is an ethical benefit of mathematical transparency.

Measurement needs calibration

A panorama can look spatially coherent without having a uniform metric scale. Perspective and projection mean that a pixel distance near one region may not represent the same world distance elsewhere. Measuring a facade or landscape requires calibrated geometry and a stated reference plane or three-dimensional model.

Adding a scale bar by eye is not enough. The scale must follow from verified control points or camera geometry.

Content-aware edits change the evidence

Some applications fill empty canvas regions, remove moving objects or select pixels from different frames. These edits may improve appearance while weakening the image as a record. A responsible caption can distinguish geometric stitching, exposure blending and generated or removed content.

This distinction connects mathematics to media literacy: a technically seamless image is not automatically a neutral document.

“Four matches guarantee a correct panorama”

Four non-degenerate exact correspondences determine a homography, but matches can be wrong and the scene may not satisfy one-homography assumptions.

“A homography is just rotation and scaling”

It includes translation, affine shear and projective effects. It generally does not preserve lengths, angles or parallel lines.

“More matches always improve the estimate”

More reliable, well-distributed inliers usually help. More outliers or repeated-pattern matches can make estimation worse.

“RANSAC removes every bad match”

It searches for consensus under a model and threshold. Coherent wrong structures or several motions can mislead it.

“Blending fixes alignment”

Blending can soften exposure seams. It cannot restore scene geometry lost through a wrong transformation.

“The panorama proves what the scene looked like”

A panorama is a constructed projection assembled from samples at different views and possibly times. Moving content and projection choice affect representation.


A student learning path

Stage 1: transform hand-drawn points

Use homogeneous coordinates to apply translation, scale, affine shear and a simple projective matrix. Divide by the third coordinate and check mapped lines.

Stage 2: solve a four-corner problem

Start with an affine parallelogram, then map a square to a trapezium using a solver or spreadsheet. Verify all four pairs and test interior points.

Stage 3: compare descriptors

Create small numeric or binary descriptors. Calculate Euclidean or Hamming distances. Show why the nearest candidate can still be ambiguous.

Stage 4: simulate outliers

Make a set of point pairs with several false correspondences. Fit using all points, then try repeated four-point samples and count inliers. Observe how consensus changes.

Stage 5: warp a grid

Apply inverse mapping to a checkerboard. Compare nearest-neighbour and bilinear interpolation. Inspect holes created by forward mapping.

Stage 6: document failure

Photograph a planar poster and a scene with a nearby object against a distant background. Explain why one homography fits the first better than the second.

Stage 7: report uncertainty

Give residual summaries, inlier maps and limitations. Avoid presenting a visually pleasing result as proof of metric accuracy.


For parents and teachers

Image stitching is a strong bridge between school mathematics and computing. Coordinates and matrices become visible. Ratios become homogeneous scaling. Probability enters RANSAC. Statistics enters residual analysis. Functions enter warping and interpolation.

Keep projects small enough that students can inspect every stage. Two images and ten hand-selected points can teach more than a one-click panorama of fifty frames. The objective is to understand the mechanism, not to outbuild a commercial camera app.

Questions that reveal understanding

  • Why are four point pairs the minimum for a general homography?
  • Which geometric properties survive a projective transformation?
  • Why can a nearest descriptor be wrong?
  • How does the RANSAC trial count change when the inlier fraction falls?
  • Why is inverse warping less likely to leave holes?
  • Which artefact indicates parallax rather than exposure mismatch?

Keep computing claims age-appropriate

Computer vision careers use mathematics, software engineering, experiments, domain knowledge and communication. A student who enjoys this topic can explore algebra, geometry, coding and visual design without treating one subject choice as a locked career promise.

The related guide Computer Vision, Convolution and Edge Detection explains how kernels detect local image change; stitching shows how local evidence supports a global geometric model.


Frequently asked questions

What is a homography in simple terms?

It is a projective mapping represented by a nonsingular 3×3 matrix. After homogeneous division, it maps points and lines between two projective planes.

Why does it need at least four matches?

A homography has eight independent degrees of freedom because overall matrix scale is arbitrary. Each point pair provides two independent equations, so four general-position pairs provide eight.

Does a homography work for every panorama?

No. It works well under specific geometric conditions, especially planar scenes or suitable rotating-camera capture. Translation with multiple depths creates parallax that one global homography cannot generally remove.

What does feature matching measure?

It compares numeric descriptions of local image appearance. Similarity proposes correspondence; geometric consistency tests whether proposals support a common transformation.

Why is RANSAC random?

Random minimal samples give repeated chances to choose only inliers. The required number of trials depends sharply on estimated inlier fraction, sample size and desired success probability.

Why do panoramas show ghosts?

Ghosts can arise from parallax, moving subjects, rolling-shutter effects or geometric misalignment. Blending overlapping but inconsistent content produces double structures.

Is image stitching “AI”?

It can be implemented with classical geometry and computer vision, learned features, or a mixture. Calling it AI does not explain the method. The valuable question is what representation, model, evidence and validation are used.


Useful next reading

Mathematics makes image stitching dependable because it separates appearance from geometry, minimal evidence from robust evidence, mapping from sampling and attractive output from verified alignment. The enduring benefit is learning to ask which transformation is justified, how residuals are measured and what a seamless-looking image still cannot prove.

Discover more from eduKate Singapore

Subscribe now to keep reading and get access to the full archive.

Continue reading