Very nice post! Thanks for sharing!
Another way of doing this is by using the GradientOrientationFilter:
{binspec,count}=HistogramList[Flatten@ImageData@GradientOrientationFilter[img,40,Method->{"DerivativeKernel"->"Gaussian"}],100];
data={MovingAverage[N@binspec,2]~Join~(Pi+MovingAverage[N@binspec,2]),count~Join~count};
ListPolarPlot[data//Transpose,PlotRange->All, AspectRatio -> Automatic,PolarAxes -> {True, False}]
with img being the painting by Remington, and 40 being a length scale, gives:

Another way would be to use DerivativeFilter, but I guess that will give a similar result.