Here's fftshift(dht2(img)): https://i.imgur.com/EB6yIb4.png
Here's a hamming window: https://i.imgur.com/NsGKb0X.png
Here's a hamming window raised to power of 20: https://i.imgur.com/ejCviD7.png
Here's the result of multiplying that with the transformed image: https://i.imgur.com/trHdWZS.png
And here's dht(fftshift(that)): https://i.imgur.com/of4bvhv.png
Presto, blurry image. No symmetries required.
We can increase the blur factor by changing the power from 20 to 200: https://i.imgur.com/yqkR3qb.png
And 2000 (megablur): https://i.imgur.com/7h9patv.png
The code I used to blur:
def blur(img, factor):
x = dht2(img)
x = fftshift(x)
x = x * hamming(img) ** factor
x = fftshift(x)
x = dht2(x)
return x
There doesn't seem to be any limitations -- anything you can do with FFT, you can do here. And since the DHT isn't complex, you don't need to deal with phase/amplitude.It's kind of like working with wavelet coefficients in a jpg transform, except wavelets are a lot harder to work with compared to fft signals (which is why people use fft instead of wavelets everywhere). But dht is the best of both worlds -- all the power of fft, none of the hassle of complex values.