I'm trying to produce turbulent swirling effects in an image using Curl Noise. The idea is you start off with some random field (usually Perlin noise) and use the curl of this field to displace the pixels of the image. If you iterate this process you should expect to see pixels smeared over lots of small vortices.
This page has a nice demonstration at the top with particles instead of pixels.
For the noise, I've used a random field generator from this answer but with a ParetoDistribution to make more speckled noise than Gaussian.
I want to animate this effect, but unfortunately ListLineIntegralConvolutionPlot is far too slow to produce enough frames in a reasonable amount of time.
Remove["Global`*"]; SeedRandom[1]; (* Taken from GaussianRandomField - but takes a custom distribution *) RandomField[dist_, size : (_Integer?Positive) : 256, dim : (_Integer?Positive) : 2, Pk_ : Function[k, k^-3]] := Module[{Pkn, fftIndgen, noise, amplitude, s2}, Pkn = Compile[{{vec, _Real, 1}}, With[{nrm = Norm[vec]}, If[nrm == 0, 0, Sqrt[Pk[nrm]]]], CompilationOptions -> {"InlineExternalDefinitions" -> True}]; s2 = Quotient[size, 2]; fftIndgen = ArrayPad[Range[0, s2], {0, s2 - 1}, "ReflectedNegation"]; noise = Fourier[RandomVariate[dist, ConstantArray[size, dim]]]; amplitude = Outer[Pkn[{##}] &, Sequence @@ ConstantArray[N@fftIndgen, dim]]; InverseFourier[noise*amplitude]] img = ExampleData[{"TestImage", "Peppers"}]; (* A Pareto distribution gives us more specks than Gaussian *) noise = ImageAdjust@ Image@Abs@Chop@RandomField[ParetoDistribution[.01, 4.0], 128]; (* Resize and filter it down a bit to smooth out *) noise = Nest[GaussianFilter[#, 2] &, ImageResize[noise, ImageDimensions@img], 5] (* Compute derivatives and curl image *) {dx, dy} = DerivativeFilter[noise, {{1, 0}, {0, 1}}, 2]; curl = ColorCombine[{dy, ImageMultiply[dx, -1]}]; (* Do the convolution *) ListLineIntegralConvolutionPlot[{ImageData@curl, img}, RasterSize -> 256] 

