You can use MeshFunctions to do the trick:
g = BSplineFunction[{RandomReal[1, 20], RandomReal[1, 20]}\[Transpose]];
dg = g';
ParametricPlot[
g[t], {t, 0, 1},
MeshFunctions -> Function[{x, y, t}, dg[t].{0, 1}],
Mesh -> {{0}},
MeshStyle -> Directive[AbsolutePointSize[5], Red]
]

Here the MeshFunctions specifies the value of dg[t].{0, 1}, i.e. the $y$ component of the tangential vector of $g(t)$ at $t$, is used to generate mesh levels. Then Mesh -> {{0}} specifies that we only draw meshes where dg[t].{0, 1} == 0, which is exactly the extrema of $g(t)$.
To tell maxima from minima, use the RegionFunction:
maximapart = ParametricPlot[
g[t], {t, 0, 1},
PlotStyle -> Lighter[Blue, .6],
RegionFunction -> Function[{x, y, t}, g''[t].{0, 1} < 0],
MeshFunctions -> Function[{x, y, t}, dg[t].{0, 1}],
Mesh -> {{0}},
MeshStyle -> Directive[AbsolutePointSize[5], Red]
]
minimapart = ParametricPlot[
g[t], {t, 0, 1},
PlotStyle -> Lighter[Brown, .6],
RegionFunction -> Function[{x, y, t}, g''[t].{0, 1} > 0],
MeshFunctions -> Function[{x, y, t}, dg[t].{0, 1}],
Mesh -> {{0}},
MeshStyle -> Directive[AbsolutePointSize[5], Blue]
]
Show[{maximapart, minimapart}]

Extracting the points is straightforward:
maximaptSet = Cases[maximapart, GraphicsComplex[pt_, __] :> pt, ∞][[1]];
maximaIdx = Cases[maximapart, Point[pt_] :> pt, ∞][[1]];
maximaptSet[[maximaIdx]]
minimaptSet = Cases[minimapart, GraphicsComplex[pt_, __] :> pt, ∞][[1]];
minimaIdx = Cases[minimapart, Point[pt_] :> pt, ∞][[1]];
minimaptSet[[minimaIdx]]
dat = GaussianRandomField[nn = 32] // Chop; dat /= Max[dat]; dat *= nn/2; dat2 = Table[{i, j, dat[[i, j]]}, {i, nn}, {j, nn}]; bs = BSplineFunction[dat2]; dbs = Function[{u, v}, Sqrt[Derivative[1, 0][bs][u, v][[3]]^2 + Derivative[0, 1][bs][u, v][[3]]^2] // Evaluate]; ParametricPlot3D[bs[u, v], {u, 0, 1}, {v, 0, 1}, MeshFunctions -> Function[{x, y, z, u, v}, dbs[u, v]], MeshStyle -> Directive[AbsolutePointSize[Small], Red], Mesh -> {{0}}]– chris Apr 21 '14 at 20:13MeshFunctionsdetects the mesh when the surface crosses the specific mesh value. So it can detect a mesh value $a$ like $f(x<a)<0\land f(x>a)>0$, but may be theoretically impossible to detect one like $f(x\neq a)>0$, which is the case in your code. So I think you'll have to rephrase yourMeshFunctionsin a "cross-value" manner. – Silvia Apr 22 '14 at 09:07MeshFunctions. Maybe you can draw mesh lines of $f=0$ and $g=0$ separately and find the cross of them. – Silvia Apr 22 '14 at 09:55FindAllCrossings2D). – chris Apr 22 '14 at 10:03