{"id":20812230,"url":"https://github.com/curegit/eqlm","last_synced_at":"2026-02-17T16:03:00.985Z","repository":{"id":227055879,"uuid":"755583317","full_name":"curegit/eqlm","owner":"curegit","description":"A CLI tool to manipulate images in various ways","archived":false,"fork":false,"pushed_at":"2026-01-26T11:37:33.000Z","size":71745,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-27T01:20:19.282Z","etag":null,"topics":["brightness","color-space","convolution-filter","histogram-matching","image-manipulation","image-processing","lightness","opencv"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/eqlm/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/curegit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-10T16:49:54.000Z","updated_at":"2026-01-26T07:32:52.000Z","dependencies_parsed_at":"2024-03-11T11:49:52.981Z","dependency_job_id":"93f83c4b-1f68-480d-818a-240976e8009c","html_url":"https://github.com/curegit/eqlm","commit_stats":null,"previous_names":["curegit/eqbr","curegit/eqlm"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/curegit/eqlm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Feqlm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Feqlm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Feqlm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Feqlm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/curegit","download_url":"https://codeload.github.com/curegit/eqlm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Feqlm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29549225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T14:33:00.708Z","status":"ssl_error","status_checked_at":"2026-02-17T14:32:58.657Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brightness","color-space","convolution-filter","histogram-matching","image-manipulation","image-processing","lightness","opencv"],"created_at":"2024-11-17T20:51:22.987Z","updated_at":"2026-02-17T16:03:00.980Z","avatar_url":"https://github.com/curegit.png","language":"Python","readme":"# Eqlm\n\nA CLI tool to manipulate images in various ways\n\n## Installation\n\n```sh\npip install eqlm\n```\n\n### With Clipboard Support\n\n```sh\npip install eqlm[clipboard]\n```\n\nNote that clipboard support varies depending on your OS.\n\n## Examples\n\n### `$ eqlm eq images/macaron.jpg -n 3 2 -t 0.8 -c`\n\n| Source                             | Result                                   |\n| ---------------------------------- | ---------------------------------------- |\n| ![Input Image](images/macaron.jpg) | ![Output Image](images/macaron-eqlm.png) |\n\n### `$ eqlm eq images/mayuno.jpg -n 16 2 -t 0.7 -c -i makima`\n\n| Source                            | Result                                  |\n| --------------------------------- | --------------------------------------- |\n| ![Input Image](images/mayuno.jpg) | ![Output Image](images/mayuno-eqlm.jpg) |\n\n### `$ eqlm eq images/yaesu-wall.jpg -m lightness -t 0.9 -n 9 6`\n\n| Source                                | Result                                      |\n| ------------------------------------- | ------------------------------------------- |\n| ![Input Image](images/yaesu-wall.jpg) | ![Output Image](images/yaesu-wall-eqlm.jpg) |\n\n### `$ eqlm eq images/hakone.jpg -m saturation -t 0.2 --clamp`\n\n| Source                            | Result                                  |\n| --------------------------------- | --------------------------------------- |\n| ![Input Image](images/hakone.jpg) | ![Output Image](images/hakone-eqlm.jpg) |\n\n### `$ eqlm laps images/mayuno-eqlm.jpg -c 0.3`\n\n| Source                                 | Result                                  |\n| -------------------------------------- | --------------------------------------- |\n| ![Input Image](images/mayuno-eqlm.jpg) | ![Output Image](images/mayuno-laps.jpg) |\n\n### `$ eqlm desc images/halftone.png`\n\n| Source                              | Result                                    |\n| ----------------------------------- | ----------------------------------------- |\n| ![Input Image](images/halftone.png) | ![Output Image](images/halftone-desc.png) |\n\n## Commands\n\nThe main program can be invoked either through the `eqlm` command or through the Python main module option `python3 -m eqlm`.\nEach operation is implemented as a subcommand shown below.\n\n### Eq\n\nSpatially equalize image lightness, saturation, or brightness\n\n```txt\nusage: eqlm eq [-h] [-m {l,brightness,saturation,lightness}] [-n M N]\n               [-i {linear,cubic,akima,makima}] [-t RATE] [-c] [-e] [-u]\n               [-g [GAMMA]] [-d {8,16}] [-s] [-x]\n               IN_FILE [OUT_FILE]\n\nEqualize image lightness, saturation, or brightness\n\npositional arguments:\n  IN_FILE               input image file path (use '-' for stdin, '_' for\n                        clipboard)\n  OUT_FILE              output PNG image file path (use '-' for stdout, '_'\n                        for clipboard) (default: AutoUnique)\n\noptions:\n  -h, --help            show this help message and exit\n  -m, --mode {l,brightness,saturation,lightness}\n                        processing mode (l: L (LAB), brightness: Brightness\n                        (HSV), saturation: Saturation (HSV), lightness:\n                        Lightness (HLS)) (default: l)\n  -n, --divide M N      divide image into MxN (Horizontal x Vertical) blocks\n                        for aggregation (default: (2, 2))\n  -i, --interpolation {linear,cubic,akima,makima}\n                        interpolation method (linear: Linear, cubic:\n                        CubicSpline, akima: AkimaSpline, makima:\n                        ModifiedAkimaSpline) (default: linear)\n  -t, --target RATE     set the target rate for the output level, ranging from\n                        0.0 (minimum) to 1.0 (maximum) (default: Average)\n  -c, --clamp           clamp the level values in extrapolated boundaries\n                        (default: False)\n  -e, --median          aggregate each block using median instead of mean\n                        (default: False)\n  -u, --unweighted      disable weighting based on the alpha channel (default:\n                        False)\n  -g, --gamma [GAMMA]   apply inverse gamma correction before the process\n                        [GAMMA=2.2] (default: None)\n  -d, --depth {8,16}    bit depth of the output PNG image (default: 8)\n  -s, --slow            use the highest PNG compression level (default: False)\n  -x, --no-orientation  ignore the Exif orientation metadata (default: False)\n\n'--' can be used to terminate option parsing, so that remaining arguments are\ntreated as positional arguments.\n```\n\n### Match\n\nMatch histogram of source image to reference image\n\n```txt\nusage: eqlm match [-h]\n                  [-m {rgb,red,green,blue,lab,ab,l,brightness,saturation,lightness}]\n                  [-a SOURCE REFERENCE | -u] [-g [GAMMA]] [-d {8,16}] [-s]\n                  [-x]\n                  SOURCE_FILE REFERENCE_FILE [OUT_FILE]\n\nMatch histogram of source image to reference image\n\npositional arguments:\n  SOURCE_FILE           source image file path (use '-' for stdin, '_' for\n                        clipboard)\n  REFERENCE_FILE        reference image file path (use '-' for stdin, '_' for\n                        clipboard)\n  OUT_FILE              output PNG image file path (use '-' for stdout, '_'\n                        for clipboard) (default: AutoUnique)\n\noptions:\n  -h, --help            show this help message and exit\n  -m, --mode {rgb,red,green,blue,lab,ab,l,brightness,saturation,lightness}\n                        processing mode (rgb: RGB, red: Red (RGB), green:\n                        Green (RGB), blue: Blue (RGB), lab: LAB, ab: AB (LAB),\n                        l: L (LAB), brightness: Brightness (HSV), saturation:\n                        Saturation (HSV), lightness: Lightness (HLS))\n                        (default: rgb)\n  -a, --alpha SOURCE REFERENCE\n                        cutout threshold for the alpha channel (source,\n                        reference) (default: (0.0, 0.5))\n  -u, --unweighted      disable cutout based on the alpha channel (default:\n                        False)\n  -g, --gamma [GAMMA]   apply inverse gamma correction before the process\n                        [GAMMA=2.2] (default: None)\n  -d, --depth {8,16}    bit depth of the output PNG image (default: 8)\n  -s, --slow            use the highest PNG compression level (default: False)\n  -x, --no-orientation  ignore the Exif orientation metadata (default: False)\n\n'--' can be used to terminate option parsing, so that remaining arguments are\ntreated as positional arguments.\n```\n\n### Laps\n\nSharpen an image using a Laplacian variant kernel\n\n```txt\nusage: eqlm laps [-h] [-m {rgb,red,green,blue,lab,ab,l}]\n                 [-t {basic5,basic9,diagonal,oonopuri,patrakarttunen}] [-c C]\n                 [-a] [-g [GAMMA]] [-d {8,16}] [-s] [-x]\n                 IN_FILE [OUT_FILE]\n\nSharpen an image using a Laplacian variant kernel\n\npositional arguments:\n  IN_FILE               input image file path (use '-' for stdin, '_' for\n                        clipboard)\n  OUT_FILE              output PNG image file path (use '-' for stdout, '_'\n                        for clipboard) (default: AutoUnique)\n\noptions:\n  -h, --help            show this help message and exit\n  -m, --mode {rgb,red,green,blue,lab,ab,l}\n                        processing channel mode (rgb: RGB, red: Red (RGB),\n                        green: Green (RGB), blue: Blue (RGB), lab: LAB, ab: AB\n                        (LAB), l: L (LAB)) (default: rgb)\n  -t, --stencil {basic5,basic9,diagonal,oonopuri,patrakarttunen}\n                        kernel selection (basic5: typical 4-neighbor kernel,\n                        basic9: typical 8-neighbor kernel, diagonal:\n                        4-diagonal-neighbor kernel, oonopuri: Oono-Puri\n                        isotropic kernel, reduced overall error,\n                        patrakarttunen: Patra-Karttunen isotropic kernel,\n                        optimized for rotational invariance) (default:\n                        oonopuri)\n  -c, --coef C          sharpening factor (default: 0.2)\n  -a, --include-alpha   also sharpen the alpha channel (default: False)\n  -g, --gamma [GAMMA]   apply inverse gamma correction before the process\n                        [GAMMA=2.2] (default: None)\n  -d, --depth {8,16}    bit depth of the output PNG image (default: 8)\n  -s, --slow            use the highest PNG compression level (default: False)\n  -x, --no-orientation  ignore the Exif orientation metadata (default: False)\n\n'--' can be used to terminate option parsing, so that remaining arguments are\ntreated as positional arguments.\n```\n\n### Desc\n\nDescreen a scanned image using a Fourier Transform-based method\n\n```txt\nusage: eqlm desc [-h] [--cmyk | --no-cmyk] [--nl-means | --no-nl-means]\n                 [-g [GAMMA]] [-s] [-x]\n                 IN_FILE [OUT_FILE]\n\nFourier Transform-based descreening for scanned images\n\npositional arguments:\n  IN_FILE               input image file path (use '-' for stdin, '_' for\n                        clipboard)\n  OUT_FILE              output PNG image file path (use '-' for stdout, '_'\n                        for clipboard) (default: AutoUnique)\n\noptions:\n  -h, --help            show this help message and exit\n  --cmyk, --no-cmyk     switch to perform descreening in CMYK color space\n                        (default: False)\n  --nl-means, --no-nl-means\n                        switch to apply Non-Local Means denoising after\n                        descreening (default: True)\n  -g, --gamma [GAMMA]   apply inverse gamma correction before the process\n                        [GAMMA=2.2] (default: None)\n  -s, --slow            use the highest PNG compression level (default: False)\n  -x, --no-orientation  ignore the Exif orientation metadata (default: False)\n\n'--' can be used to terminate option parsing, so that remaining arguments are\ntreated as positional arguments.\n```\n\n## License\n\nGNU Affero General Public License v3.0 or later\n\nCopyright (C) 2025 curegit\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License along with this program.\nIf not, see \u003chttps://www.gnu.org/licenses/\u003e.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuregit%2Feqlm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcuregit%2Feqlm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuregit%2Feqlm/lists"}