Page 1 of 1
Extracr B&W ratio in order to "target" images
Posted: 2019-03-22T13:37:50-07:00
by SteelMassimo
Hello everyone!
I need to "target" some images in order to batch convert them with the following code (made with fmw42's amazing guidance):
Code: Select all
convert 0001.jpg -type Grayscale -threshold 35% -define connected-components:area-threshold=3 -define connected-components:mean-color=true -connected-components 8 0001.jpg
If I apply it on some images on the folder, it will eliminate a lot of information. Fortunately, I'm fairly confident the images I'm targeting for this command line actually have a lot more black than the rest.
I though of thresholding the whole folder, extract the ratio, filter the ratio interval that corresponds to the images I'm targeting, and them applying the code only for those.
I'm struggling with the "info:" output. Any tips?
IM version: 7.0.8-27-Q16-x64
OS: Windows 7 Pro 64-bits.
Version date: 2019-01-27.
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-22T16:40:16-07:00
by fmw42
You are going to have to show some of these images that do not work so we can see what is happening. Show both your input and output. It is likely that you will have to adjust the threshold and perhaps the area-threshold.
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-25T07:07:24-07:00
by SteelMassimo
Here's the target image:
https://drive.google.com/open?id=1wQN8Q ... e36w3RdaVO
And these are the ones I'm trying to preserve:
https://drive.google.com/open?id=1xlyE5 ... Si-3Jok393
https://drive.google.com/open?id=1vmJvP ... 6wEVAu5IPg
Here's the histogram data:
Code: Select all
Range target.jpg preserve1.jpg preserve2.jpg
0-240 non-White px 367029 306392 285048
241-255 White px 1867195 1931716 1952908
% of n-White 16,43% 13,69% 12,74%
If I can determine the ratio of white and non-white pixels, I think I'll be able to make a pretty good "target" on the whole folder with a batch file. Since there are thousands of images like those to separate, batch processing seems the way to go.
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-25T07:40:40-07:00
by SteelMassimo
@fmw42 The input and output are on this folder
https://drive.google.com/drive/folders/ ... sp=sharing:
And here is the code applied:
Code: Select all
convert 0108_example.jpg -type Grayscale -threshold 35% -define connected-components:area-threshold=3 -define connected-components:mean-color=true -connected-components 8 0108_example_b.jpg
convert 0131_example.jpg -type Grayscale -threshold 35% -define connected-components:area-threshold=3 -define connected-components:mean-color=true -connected-components 8 0131_example_b.jpg
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-25T09:18:52-07:00
by snibgo
IM can calculate those numbers, eg:
Code: Select all
magick target_bw.jpg -threshold %[fx:240/255*100]% -format %[fx:(1-mean)*100] info:
16.4276
This is the percentage of pixels that are non-white, where 240/255 is the cut-off for "white".
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-25T10:48:00-07:00
by SteelMassimo
Hey @snibgo!
This is exactly what I need to filter the images.
I applied like this:
Code: Select all
magick *.jpg -threshold %[fx:240/255*100]% -format %[fx:(1-mean)*100] info: >list.txt
So that all the information was transfered to a .txt file, but the spacing was all wrong:
Code: Select all
19.308218.20919.348718.994419.587417.671919.83718.648818.839418.72919.037618.445219.019418.887719.434417.96818.982119.142514.594913.510313.943212.279412.677812.379712.5871...
When ideally it would be more like this:
Code: Select all
19.3082
18.209
19.3487
18.9944
19.5874
17.6719
19.837
18.6488
18.8394
18.729
19.0376
18.4452
19.0194
18.8877
19.4344
17.968
18.9821
19.1425
14.5949
13.5103
13.9432
12.2794
12.6778
12.3797
12.5871
The cut-off percentages for the images I'm targeting is anything above 17.5%.
Is there a way for the output information on the .txt file to be formated like that?
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-25T11:13:34-07:00
by snibgo
Insert \n at the end of the format:
You might need quotes:
You can make the fx expression more complex, eg to output "1" if the percentage is at least 17.5, otherwise "0":
Code: Select all
-format "%[fx:(1-mean)*100]>=17.5?1:0\n"
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-26T12:39:58-07:00
by SteelMassimo
@snibgo
Worked like a charm. Thanks for the help guys!
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-26T12:50:43-07:00
by fmw42
I believe snibgo has a typo and that this
Code: Select all
-format "%[fx:(1-mean)*100]>=17.5?1:0\n"
should actually be
Code: Select all
-format "%[fx:(1-mean)*100>=17.5?1:0]\n"
I believe that quotes are needed in Unix-like environments.
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-26T13:00:08-07:00
by snibgo
Thanks for the correction, Fred.
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-26T17:11:11-07:00
by anthony
For UNIX I would use single quotes.
Otherwise '\' in '\n' may get removed, though as the shell did not understand '\n' it probably didn't remove it.
In shell (and more (non-DOS) languages), single quotes means 'literal' or don't do anything... While double quotes means handle '$' variable substitutions and then that needs backslash escapes (for '\$' handling).
See IM examples...
Escaping Escapes
http://www.imagemagick.org/Usage/text/#escaping_escapes
To Quote or backslash
http://www.imagemagick.org/Usage/draw/#text
Though this is more about quoting within the -draw operator argument.
Re: Extracr B&W ratio in order to "target" images
Posted: 2019-03-26T17:19:26-07:00
by fmw42
I have generally use double quotes on my Mac scripts with no issues with \n and when I need $variable in an expression.