satyarth / pixelsort Goto Github PK
View Code? Open in Web Editor NEWPixel sorting images in python.
License: MIT License
Pixel sorting images in python.
License: MIT License
$ python3 pixelsort.py -a 90 examples/file.png
Interval function: threshold
Lower threshold: 0.25
Upper threshold: 0.8
Randomness: 0 %
Opening image...
Converting to RGBA...
Rotating image...
Getting data...
Getting pixels...
Determining intervals...
Defining intervals...
Sorting pixels...
Placing pixels in output image...
Rotating output image back to original orientation...
Crop image to apropriate size...
Saving image...
Traceback (most recent call last):
File "pixelsort.py", line 56, in <module>
main()
File "pixelsort.py", line 50, in main
output_img.save(argparams.output_image_path)
File "/usr/lib/python3/dist-packages/PIL/Image.py", line 1646, in save
self.load()
File "/usr/lib/python3/dist-packages/PIL/Image.py", line 1961, in load
self.im = self.im.crop(self.__crop)
TypeError: integer argument expected, got float
I get the following error when trying to use the mask on a rotated pixel sort image:
$ python3 pixelsort.py examples/image.jpg -i random -a 120 -c 20 -m examples/mask.png
Traceback (most recent call last):
File "pixelsort.py", line 81, in <module>
main(parse_args())
File "pixelsort.py", line 33, in main
pixels = get_pixels(data, mask, input_img.size)
File "pixelsort.py", line 62, in get_pixels
if not (mask and mask[x, y] == constants.black_pixel):
IndexError: image index out of range
After adding the following line:
mask = Image.open(args["mask"]).convert('RGBA').rotate(args["angle"], expand=True).load() if args["mask"] else None
I get the following image as I would expect:
I'll submit a PR with the fix unless you get to it before I do.
It appears that the manifest is missing at least one file necessary to build
from the sdist for version 1.0.1. You're in good company, about 5% of other
projects updated in the last year are also missing files.
+ /tmp/venv/bin/pip3 wheel --no-binary pixelsort -w /tmp/ext pixelsort==1.0.1
Looking in indexes: http://10.10.0.139:9191/root/pypi/+simple/
Collecting pixelsort==1.0.1
Downloading http://10.10.0.139:9191/root/pypi/%2Bf/86e/c9bbddb54a6ba/pixelsort-1.0.1.tar.gz (6.2 kB)
ERROR: Command errored out with exit status 1:
command: /tmp/venv/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-wheel-rdx7czpx/pixelsort/setup.py'"'"'; __file__='"'"'/tmp/pip-wheel-rdx7czpx/pixelsort/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-wheel-rdx7czpx/pixelsort/pip-egg-info
cwd: /tmp/pip-wheel-rdx7czpx/pixelsort/
Complete output (5 lines):
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-wheel-rdx7czpx/pixelsort/setup.py", line 6, in <module>
with open('requirements.txt') as fh:
FileNotFoundError: [Errno 2] No such file or directory: 'requirements.txt'
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
This is a feature request to add "curvy" pixel sorting options.
For some examples, austinhein_1 on Reddit has some posts that show the effect here and here.
In theory this should be simple to do but there are many details that might be a bit subtle. There's also the question of how to specify the curves which I don't have a good idea of what people should expect.
However the curve is specified, walk along the curve in the original image, filling in an array of pixels, then pixel sort as normal, providing the same threshold and sorting option as before.
The subtlety comes in doing sub pixel sampling and knowing how to sample and realize the pixels in the destination image.
Maybe I'm overthinking it and forcing the curve to only pick a single pixel at any given point, ignoring aliasing effects, is reasonable.
I can think of a few different methods:
There might be some subtlety here with curves needing to be non-constant width when sorting pixels, because it might be hard to find "stacked" curves that only need on pixel.
Anyway, I'm not exactly sure how to implement this but it would be a cool feature.
The README lists only 5 real interval functions, but a sixth interval function file_edges
is defined in interval.py
. Is this a discrepancy in the README or is this a vestigial function? This is probably more of a question for @satyarth.
When using your program with the option -a 90
, the first column of pixels is always completely transparent. This is not observed when this argument is not present (i.e. horizontal mode).
Hello!
If i try to run the script i get the following:
pixelsort.py:43: SyntaxWarning: "is not" with a literal. Did you mean "!="?
if args["angle"] is not 0:
It doesn't stop the script from doing its job, though
Python version: 3.8.0
While trying to use the angle
parameter, I've noticed that the pixels don't all stay together in the original dimensions during the sorting:
While experimenting with pixelsort, I found that some sorting methods (-s) produce very similar results. Intensity is very similar to lightness, but it is actually different' so it's not too bad. maximum
is much worse.
On all images I've tried, maximum
produced identical output to lightness
(default). This is easiest to observe if you run the app with none
interval method, because it always behaves the same:
python3 pixelsort.py image.jpg -o test.png -i none -s maximum
python3 pixelsort.py image.jpg -o test.png -i none
Digging into it, I read the Wikipedia article on HSV colorspace. "Lightness" sorting method actually returns the "value" of HSV colorspace. "maximum" sorting method of the app takes max(pixel[0], pixel[1], pixel[2]). But how is "lightness" defined in HSV ?
"In the HSV "hexcone" model, value is defined as the largest component of a color, our M above"
https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
What is "M" ?
M = max(R, G, B)
https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma
So, unless I'm missing something, maximum
and lightness
look identical to me because they are identical, to the point of having the same definition!
I'm getting SyntaxError
s when trying to run the examples with the latest build (953a38c):
$ python3 pixelsort.py examples/image.jpg -i random -c 20
Traceback (most recent call last):
File "pixelsort.py", line 6, in <module>
from argparams import parse_args, verify_args
File "/home/abe/git/github/satyarth/pixelsort/argparams.py", line 88
logging.info(f"Interval function: {args['interval_function']}")
^
SyntaxError: invalid syntax
It looks like spurious f
s got inserted on various lines from 88 to 100.
Removing those extra characters and I can run the example files.
A pull request will follow unless you get to it before me.
For sake of testing this, I'm trying to sort this image:
Using this external interval file:
The operation:
λ python pixelsort.py "pclips/pclips.png" -of pclips -a 45 -f "pclips/mask.png" -i file
Returns the following:
Interval function: file
Randomness: 0 %
Opening image...
Converting to RGBA...
Rotating image...
Getting data...
Getting pixels...
Determining intervals...
Cleaning up edges...
Traceback (most recent call last):
File "pixelsort.py", line 56, in <module>
main()
File "pixelsort.py", line 31, in main
intervals = argparams.interval_function(pixels, argparams)
File "C:\Users\justi\Code\pixelsort\interval.py", line 117, in file_mask
if file_pixels[y][x] == constants.black_pixel and file_pixels[y][x - 1] == constants.black_pixel:
IndexError: list index out of range
I have also tested this on couple other bitmap mask files -- is there something I'm missing? Black pixels too close to the edge?
Hi
I got an error
$ python36 pixelsort.py test.png
Interval function: threshold
Lower threshold: 0.25
Upper threshold: 0.8
Randomness: 0 %
Opening image...
Converting to RGBA...
Rotating image...
Getting data...
Getting pixels...
Determining intervals...
Defining intervals...
Traceback (most recent call last):
File "pixelsort.py", line 56, in <module>
main()
File "pixelsort.py", line 31, in main
intervals = argparams.interval_function(pixels, argparams)
File "/home/clone/repos/pixelsort/interval.py", line 60, in threshold
if util.lightness(pixels[y][x]) < args.bottom_threshold or util.lightness(pixels[y][x]) > args.upper_threshold:
File "/home/clone/repos/pixelsort/util.py", line 11, in lightness
return rgb_to_hsv(pixel[0], pixel[1], pixel[2])[2] / 255.0 # For backwards compatibility with python2
TypeError: 'int' object is not subscriptable
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.