Page 1 of 1

Fax image processing (needs to be fast)

Posted: 2018-09-15T19:19:16-07:00
by adam7288
Hello! Thank you for the great information. There are some posts on the non-php side of things about processing photos for faxes. However they are in CLI format and also seems to be very resource intensive. As of now I have gone down two paths:

quantizeImage(2, Imagick::COLORSPACE_GRAY, 2, TRUE, FALSE)
This had good results for photos but text especially handwriting became thin and illegible

$max = $image->getQuantumRange();
$max = $max["quantumRangeLong"];
$image->thresholdImage(0.77 * $max);
This produces great results for documents, but photos look horrible. They mostly turn out black.

Anybody have any other suggestions? A fax has 1 bit color depth. Dithering is certainly an option.

Thank you in advance!

Re: Fax image processing (needs to be fast)

Posted: 2018-09-15T19:41:33-07:00
by fmw42
Try -monochrome


But I don't know if it is included with Imagick. Otherwise, you may be able to achieve that with dithering of a grayscale image then threshold it.

Re: Fax image processing (needs to be fast)

Posted: 2018-09-22T05:19:55-07:00
by adam7288
The monochrome operation is indeed fantastic. Do you know offhand if this is the kind of operation where throwing more cores at it would result in a faster running time? Is it threaded? Thanks in advance.

Re: Fax image processing (needs to be fast)

Posted: 2018-09-22T10:29:19-07:00
by fmw42
I do not know for sure, but I suspect it is multi-threaded.

If you have lots of cores, you may be better running simultaneous jobs with one thread for each core than trying to use multiple threads for a given task.

Re: Fax image processing (needs to be fast)

Posted: 2018-09-22T12:31:16-07:00
by snibgo
Yes, "-monochrome" is multi-threaded. Will it be much faster with lots of cores? That depends on many factors, including image size and the computer. We can test it with "-bench", for example:

Code: Select all

f:\web\im>%IMG7%magick -size 2000x2000 gradient:red-blue g.miff

f:\web\im>%IMG7%magick g.miff -bench 5 -monochrome NULL:
Performance[1]: 5i 0.232ips 1.000e 21.547u 0:21.562
Performance[2]: 5i 0.246ips 0.514e 25.453u 0:20.359
Performance[3]: 5i 0.255ips 0.523e 28.313u 0:19.641
Performance[4]: 5i 0.256ips 0.524e 31.906u 0:19.563
Performance[5]: 5i 0.251ips 0.520e 37.438u 0:19.906
Performance[6]: 5i 0.253ips 0.521e 40.469u 0:19.797
Performance[7]: 5i 0.259ips 0.527e 42.781u 0:19.328
Performance[8]: 5i 0.254ips 0.523e 44.703u 0:19.672
On my computer, which has 8 cores, this "-monochrome" runs fastest (most iterations per second) with 7 threads. But there is hardly any difference between 3 threads and 8 threads, and the best is only about 10% faster than single-threaded.

This is typical of the work I do, on my computer. Your mileage may vary.

Re: Fax image processing (needs to be fast)

Posted: 2018-09-22T22:24:36-07:00
by adam7288
Thank you - what cpu do you have exactly?

Re: Fax image processing (needs to be fast)

Posted: 2018-09-23T02:59:54-07:00
by snibgo
Intel Core i7-4700MQ CPU @ 2.40 GHz, running Windows 8.1.

For me, running "-monochrome" single-threaded on that g.miff takes about 3 seconds. Running 8 processes simultaneously, each single-threaded, takes about 6 seconds. When processing many images, eg video frames, this is the fastest method. But it takes more memory as we are reading 8 images into memory at the same time, so it needs caution.

Re: Fax image processing (needs to be fast)

Posted: 2018-09-23T11:13:48-07:00
by adam7288
What are your thoughts about true cores vs hyperthreaded cores? Your cpu only has 4 real cores. The hyperthreading I've read on average can speed up threaded applications roughly 10-15%. Is there a way to perform the benchmark with hyperthreading turned off or to account for which logical core being used is a real core?

Re: Fax image processing (needs to be fast)

Posted: 2018-09-23T12:44:14-07:00
by snibgo
Yes, I have four physical cores, each with two logical cores. As far as I know, IM can only see the eight logical cores, and can't switch off hyperthreading.

My laptop is five years old, and I'd need to play with more modern CPUs to judge where the sweet spot is (more physical cores versus more logical cores).

I haven't seen proper benchmarks of Windows versus different flavours of Unix, but this will also affect the efficacy of multithreading.