Detecting out-of-focus images?
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Detecting out-of-focus images?
I'm working with photo data and need to split the images into two sets: focused and unfocused.
Without getting into complications like depth of field where images can have some regions focused and others non-focused... just keeping it simple and assuming the entire image is unfocused due to either poor settings, bad lighting, motion, or other reasons...
is there any one-liner type command that can be run with identify or any simple test that can be hacked together with convert to detect which images are sharp and which are not?
Without getting into complications like depth of field where images can have some regions focused and others non-focused... just keeping it simple and assuming the entire image is unfocused due to either poor settings, bad lighting, motion, or other reasons...
is there any one-liner type command that can be run with identify or any simple test that can be hacked together with convert to detect which images are sharp and which are not?
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Detecting out-of-focus images?
A measure for out-of-focus is local standard deviation (SD). This measures contrast over a small area, such as every 15x15 pixel square. Then we find the largest SD across the entire image. This ranges from 0.0 (image is a total blur) to 0.5 (some part of the image is highly sharp).
To show the point, we repeat with a slightly blurred input:
As expected, the maximum SD is lower.
Then you need to decide on a threshold for "in focus" or "out of focus". If you have samples in each category, find the maximum SDs and they will probably show you the cutoff.
If you have many large images, this will be slow. You might first resize them all to be smaller. Or use a technique such as Integral images.
Code: Select all
f:\web\im>%IMG7%magick toes.png -statistic StandardDeviation 15x15 -format %[fx:
maxima] info:
0.250858
Code: Select all
f:\web\im>%IMG7%magick toes.png -blur 0x1 -statistic StandardDeviation 15x15 -fo
rmat %[fx:maxima] info:
0.239658
Then you need to decide on a threshold for "in focus" or "out of focus". If you have samples in each category, find the maximum SDs and they will probably show you the cutoff.
If you have many large images, this will be slow. You might first resize them all to be smaller. Or use a technique such as Integral images.
snibgo's IM pages: im.snibgo.com
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Wow that is a very nice web page! Great work.
Thanks for the reply. I'm trying it out, with some hiccups so far.
Tried your command and got this:
Playing around with quotes around the format argument in case those got stripped off by the board here, but no luck yet.
My exact command line was:
Version: ImageMagick 7.0.7-39 Q16 x86_64 2018-06-11 https://www.imagemagick.org
Copyright: © 1999-2018 ImageMagick Studio LLC
License: https://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
Thanks for the reply. I'm trying it out, with some hiccups so far.
Tried your command and got this:
Code: Select all
magick: unable to open image 'maxima]': No such file or directory @ error/blob.c/OpenBlob/3457.
My exact command line was:
Code: Select all
for n in *.jpg; do magick $n -statistic StandardDeviation 15x15 -format %[fx: maxima] info:; done
Copyright: © 1999-2018 ImageMagick Studio LLC
License: https://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Oh I see what it was; I had an extra space before "maxima".
Wow yes it is slow! But a great thing to start with, thanks!
Wow yes it is slow! But a great thing to start with, thanks!
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Running on some test images:
I sort of wish the values were farther apart, but the difference seems clear. I will try out different thresholds.
Also I assume playing with the 15x15 value might help.
Maybe there's a way to tweak the -format so I won't need the extra echo "' on each invocation... Will look into that.
And finally with more work maybe cropping out sample regions of each image and submitting only the sample regions for evaluation as a way to speed this up... unless anyone has better ideas.
Thanks again!
Code: Select all
$ cd blurry/
sagaraga :blurry$ for n in *.jpg; do magick $n -statistic StandardDeviation 15x15 -format %[fx:maxima] info:; echo ""; done
0.360601
0.374182
0.385077
0.347387
0.302251
sagaraga :blurry$ cd ../non_blurry/
sagaraga :non_blurry$ for n in *.jpg; do magick $n -statistic StandardDeviation 15x15 -format %[fx:maxima] info:; echo ""; done
0.449119
0.427832
0.457877
0.429221
0.441047
Also I assume playing with the 15x15 value might help.
Maybe there's a way to tweak the -format so I won't need the extra echo "' on each invocation... Will look into that.
And finally with more work maybe cropping out sample regions of each image and submitting only the sample regions for evaluation as a way to speed this up... unless anyone has better ideas.
Thanks again!
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Detecting out-of-focus images?
add \n to %[fx:maxima] so that you get (with quotes on Unix-like systems)
That should avoid needing the extra echo. It makes the output on a new line for each image
Code: Select all
"%[fx:maxima]\n"
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Also I am going to chew on that other technique you documented in that web page. Integral images. Looks promising but the challenge for me will be to boil it down to a script that returns a single comparable value (or maybe it's not hard... haven't tackled the whole page yet, it looks a bit past my level, but we'll see if I can figure something out... and to be straight about it, I'll just say, if you have any suggestions on that front I'm all ears!).
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Code: Select all
"%[fx:maxima]\n"
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Detecting out-of-focus images?
15x15 is a decent window for web-sized images, eg 600x600, or resized to 600x600. For large inputs such as 7000x5000 a larger window will be more appropriate (but will take forever, using "-statistic").
Using integral images gives a massive performance boost, but needs a rebuild of IM.
Windowed mean and standard deviation surveys different methods of finding windowed SD. IM's "-statistic" is the slowest; I show improvements of a factor of 1000.
Details, details shows methods for finding where detail is in an image, and these can easily be extended to find whether an image has detail.
Using integral images gives a massive performance boost, but needs a rebuild of IM.
Windowed mean and standard deviation surveys different methods of finding windowed SD. IM's "-statistic" is the slowest; I show improvements of a factor of 1000.
Details, details shows methods for finding where detail is in an image, and these can easily be extended to find whether an image has detail.
snibgo's IM pages: im.snibgo.com
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Is there a build time switch or setting for enabling integral images then? I don't normally tackle building IM but I could give it a shot. Running a beta OS (macOS Mojave) at the moment so I could have some problems but I could try.
Haven't looked at the new links yet but looking forward to that soon.
Haven't looked at the new links yet but looking forward to that soon.
-
- Posts: 12159
- Joined: 2010-01-23T23:01:33-07:00
- Authentication code: 1151
- Location: England, UK
Re: Detecting out-of-focus images?
No. To incorporate integral images, or any of my process modules, download my source code from my Process modules page into the "filters" subdirectory and re-build IM.taxisaga wrote:Is there a build time switch or setting for enabling integral images then?
Building IM on Windows is easy. It's harder on a Mac because the delegates have to be done first. See posts by fmw42 on the topic.
snibgo's IM pages: im.snibgo.com
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Detecting out-of-focus images?
I believe the post to which snibgo is referring is viewtopic.php?f=1&t=29100
-
- Posts: 14
- Joined: 2018-07-10T11:13:28-07:00
- Authentication code: 1152
- Location: Sunnyvale, CA
Re: Detecting out-of-focus images?
Thanks! Maybe I'll try building when I'm feeling especially brave...