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:

Code: Select all

-format %[fx:(1-mean)*100]\n
You might need quotes:

Code: Select all

-format "%[fx:(1-mean)*100]\n"
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.