====== Batch processing of images with GIMP ======
I had a set of many scanned images from magazine pages, the sizes were varying and I wanted to apply the GIMP **erode filter** to enhance the text readability. Generally for image batch processing I use **Imagemagick** from the command line, but I was not able to reproduce the erode filter with Imagemagick, so I searched the recipe to do **batch processing** with the GIMP.
===== The plug-in-erode filter =====
You can apply the erode filter in GIMP from menu //Filters// => //Generic// => //Erode//. There is no dialog box to control the filter parameters, but it turned out that when you want to call the **plug-in-erode** function from a script you have to pass several parameters.
To inspect the required parameters go to menu //Filters// => //Script-Fu// => //Console// => //Browse//. Here you are into the **Script-Fu Procedure Browser** and you can search for the **plug-in-erode** procedure. For each parameter you have the type (e.g. float or integer) and a brief description:
* run-mode
* image
* drawable
* propagate-mode
* propagating-channel
* propagating-rate
* direction-mask
* lower-limit
* upper-limit
It is not simple to have an explanation of each paramter, so I proceeded by trials. It turned out that the wanted result is obtaiuned by passing //propagate-mode// = //O:white//. I set to zero the other parameters too.
===== Creating a script to call plug-in-erode =====
The next step was to create a script which will simply call the plug-in, this is the file that I saved as **simple-myerode.scm**:
(define (simple-myerode
filename
propagate-mode
propagating-channel
propagating-rate
direction-mask
lower-limit
upper-limit)
(let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
(drawable (car (gimp-image-get-active-layer image))))
(plug-in-erode RUN-NONINTERACTIVE
image drawable propagate-mode propagating-channel
propagating-rate direction-mask lower-limit upper-limit)
(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
(gimp-image-delete image)))
Copy the script into the **$HOME/.config/GIMP/2.10/scripts/** directory, no particular action is required to enable it.
===== Call the script from the command line =====
Now it is possibile to execute the GIMP in batch mode, using the **%%-b%%** option. Calling the custom function ''simple-myerode'' you can pass the paramteres:
#!/bin/bash
gimp -i -b "(simple-myerode \"IMAGE.JPG\" 0 0 0 0 0 0)" -b '(gimp-quit 0)'
===== Combining Imagemagick and GIMP =====
The final recipe works as follow:
* Enlarge the image at 250% with Imagemagick. This proved to be the best choice to enhance the text readability via the erode filter. This is because the erode filter works by adding a single pixel around the dark parts.
* Apply the GIMP erode filter.
* Use Imagemagick to apply the **%%-unsharp%%** filter. Resize to the original size and crop/resize the image to a fixed size, even if the input image is slightly wider or narrower. Force the resolution to 200 dpi ignoring that of the original image.
This is the full script, which **receives the filename** to be processed and saves the output file into the **./outdir/** directory:
#!/bin/bash
BASENAME="$(basename "$1")"
TMP="tmp.$$.png"
convert "$1" -scale '250%' "$TMP"
cp -p simple-myerode.scm /home/niccolo/.config/GIMP/2.10/scripts/
gimp -i -b "(simple-myerode \"$TMP\" 0 0 0 0 0 0)" -b '(gimp-quit 0)'
convert "$TMP" -unsharp '0x3+1.0+0' \
-scale 'x2000' -gravity center -crop '1400:2000' \
-background white -extent '1400x2000' -density 200 -units PixelsPerInch \
-quality 90 \
"./outdir/$BASENAME"
rm "$TMP"