- Notifications
You must be signed in to change notification settings - Fork33
Scriptable desktop app to correct the perspective of images
License
ad-si/Perspec
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
App and workflow to perspectively correct images.For example whiteboards, document scans, or facades.
- App Workflow
- Installation
- Usage via CLI
- Photo Digitization Workflow
- Features
- Algorithms
- Technologies
- Related
Step | Description | Result |
---|---|---|
1 | Take photos | ![]() |
2 | Open Perspec app | ![]() |
3 | Drop the images onto the window | ![]() |
4 | Mark the corners by clicking on them | ![]() |
5 | Click one of the save buttons (or [Enter]) | ![]() |
WARNING:Perspec currently only works on macOS and Linux.Any help to make it work onMicrosoft(Ticket)would be greatly appreciated!
You can get this (and previous) versions fromthe releases page.
The current nightly version can be downloaded fromhttps://github.com/feramhq/Perspec/actions.However, it's necessary to fix the file permissions after download:
chmod +x \ ./Perspec.app/Contents/MacOS/Perspec \ ./Perspec.app/Contents/Resources/{perspec,script,imagemagick/bin/magick}
On macOS you can also install it via thisHomebrew tap:
brew install --cask ad-si/tap/perspec
Build it from source with Haskell'sstack.
Platypus, withcommand line tools enabled, is required to build from source.
git clone https://github.com/feramhq/Perspeccd Perspecmake install
This copies thePerspec.app
to your/Applications
directoryand makes theperspec
command available on your path.You can then either drop images on the app window,or use it via the CLI likeperspec fix image.jpeg
It's also possible to directly invoke Perspec via the CLI like so:
/Applications/Perspec.app/Contents/Resources/perspec fix path/to/image.jpeg
You can also pass several images and they will all be openedone after another.This is very useful for batch correcting a large set of images.
- Take photos
- Use camera app which lets you lock rotation (e.g.OpenCamera).Otherwise check out the guide below to fix rotation.
- Use a sound activated camera to take photos simplyby clicking your tongue or snipping your finger. E.g. with:
- Pluto Trigger - Hardware device
- Magic Lantern - 3rd party firmware for Canon
- iSoundCam - Android app
- Use
perspec rename
sub-command to fix order and names of scanned files. - Verify that
- All pages were captured and have the correct filename
- Images are sharp enough
- Images have a high contrast
- Images have correct orientation
- For best image quality convert images optionallyto a lossless format (e.g.
png
),apply rotations, and convert them to grayscale.Attention: Exclude the covers!mogrify -verbose -format png \ -auto-orient -colorspace gray photos/*.jpeg
- Use Perspec to crop images
perspec fix photos/*.png
Improve colors with one of the following steps:
- Normalize dynamic range:
mogrify -verbose -normalize photos/*.png
- Convert to black and white:
#! /usr/bin/env bashfind. -iname"*.png"| \whileread -r filedo magick \ -verbose \"$file" \\( +clone -blur 0x60 -brightness-contrast 40\) \ -compose minus \ -composite \ -negate \ -auto-threshold otsu \"$(basename"$file"".png")"-fixed.pngdone
In order to rotate all photos to portrait mode you can use either
mogrify -verbose -auto-orient -rotate"90>" photos/*.jpeg
or
mogrify -verbose -auto-orient -rotate"-90>" photos/*.jpeg
- Rescale image on viewport change
- Handle JPEG rotation
- Draw lines between corners to simplify guessing of clipped corners
- Bundle Imagemagick
- Better error if wrong file format is dropped (images/error-message.jpg)
- Center Perspec window on screen
- Drag'n'Drop for corner markers
- "Submit" button
- "Convert to Grayscale" button
- Add support for custom output size (e.g. A4)
- Manual rotation buttons
- Zoom view for corners
- Label corner markers
Once the corners are marked, the correction is equivalent to:
magick \ images/example.jpg \ -distort Perspective \'8,35 0,0 27,73 0,66 90,72 63,66 67,10 63,0' \ -crop 63x66+0+0 \ images/example-fixed.jpg
Converts image to grayscale and normalizes the range of values afterwards.(Uses Imagemagick's-colorspace gray -normalize
)
Converts image to binary format with OTSU's method.(Uses Imagemagick's-auto-threshold OTSU -monochrome
)
Perspec automatically interpolates missing parts by using the closest pixel.(https://www.imagemagick.org/Usage/misc/#edge)
- Core is written inHaskell
- Perspective transformation are handled byImageMagick
- App bundle is created withPlatypus
- Hasscan - OpenCV document scanner in Haskell.
Check outad-si/awesome-scanningfor an extensive list of related projects.
About
Scriptable desktop app to correct the perspective of images