[HN Gopher] It's all a blur
___________________________________________________________________
It's all a blur
Author : zdw
Score : 333 points
Date : 2026-02-06 04:50 UTC (5 days ago)
(HTM) web link (lcamtuf.substack.com)
(TXT) w3m dump (lcamtuf.substack.com)
| cornhole wrote:
| reminds me of the guy who used the photoshop swirl effect to mask
| his face in csam he produced, who was found out when someone just
| undid the swirl
| Traubenfuchs wrote:
| https://www.bbc.com/news/world-us-canada-39411025
| lupire wrote:
| Action Lab just did a video on physical swirling vs mixing.
| Swirling is reversible.
| jszymborski wrote:
| This is the case I always think of when it comes to reversing
| image filters.
| praptak wrote:
| My (admittedly superficial) knowledge about blur reversibility is
| that an attacker may know what kind of stuff is behind the blur.
|
| I mean knowledge like "a human face, but the potential set of
| humans is known to the attacker" or even worse "a text, but the
| font is obvious from the unblurred part of the doc".
| jonathanlydall wrote:
| This was also my understanding.
|
| It's essentially like "cracking" a password when you have its
| hash and know the hashing algorithm. You don't have to know how
| to reverse the blur, you just need to know how to do it the
| normal way, you can then essentially brute force through all
| possible characters one at a time to see if it looks the same
| after applying the blur.
|
| Thinking about this, adding randomness to the blurring would
| likely help.
|
| Or far more simply, just mask the sensitive data with a single
| color which is impossible to reverse (for rasterized images,
| this is not a good idea for PDFs which tend to maintain the
| text "hidden" underneath).
| yetihehe wrote:
| > just mask the sensitive data with a single color which is
| impossible to reverse (for rasterized images, this is not a
| good idea for PDFs
|
| Also not a good idea for masking already compressed images of
| text, like jpg, because some of the information might bleed
| out in uncovered areas.
| johnmaguire wrote:
| Interesting - does a little extra coverage solve this or is
| it possible to use distant pixels to find the original?
| sebastianmestre wrote:
| yep, some padding fixes this
|
| JPEG compression can only move information at most 16px
| away, because it works on 8x8 pixel blocks, on a 2x down-
| sampled version of the chroma channels of the image (at
| least the most common form of it does)
| wheybags wrote:
| I'm not super familiar with the jpeg format, but iirc
| h.264 uses 16x16 blocks, so if jpeg is the same then
| padding of 16px on all sides would presumably block all
| possible information leakage?
|
| Except the size of the blocked section ofc. E.g If you
| know it's a person's name, from a fixed list of people,
| well "Huckleberry" and "Tom" are very different lengths.
| swiftcoder wrote:
| > mask the sensitive data with a single color which is
| impossible to reverse
|
| You note the pitfall of text remaining behind the redaction
| in PDFs (and other layered formats), but there are also
| pitfalls here around alpha channels. There have been several
| incidents where folks drew not-quite-opaque redaction blocks
| over their images.
| oulipo2 wrote:
| The parade is easy: just add a small amount of random noise
| (even not visible to the human eye) to the blurred picture, and
| suddenly the "blur inversion" fails spectacularly
| sebzim4500 wrote:
| Does this actually work? I would have thought that, given the
| deconvolution step is just a linear operator with reasonable
| coefficients, adding a small amount of noise to the blurred
| image would just add similarly small amount of noise to the
| unblurred result.
| srean wrote:
| To reconstruct the image one has to cut off those
| frequencies in the corrupted image where the signal to
| noise is poor. In many original images, the signal in high
| frequencies are sacrificable, so get rid of those and then
| invert.
|
| https://en.wikipedia.org/wiki/Wiener_deconvolution
|
| If one blindly inverts the linear blur transform then yes,
| the reconstruction would usually be a complete
| unrecognisable mess because the inverse operator is going
| to dramatically boost the noise as well.
| srean wrote:
| Encode the image as a boundary condition of a laminar flow and
| you can recover the original image from an observation.
|
| If, however, you observe after turbulence has set in, then some
| of the information has been lost, it's in the entropy now. How
| much, that depends on the turbulent flow.
|
| Don't miss out on this video by smarter every day
|
| https://youtu.be/j2_dJY_mIys?si=ArMd0C5UzbA8pmzI
|
| Treat the dynamics and time of evolution as your private key,
| laminar flow is a form of encryption.
| lupire wrote:
| If you encode code your data directly in the fluid, then
| turbulence becomes the statistical TTL on the data.
| dsego wrote:
| Can this be applied to camera shutter/motion blur, at low speeds
| the slight shake of the camera produces this type of blur. This
| is usually resolved with IBIS to stabilize the sensor.
| alphazard wrote:
| The ability to reverse is very dependent on the transformation
| being well known, in this case it is deterministic and known
| with certainty. Any algorithm to reverse motion blur will
| depend on the translation and rotation of the camera in
| physical space, and the best the algorithm could do will be
| limited by the uncertainty in estimating those values.
|
| If you apply a fake motion blur like in photoshop or after
| effects then that could probably be reversed pretty well.
| dizzant wrote:
| I recall a paper from many years ago (early 2010s) describing
| methods to estimate the camera motion and remove motion blur
| from blurry image contents only. I think they used a quality
| metric on the resulting "unblurred" image as a loss function
| for learning the effective motion estimate. This was before
| deep learning took off; certainly today's image models could
| do much better at assessing the quality of the unblurred
| image than a hand-crafted metric.
| yorwba wrote:
| Probably not the exact paper you have in mind, but...
| https://jspan.github.io/projects/text-deblurring/index.html
| johnmaguire wrote:
| Record gyro motion at time of shutter?
| crazygringo wrote:
| > _and the best the algorithm could do will be limited by the
| uncertainty in estimating those values_
|
| That's relatively easy if you're assuming simple translation
| and rotation (simple camera movement), as opposed to a
| squiggle movement or something (e.g. from vibration or being
| knocked). Because you can simply detect how much sharper the
| image gets, and hone in on the right values.
| jeremyscanvic wrote:
| The missing piece of the puzzle is how to determine the blur
| kernel from the blurry image. There's a whole body of
| literature on that that's called blind deblurring.
|
| For instance:
| https://deepinv.github.io/deepinv/auto_examples/blind-invers...
| crazygringo wrote:
| Absolutely, Photoshop has it:
|
| https://helpx.adobe.com/photoshop/using/reduce-camera-shake-...
|
| Or... from the note at the top, _had_ it? Very strange,
| features are almost never _removed_. I really wonder what the
| architectural reason was here.
| tracker1 wrote:
| Just guessing, patent troll.
| crazygringo wrote:
| Oof, I hope not. I wonder if the architecture for GPU
| filters migrated, and this feature didn't get enough usage
| to warrant being rewritten from scratch?
| tonymillion wrote:
| I believe Microsoft of all people solved this a while ago by
| using the gyroscope in a phone to produce a de-blur kernel that
| cleaned up the image.
|
| Its somewhere here: https://www.microsoft.com/en-
| us/research/product/computation...
| ryukoposting wrote:
| I wonder if the "night mode" on newer phone cameras is doing
| something similar. Take a long exposure, use the IMU to
| produce a kernel that tidies up the image post facto. The
| night mode on my S24 actually produces some fuzzy, noisy
| artifacts that aren't terribly different from the artifacts
| in the OP's deblurs.
| oulipo2 wrote:
| Those unblurring methods look "amazing" like that but they are
| just very fragile, add even a modicum of noise to the blurred
| image and the deblurring will almost certainly completely fail,
| this is well-known in signal-processing
| srean wrote:
| Not necessarily.
|
| If, however, one just blindly uses the (generalized)inverse of
| the point-spread function, then you are absolutely correct for
| the common point-spread functions that we encounter in practice
| (usually very poorly conditioned).
|
| One way to deal with this is to cut off those frequencies where
| the signal to noise in that frequency bin is poor. This however
| requires some knowledge about the spectrum of the noise and
| signal. Weiner filter uses that knowledge to work out an
| optimal filter.
|
| https://en.wikipedia.org/wiki/Wiener_deconvolution
|
| If one doesn't know about the statistics of the noise, not
| about the point-spread function, then it gets harder and you
| are in the territory of blind deconvolution.
|
| So just a word of warning, if you a relying only on sprinkling
| a little noise in blurred images to save yourself, you are on
| very, very dangerous ground.
| matsemann wrote:
| Did you see the part where he saved with more and more lossy
| compression and showed that it still was recoverable?
| derektank wrote:
| Captain Disillusion recently covered this subject in a more
| popular science format as well
|
| https://youtu.be/xDLxFGXuPEc
| lupire wrote:
| 8 months ago, for those of us who got excited by the idea of a
| "recent" new video from CD.
| derektank wrote:
| In my defense, that is quite literally the most recent full
| video the Captain has uploaded!
| swiftcoder wrote:
| One salient point not touched on here, is that an awful lot of
| the time, the things folks are blurring out specifically is text.
| And since we know an awful lot about what text ought to look
| like, we have a lot more information to guide the
| reconstruction...
| jlokier wrote:
| Good point, though you have to beware that text-aware image
| enhancement sometimes replaces characters with what it thinks
| is a more likely character from context.
|
| I've seen my phone camera's real-time viewfinder show text on a
| sign with one letter different from the real sign. If I wasn't
| looking at the sign at the same time, I might not have noticed
| the synthetic replacement.
| wffurr wrote:
| >> sometimes replaces characters with what it thinks is a
| more likely character from context
|
| Like the JBIG2 algorithm used in a zero click PDF-as-GIF
| exploit in iMessage a while back:
| https://projectzero.google/2021/12/a-deep-dive-into-nso-
| zero...
|
| The vulnerability of that algorithm to character-swapping
| caused incorrect invoices, incorrect measurements in
| blueprints, incorrect metering of medicine, etc.
| https://www.dkriesel.com/en/blog/2013/0802_xerox-
| workcentres...
| gwbas1c wrote:
| And older people are _very good_ at reading blurry text.
|
| (My grandmother always told me to "never get old." I wish I
| followed her advice.)
| jeremyscanvic wrote:
| Blur is perhaps surprisingly one of the degradations we know best
| how to undo. It's been studied extensively because there's just
| so many applications, for microscopes, telescopes, digital
| cameras. The usual tricks revolve around inverting blur kernels,
| and making educated guesses about what the blur kernel and
| underlying image might look like. My advisors and I were even
| able to train deep neural networks using only blurry images using
| a really mild assumption of approximate scale-invariance at the
| training dataset level [1].
|
| [1] https://ieeexplore.ieee.org/document/11370202
| dekhn wrote:
| I didn't learn about this trick (deconvolution) until grad
| school and even then it seemed like spooky mystery to me.
| criddell wrote:
| Isn't that roughly (ok, very roughly) how generative diffusion
| AIs work when you ask them to make an image?
| dangond wrote:
| I believe diffusion image models learn to model a reverse-
| noising function, rather than reverse-blurring.
| jeremyscanvic wrote:
| Most of them do but it's not mandatory and deblurring can
| be used [1]
|
| [1] Cold Diffusion: Inverting Arbitrary Image Transforms
| Without Noise, Bansal et al., NeurIPS 2023
| jeremyscanvic wrote:
| You're absolutely right! Diffusion models basically invert
| noise (random Gaussian samples that you add independently to
| every pixel) but they can also work with blur instead of
| noise.
|
| Generally when you're dealing with a blurry image you're
| gonna be able to reduce the strength of the blur up to a
| point but there's always some amount of information that's
| impossible to recover. At this point you have two choices,
| either you leave it a bit blurry and call it a day or you can
| introduce (hallucinate) information that's not there in the
| image. Diffusion models generate images by hallucinating
| information at every stage to have crisp images at the end
| but in many deblurring applications you prefer to stay
| faithful to what's actually there and you leave the tiny
| amount of blur left at the end.
| deaddodo wrote:
| Just to add to this: intentional/digital blur is even easier to
| undo as the source image is still mostly there. You just have
| to find the inverse metric.
|
| This is how one of the more notorious pedophiles[1] was
| caught[2].
|
| 1 - https://en.wikipedia.org/wiki/Christopher_Paul_Neil
|
| 2 - https://www.bbc.com/news/world-us-canada-39411025
| esafak wrote:
| This is classical deconvolution. Modern de-blurring
| implementations are DNN-based.
| jfaganel99 wrote:
| How do we apply this to geospatial face and licence plate blurs?
| unconed wrote:
| Sorry but this post is the blind leading the blind, pun intended.
| Allow me to explain, I have a DSP degree.
|
| The reason the filters used in the post are easily reversible is
| because none of them are binomial (i.e. the discrete equivalent
| of a gaussian blur). A binomial blur uses the coefficients of a
| row of Pascal's triangle, and thus is what you get when you
| repeatedly average each pixel with its neighbor (in 1D).
|
| When you do, the information at the Nyquist frequency is removed
| entirely, because a signal of the form "-1, +1, -1, +1, ..." ends
| up blurred _exactly_ into "0, 0, 0, 0...".
|
| All the other blur filters, in particular the moving average, are
| just poorly conceived. They filter out the middle frequencies the
| most, not the highest ones. It's equivalent to doing a bandpass
| filter and then subtracting that from the original image.
|
| Here's an interactive notebook that explains this in the context
| of time series. One important point is that the "look" that
| people associate with "scientific data series" is actually an
| artifact of moving averages. If a proper filter is used, the
| blurryness of the signal is evident.
| https://observablehq.com/d/a51954c61a72e1ef
| jszymborski wrote:
| > Sorry but this post is the blind leading the blind, pun
| intended. Allow me to explain, I have a DSP degree.
|
| FWIW, this does not read as constructive.
| Sesse__ wrote:
| It also makes no sense to me, and I also have a DSP degree.
| Of course moving averages (aka box blurs) filter out higher
| frequencies more than middle frequencies.
| yunnpp wrote:
| Interesting...I've used moving averages not thinking too hard
| about the underlying implications. Do you recommend any
| particular book or resource on DSP basics for the average
| programmer?
| jerf wrote:
| "In today's article, we'll build a _rudimentary_ blur algorithm
| and then pick it apart. "
|
| Emphasis mine. Quote from the beginning of the article.
|
| This isn't meant to be a textbook about blurring algorithms. It
| was supposed to be a demonstration of how what may seem
| destroyed to a causal viewer is recoverable by a simple
| process, intended to give the viewer some intuition that maybe
| blurring isn't such a good information destroyer after all.
|
| Your post kind of comes off like criticizing someone for
| showing how easy it is to crack a Caesar cipher for not using
| AES-256. But the whole point was to be accessible, and to
| introduce the idea that just because it looks unreadable
| doesn't mean it's not very easy to recover. No, it's not a
| mistake to be using the Caesar cipher for the initial
| introduction. Or a dead-simple one-dimensional blurring
| algorithm.
| the_fall wrote:
| If you have an endless pattern of ..., -1, 1, -1, 1, -1, 1, ...
| and run box blur with a window of 2 or 4, you get ..., 0, 0, 0,
| 0, 0, 0, ... too.
|
| Other than that, you're not wrong about theoretical Gaussian
| filters with infinite windows over infinite data, but this has
| little to do with the scenario in the article. That's about the
| information that leaks when you have a finite window with a
| discrete step and start at a well-defined boundary.
| chenmx wrote:
| What I find fascinating about blur is how computational
| photography has completely changed the game. Smartphone cameras
| now capture multiple exposures and computationally combine them,
| essentially solving the deblurring problem before it even
| happens. The irony is that we now have to add blur back
| artificially for portrait mode bokeh, which means we went from
| fighting blur to synthesizing it as a feature.
| zb3 wrote:
| Ok, what about gaussian blur?
| coldtea wrote:
| > _But then, it's not wrong to scratch your head. Blurring
| amounts to averaging the underlying pixel values. If you average
| two numbers, there's no way of knowing if you've started with 1 +
| 5 or 3 + 3. In both cases, the arithmetic mean is the same and
| the original information appears to be lost. So, is the advice
| wrong?_
|
| Well, if you have a large enough averaging window (like is the
| case with bluring letters) they have constraints (a fixed number
| of shapes) information for which is partly retained.
|
| Not very different from the information retained in minesweeper
| games.
| IshKebab wrote:
| In practice unblurring (deconvolution) doesn't really work as
| well as you'd hope because it is usually blind (you don't know
| the blur function), and it is ill-conditioned, so any small
| mistakes or noise get enormously amplified.
| tflinton wrote:
| I did my thesis on using medioni's tensor voting framework to
| reconstruct noisy, blurry, low-res and the like images. It was
| sponsored by USGS on a data set that I thought was a bit of a
| bizarre use case. The approach worked pretty well, with some
| reasonable success at doing "COMPUTER ENHANCE" type computer
| vision magic. Later on talking with my advisor about the
| bizarrely mundane and uninteresting data sets we were working on
| from the grant he quipped that "You built a reasonable way of
| unblurring and enhancing unreadable images, the military doesn't
| care about this mundane use case." It then occurred that i'd been
| wildly ignorant to what I just spent 2 years of my life on.
| bmandale wrote:
| > This nets us another original pixel value, img(8).
|
| This makes it all seem really too pat. In fact, this probably
| doesn't get us the original pixel value, because of quantizing
| deleting information when the blur was applied, which can never
| be recovered afterwards. We can at best get an approximation of
| the original value, which is rather obvious given that we can
| vaguely make out figures in a blurred image already.
|
| > Nevertheless, even with a large averaging window, fine detail
| -- including individual strands of hair -- could be recovered and
| is easy to discern.
|
| The reason for this is that he's demonstrating a box blur. A box
| blur is roughly equivalent to taking the frequency transform of
| the image, then multiplying it by a sort of decaying sin wave.
| This achieves a "blur" in that the lowest frequency is multiplied
| by 1 and hence is retained, and higher frequencies are
| attenuated. However, visually we can see that a box blur doesn't
| look very good, and importantly it doesn't necessarily attenuate
| the very highest frequencies by much more than far lower
| frequencies. Hence it isn't surprising that the highest
| frequencies can be recovered in good fidelity. Compare a gaussian
| blur, which is usually considered to look better, and whose
| frequency transform focuses all the attenuation at the highest
| frequencies. You would be far less able to recover individual
| strands of hair in an image that was gaussian blurred.
|
| > Remarkably, the information "hidden" in the blurred images
| survives being saved in a lossy image format.
|
| Remarkable, maybe, but unsurprising if you understand that jpeg
| operates on basically the same frequency logic as described
| above. Specifically, it will be further attenuating and
| quantizing the highest frequencies of the image. Since the box
| blur has barely attenuated them already, this doesn't affect our
| ability to recover the image.
| mananaysiempre wrote:
| > You would be far less able to recover individual strands of
| hair in an image that was gaussian blurred.
|
| Frequency-domain deconvolution is frequency-domain
| deconvolution, right? It doesn't really matter what your kernel
| is.
| jkuli wrote:
| A simple solution is to use a system of linear equations. Each
| row of a matrix is a linear equation, Ax = b Each row contains
| kernel weightings A across the image X, B is the blurred pixel
| color. The full matrix would be a terabyte, so take advantage of
| the zeros and use an efficient solve for X instead of inversion.
|
| Enhance really refers to combining multiple images. (stacking)
| Each pixel in a low res image was a kernel over the same high res
| image. So undoing a 100 pixel blur is equivalent to combining
| 10,000 images for 100x super resolution.
| siofra wrote:
| Beautiful walkthrough. The key insight people miss is that "looks
| unreadable to humans" and "is information-theoretically
| destroyed" are very different bars. The blur looks opaque because
| our visual system is bad at detecting small per-pixel
| differences, but the math does not care about our perception.
|
| Same principle applies to other "looks safe" redactions --
| pixelation with small block sizes, partial masking of
| credentials, etc. If you can describe the transform as a linear
| operation, there is probably a pseudoinverse waiting to undo it.
___________________________________________________________________
(page generated 2026-02-11 23:00 UTC)