PixQL: SQL for image processing
github.com
github.com
Imagine breaking an image down into pixels, actually storing them into a database, performing some queries, and outputting the result. Something equivalent to that (sans database) sounds interesting to me.
That said, I'm still very much in the "trying things out" phase w.r.t. syntax 'n such. So the feedback is appreciated! (And you're not the only one who has suggested this...)
Curious what you'd expect the result of a join to be? I assume you mean across multiple images? Currently, that would be a bit odd as the function of "select" exists more along the lines of "composing a mask" more than it does "fetching data", so not entirely sure how that'd fit in. Still very interesting. If you're interested in fleshing that idea out here, it could be helpful for me!
Thanks!
Another possibility would be to output a mosaic based on properties of a set of pictures.
I also vote for the use of UPDATE and also the use of INSERT to insert some part of image 1 x mask in image 2 x mask, or insert geometric features x mask.
I think this project is a great idea, thanks for submiting it.
# turn all red pixels green
# omitting column name assumes COLOR
pixql -i in.bmp -o out.bmp -q "SELECT #00FF00FF WHERE COLOR = #FF0000FF;"
# copy red channel into green channel
pixql -i in.bmp -o out.bmp -q "SELECT R AS G;"
# add white 1px 100x100 grid
pixql -i in.bmp -o out.bmp -q "SELECT WHITE AS COLOR WHERE ROW % 100 = 0 OR COL % 100 = 0;"
Edit: Combining this with a "FROM" syntax on your last example: SELECT 255-R AS R, 255-G AS G, 255-B AS B
FROM (SELECT WHITE WHERE ROW % 20 < 10 FROM BLACK(100,100))
WHERE COL % 20 < 10;When you join two tables in SQL, you typically include an ON expression specifying how you want to relate the tables to each other. Or, put another way, how you want the tables to be aligned.
Extending this to PixQL, the ON clause of a JOIN tells the engine how to align two different images, perhaps by offsets in the x,y directions. You could even extend further to LEFT,RIGHT,OUTER,INNER joins where it crops one image to the boundary of the other depending on the join type.
Assuming a more fleshed out FROM syntax (see my other comment) with alias support, you could select the same image multiple times but at different offsets to facilitate a blur.
# Join image to itself but offset by one pixel and report the average of the RGB values
SELECT (img1_pixel.red+img2_pixel.red)/2
(img1_pixel.green+img2_pixel.green/2
(img1_pixel.blue+img2_pixel.blue)/2
FROM img1 img1_pixel INNER JOIN img1 img2_pixel
ON img1_pixel.column = img2_pixel.column
AND img1_pixel.row = img2_pixel.row+1;
# Superimpose one image over another, offset by 100 pixels width/height
UPDATE img1, img2
SET img1.rgb = img2.rgb
WHERE img1.row = img2.row+100
AND img1.column = img2.column; PixQL: SELECT WHERE COLOR = #FF0000FF; OPERATE SET COLOR = #00FF00FF
JS : if (rgba=='FF0000FF') rgba='00ff00ff'
PixQL: OPERATE SET G = R
JS : g=r
PixQL: SELECT WHERE ROW % 100 = 0 OR COL % 100 = 0; OPERATE SET COLOR = WHITE
JS : if (!(row%100) || !(col%100)) rgba="ffffffff""But in photoshop, I instead am relying on the problem being solved externally ("ok, how can I find the right menu that deals with this kind of operation? what's the word the designers of photoshop used to describe this... I hope if I google it in plain text it might link to a forum post or something of someone with the same problem?")."
This is valid for most cases when GUIs are harder to use than a CLI with syntax.
It seems like the image equivalent of treating an HTML file as a huge string of characters -- instead of as the representation of a DOM tree. Which makes very little sense.
Plus, you seldom want to do trivial things like selecting red pixels and flipping their color to green. You want to select red eyes and flip those to their correct color.
(ugh, what is this "limit 2 posts per hour" madness... lol)
PS: Under which license is the PixSQL code available?
As far as the license, I haven't yet decided... pretty new/naive when it comes to deciding something like that... I don't plan on selling it for money, and I obviously like that the source is available, and want contributions, etc... but yeah. not sure. (Any tips would be welcome :P)
Check out http://choosealicense.com/ .
(I've forgotten the name or authors of the Scheme one.)
Very cool.
SELECT *: OPERATE SET COLOR AVG(ROW[-1], ROW[0], ROW[+1]))
To apply a 1 pixel horizontal blur?
One way you could do it is as follows:
OPERATE SET R = (IN[COL,ROW-1].R + IN[COL-1,ROW] + ...)/8;
Unfortunately, that's just the R channel. I should find a way to consider COLOR that would be smart enough to just have it apply the operation across all channels. (right now, the COLOR keyword is nice for simple "set color to this" type of things)