User:Eleanorg/1.2/Forbidden Pixels/extracting pixel colours: Difference between revisions
(Created page with "Aim: to break an image down into a list of each pixel's position & colour, so that it can be re-created with html & css. Each pixel becomes an area coloured with a #hex code; thu...") |
No edit summary |
||
(4 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
Question: how to write a script that will extract a grid of pixel colours from a given image? | Question: how to write a script that will extract a grid of pixel colours from a given image? | ||
==ImageMagick colour extraction== | |||
===Colour values for specific pixels=== | |||
Command syntax: convert imagename.png -format '%[pixel:p{xpos,ypos}]' info:- | Command syntax: convert imagename.png -format '%[pixel:p{xpos,ypos}]' info:- | ||
Returns the rgba value of the bottom right pixel in a 20x10 grid: | |||
<source lang="bash"> | <source lang="bash"> | ||
# convert 20by10PixelsSection1.png -format '%[pixel:p{20,10}]' info:- | # convert 20by10PixelsSection1.png -format '%[pixel:p{20,10}]' info:- | ||
rgba(135,161,160,1) | rgba(135,161,160,1) | ||
</source> | </source> | ||
===List of unique colours=== | |||
You can get a list of all the *unique* colours in an image thus. | |||
In my image of 200 pixels total, this line returns 167 unique colours: | |||
<source lang="bash"> | |||
# convert 20by10PixelsSection1.png -unique-colors -depth 16 txt:- | |||
# ImageMagick pixel enumeration: 168,1,65535,rgba | |||
0,0: (26471,33924,33410,65535) #676784848282 rgba(103,132,130,1) | |||
1,0: (26214,34438,34181,65535) #666686868585 rgba(40%,52.549%,52.1569%,1) | |||
2,0: (26985,34438,33924,65535) #696986868484 rgba(41.1765%,52.549%,51.7647%,1) | |||
3,0: (27499,34952,34438,65535) #6B6B88888686 rgba(41.9608%,53.3333%,52.549%,1) | |||
4,0: (26985,35209,34952,65535) #696989898888 rgba(41.1765%,53.7255%,53.3333%,1) | |||
5,0: (26985,35723,35466,65535) #69698B8B8A8A rgba(41.1765%,54.5098%,54.1176%,1) | |||
6,0: (28013,35466,34952,65535) #6D6D8A8A8888 rgba(42.7451%,54.1176%,53.3333%,1) | |||
7,0: (29298,36751,36237,65535) #72728F8F8D8D rgba(44.7059%,56.0784%,55.2941%,1) | |||
8,0: (29041,37265,37008,65535) #717191919090 rgba(44.3137%,56.8627%,56.4706%,1) | |||
9,0: (30583,38807,38550,65535) #777797979696 rgba(46.6667%,59.2157%,58.8235%,1) | |||
10,0: (31097,37779,37522,65535) #797993939292 rgba(47.451%,57.6471%,57.2549%,1) | |||
11,0: (31611,38293,38036,65535) #7B7B95959494 rgba(48.2353%,58.4314%,58.0392%,1) | |||
12,0: (30326,39064,38807,65535) #767698989797 rgba(46.2745%,59.6078%,59.2157%,1) | |||
13,0: (31868,39321,38807,65535) #7C7C99999797 rgba(48.6275%,60%,59.2157%,1) | |||
14,0: (32382,41120,40863,65535) #7E7EA0A09F9F rgba(49.4118%,62.7451%,62.3529%,1) | |||
#etc... | |||
</source> | |||
Instead of a text list you can output it as an image file, which is a row of pixels showing each unique colour: | |||
<source lang="bash"> | |||
convert 20by10PixelsSection1.png -unique-colors -scale 1000% unique_colors.gif | |||
</source> | |||
This is what you get: [[file:unique_pixels.png]] | |||
Kind of annoying that this only returns unique colours - so 167 out of 200 - but this could maybe be interesting too. A kind of 'condensation' of the essential elements. | |||
Still, try to figure out how to get the grid... is there an easier way than just typing this...? | |||
<source lang="bash"> | |||
# convert 20by10PixelsSection1.png -format '%[pixel:p{0,0}]' info:- | |||
rgba(135,161,160,1) | |||
# convert 20by10PixelsSection1.png -format '%[pixel:p{0,1}]' info:- | |||
rgba(135,161,160,1) | |||
# convert 20by10PixelsSection1.png -format '%[pixel:p{0,2}]' info:- | |||
rgba(135,161,160,1) | |||
</source> | |||
===Histograms of colour distribution=== | |||
Interesting other tools for 'analysing' images with imagemagick are discussed on [[http://www.imagemagick.org/Usage/quantize/#extract | this help page]]. Here's a way of making a little histogram image out of a picture with a reasonably small no. of unique colours: | |||
<source lang="bash"> | |||
convert rose: -colors 256 -format %c histogram:info:- | | |||
sed 's/:.*#/ #/' | | |||
while read count color colorname; do | |||
convert -size 1x$count xc:$color miff:- | |||
done | | |||
convert - -alpha set -gravity south -background none +append \ | |||
unique_color_histogram.png | |||
</source> | |||
...but can't get it to work. here's the error i get: | |||
<source lang="bash"> | |||
# ./histogram.sh | |||
convert: unable to open image `20by10PixelSection.jpg:': /usr/lib/ImageMagick-6.6.0/modules-Q16/coders/jpg:.la @ error/blob.c/OpenBlob/2489. | |||
convert: missing an image filename `histogram:info:-' @ error/convert.c/ConvertImageCommand/2940. | |||
convert: no decode delegate for this image format `/tmp/magick-XXarJlLN' @ error/constitute.c/ReadImage/533. | |||
convert: missing an image filename `unique_color_histogram.png' @ error/convert.c/ConvertImageCommand/2940 | |||
</source> | |||
hm. First, do it the hack way and just get a value for each individual pixel. |
Latest revision as of 15:20, 19 January 2012
Aim: to break an image down into a list of each pixel's position & colour, so that it can be re-created with html & css. Each pixel becomes an area coloured with a #hex code; thus manipulable - and no longer strictly part of an image. Question: how to write a script that will extract a grid of pixel colours from a given image?
ImageMagick colour extraction
Colour values for specific pixels
Command syntax: convert imagename.png -format '%[pixel:p{xpos,ypos}]' info:- Returns the rgba value of the bottom right pixel in a 20x10 grid:
# convert 20by10PixelsSection1.png -format '%[pixel:p{20,10}]' info:-
rgba(135,161,160,1)
List of unique colours
You can get a list of all the *unique* colours in an image thus. In my image of 200 pixels total, this line returns 167 unique colours:
# convert 20by10PixelsSection1.png -unique-colors -depth 16 txt:-
# ImageMagick pixel enumeration: 168,1,65535,rgba
0,0: (26471,33924,33410,65535) #676784848282 rgba(103,132,130,1)
1,0: (26214,34438,34181,65535) #666686868585 rgba(40%,52.549%,52.1569%,1)
2,0: (26985,34438,33924,65535) #696986868484 rgba(41.1765%,52.549%,51.7647%,1)
3,0: (27499,34952,34438,65535) #6B6B88888686 rgba(41.9608%,53.3333%,52.549%,1)
4,0: (26985,35209,34952,65535) #696989898888 rgba(41.1765%,53.7255%,53.3333%,1)
5,0: (26985,35723,35466,65535) #69698B8B8A8A rgba(41.1765%,54.5098%,54.1176%,1)
6,0: (28013,35466,34952,65535) #6D6D8A8A8888 rgba(42.7451%,54.1176%,53.3333%,1)
7,0: (29298,36751,36237,65535) #72728F8F8D8D rgba(44.7059%,56.0784%,55.2941%,1)
8,0: (29041,37265,37008,65535) #717191919090 rgba(44.3137%,56.8627%,56.4706%,1)
9,0: (30583,38807,38550,65535) #777797979696 rgba(46.6667%,59.2157%,58.8235%,1)
10,0: (31097,37779,37522,65535) #797993939292 rgba(47.451%,57.6471%,57.2549%,1)
11,0: (31611,38293,38036,65535) #7B7B95959494 rgba(48.2353%,58.4314%,58.0392%,1)
12,0: (30326,39064,38807,65535) #767698989797 rgba(46.2745%,59.6078%,59.2157%,1)
13,0: (31868,39321,38807,65535) #7C7C99999797 rgba(48.6275%,60%,59.2157%,1)
14,0: (32382,41120,40863,65535) #7E7EA0A09F9F rgba(49.4118%,62.7451%,62.3529%,1)
#etc...
Instead of a text list you can output it as an image file, which is a row of pixels showing each unique colour:
convert 20by10PixelsSection1.png -unique-colors -scale 1000% unique_colors.gif
This is what you get: Kind of annoying that this only returns unique colours - so 167 out of 200 - but this could maybe be interesting too. A kind of 'condensation' of the essential elements.
Still, try to figure out how to get the grid... is there an easier way than just typing this...?
# convert 20by10PixelsSection1.png -format '%[pixel:p{0,0}]' info:-
rgba(135,161,160,1)
# convert 20by10PixelsSection1.png -format '%[pixel:p{0,1}]' info:-
rgba(135,161,160,1)
# convert 20by10PixelsSection1.png -format '%[pixel:p{0,2}]' info:-
rgba(135,161,160,1)
Histograms of colour distribution
Interesting other tools for 'analysing' images with imagemagick are discussed on [| this help page]. Here's a way of making a little histogram image out of a picture with a reasonably small no. of unique colours:
convert rose: -colors 256 -format %c histogram:info:- |
sed 's/:.*#/ #/' |
while read count color colorname; do
convert -size 1x$count xc:$color miff:-
done |
convert - -alpha set -gravity south -background none +append \
unique_color_histogram.png
...but can't get it to work. here's the error i get:
# ./histogram.sh
convert: unable to open image `20by10PixelSection.jpg:': /usr/lib/ImageMagick-6.6.0/modules-Q16/coders/jpg:.la @ error/blob.c/OpenBlob/2489.
convert: missing an image filename `histogram:info:-' @ error/convert.c/ConvertImageCommand/2940.
convert: no decode delegate for this image format `/tmp/magick-XXarJlLN' @ error/constitute.c/ReadImage/533.
convert: missing an image filename `unique_color_histogram.png' @ error/convert.c/ConvertImageCommand/2940
hm. First, do it the hack way and just get a value for each individual pixel.