You aren't signed in     Sign In    Help

MonaTweeta II

MonaTweeta II by Quasimondo.
Preliminary result of a little competition between me and Ralph Hauwert (who had the initial idea) with the goal to write an image encoder/decoder that allows to send an image in a tweet. The image on the left is what I currently manage to send in 140 characters via twitter.

This is the tweet for the image:
圑嘌婂搒孵怤實恄幖戰怴搝愩娻屗奊唀唭嚟帧啜徠山峔巰喜圂嗊埯廇嗕患嚵幇墥彫壛嶂壋悟声喿墰廚埽崙嫖嘵奰恛嬂啷婕媸姴嚥娐嗪嫤圣峈嬻尤囮愰啴屽嶍屽嶰寂喿嶐唥帑尸庠啞彐啯廂喪帄嗆怠嗙开唅恰唦慼啥憛幮悐喆悠喚忐嗳惐唔戠啹媊婼捐啸抃岖嗅怲幀嗈拀唹坭嵄彠喺悠單囏庰抂唋岰媮岬夣宐彋媀恦啼彐壔姩宔嬀

I am using chinese characters here since in UTF-8 encoding they allow me to send 210 bytes of data in 140 chars. In theory I could use the whole character code range from 0x0000-0xffff, but there are several control chars among them which probably could not be sent properly. With some tweaking and testing it would be possible to use at least 1 or 2 more bits which would allow to sneak 17 or 35 more bytes into a tweet, but the whole encoding would be way more nasty and the tweets would contain chars that have no font representation.

Besides this char hack there are a few other tricks at work in the encoding. I will reveal them over time. For now I just mention the difficulties involved here:

A typical RGB color needs 24 bits which is 3 bytes. This means if you just stored raw colors you could send 70 colors. Unfortunately you couldn't send anything else. At least that would allow you to send a 7x10 pixel matrix.

The worst way to store one full x/y coordinate would be 2 times 4 bytes, which is 26 coordinates in one tweet. That's 8 triangles. Obviously you have to do some concessions with the precision here. 2 bytes per number maybe? Gives you 52 points or 17 triangles. Unfortunately those come without color info.



--- Additional info added on May 12th --
Looks like my little project got a bit of attention lately, so I guess I should explain a few more of the details.

The image file format currently looks like this:

[0x00-0x17] 8 color lookup table, each RGB color is 24 bit

[0x18] approximate image proportions, stored in 2 x 4 bits, the proportion is (v >> 4) / (v&4) - which means the actualy physical size of the image is not stored, which is not necessary since it gets rendered in vectors anyway. So the height will be derived from the available width.

[0x19-0xD0] 61 points with color info each stored in 3 bytes:
The first two bytes are the x and the y position whereby their final position is calculated byte / 0xff * displayWidth and byte / 0xff * displayHeight

The color info is stored in the third byte and the way it is done is quite nifty I think: since my lookup table stores only 8 colors I just need 3 bits to store an index to a color. This would leave me with 5 unused bits. So I use these additional bits to give me a wider range of colors by creating blends between the colors in the table. So additionally to one color index I store another color index in the same byte. The remaining 2 bits I use as the blending factor. 2 bits allow for 4 different values. The ones I pick are 0 = 0.125, 1=0.25, 2=0.375, 4 = 0.5. I don't need any higher values since I can simply switch the order of the "upper" and "lower" color to get the same result as e.g. 0.75. I also do not need 0 or 1 since if I want a full color I just mix two times the same color. The 0.5 is a bit of a waste since it means I get the same mix in both directions, maybe it would be smarter to use 0.45 in this case. Overall this trick means that instead of just 8 colors I have a choice of about 256 shades of color.

The actual creation of the image is an evolutionary algorithm. I start by quantizing the image's colors to get 8 representative colors. And I scatter the 61 points over the image area. At each point I read the pixel color of the blurred image and choose the closest shade I can create with my extended color table. With this data I greate a binary "gene" ( the encoded version of is the chinese twitter tweet). From the gene I create a voronoi diagram which is the image you see on the left.

In order to get the best representation (meaning best positions of points and their choice of color) I compare the rendered image with the original by summing up the squared difference of the pixel colors and dividing it by the amount of pixels. The result is the fitness value. The ideal value would be 1 which meant that there is no difference at all between original and rendered image, but obviously that is improssible to reach for most images.

After calculating the fitness value I clone the gene and make a few random mutations to it. Once again I calculate the fitness of the mutation and if it is higher than of its parent the mutation becomes the new parent. This process can run indefinitely but usually the rate of improvement decreases rapidly after a few minutes.

My current goal is to figure out the optimum ways to get good results quickly. 

Comments

view profile

yezzer  Pro User  says:

Will you cover this at FlashBrighton? Hope so! :)
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Maybe I will, but in any case there won't be any slides for that.
Posted 7 months ago. ( permalink )

view profile

groovelock says:

Good idea to use this for compression! I thought I'd try JPEG to see what it could do. I got it down to 608 bytes and 20x30 pixels. Below that the image was unrecognizable! Even at 1x1 px, JPEG couldn't get an image less than 525 bytes.

This is impressive, but it also shows how ridiculous twitter is. If they increase the limit beyond 140 characters, it might be worthwhile. Until then, I don't see a lot of incentive to click on tinyurl.xy/z3kc when I have no idea what it is.
Posted 7 months ago. ( permalink )

view profile

flickraft  Pro User  says:

so a b/w pic would have 3 times the detail?
Posted 7 months ago. ( permalink )

view profile

davebollinger  Pro User  says:

i love a puzzle :), can i posit some guesses?

it looks roughly voronoi-like, so all you'd need to send are the centroid xy's not each vertex. and if you coded them as deltas (like PCM audio) from the prior posiiton (with some modulo wrapping to create rough virtual rows and columns) then you could probably do it with 6 bits each (limiting span between centroids to 64 pixels, maybe even 5 bits/32 pixels?). (or somewhat equivalently, use absolute coords, but quantize the voronoi points to ~1/4 the original image resolution) then use a 4:2:0 yiq/yuv (or similar) colorspace. all that ought to get you in the range of about 3 bytes per colored centroid. then perhaps huffman or rle encode the entire message.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

@flickcraft: in my algorithm I would not be able to get 3 times more detail, I think I could only store a few more points. Maybe a 10% improvement.

@davebollinger: yes it's voronoi, so I am storing the centroids. And I am using 3 bytes per coordinate + color info, but I don't use deltas or a different color space. But those ideas sound definitely like an alternative path to explore. And I don't do any additional compression yet.
Posted 7 months ago. ( permalink )

view profile

rmondonedo says:

dude! i have no idea what the F you just said, but if you're going to get images on twitter.. well then you are so awesome!
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Sorry, there won't be any images on twitter - at least not with this method. This is more of a personal challenge without much practical use.
Posted 7 months ago. ( permalink )

view profile

@MSG  Pro User  says:

u speak chinese? or u just convert it automatically?
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

The chinese in this case is just a host for my parasitic image bytes - it does not really make sense (although, sending it through the translator translate.google.com/translate_t?hl=en&sl =zh-CN&t... gives me ideas for some other experiments). I could have used other parts of unicode ( unicode.org/charts/ ), but then there might be a lot of non-defined font symbols among them which would not look so nice.
Posted 7 months ago. ( permalink )

view profile

Gryftir says:

Hmmm... It occurs to me that this might be useful for captchas somehow
Posted 7 months ago. ( permalink )

view profile

mikeg626  Pro User  says:

The translation (via Google)--with wild liberties--makes interesting word salad:

The whip is war
that easily comes
framing a wild mountain.

Hello, you in the closet,
singing--posing carved peaks
of sound understanding.

Upon a kitchen altar
visit a prostitute--
an ugly woman saint--
who decoys.

Particularly
lonesome mountain valley,
your treasury: a dumb corpse and
funeral car, idle choke open.

Reclassification:
exactly what you would call nervous.
Well, do not suggest recalcitrance
those who donated sad.

The smell of a rugged frame
strikes cement block once.

Where you?
Cape. Cylinder. Cry.
Posted 7 months ago. ( permalink )

view profile

lallaporter  Pro User  says:

I'm entranced by the wild the poetry of the image. Thank you mikeg626
Posted 7 months ago. ( permalink )

view profile

Raymond Brigleb says:

That poem really turned out lovely!
Posted 7 months ago. ( permalink )

view profile

Jeremy Banks says:

I think that lots of the traffic you're getting doesn't really understand what you did. :P
Posted 7 months ago. ( permalink )

view profile

The Pageman  Pro User  says:

@Quasimodo what would be the minimum dimensions for a thumbnail image before it would not be recognizable? Maybe your process lends itself to providing us preview/thumbnail images so we would know what we're clicking on?
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

@The Pageman - I haven't tested it yet. One thing I fear is that my choice of the test image is a bit misleading as for the recognizability of an encoded image. If I'd take another previously unknown photo I'm not so sure if you get a good idea what is on it.

But I will publish the encoder and the decoder very soon so everybody will be free to do their own tests.
Posted 7 months ago. ( permalink )

view profile

Rackdoll says:

I have translated some of your chinese codes....

"Visit a prostitute Jie" ..... ?

Lol.
Is this subliminal messaging ? :)

good work Mario keep up the good work! Am enjoying it \ o /
Posted 7 months ago. ( permalink )

view profile

chrleon says:

Incredibly smart! Looking forward to seeing the code :)

*pat on the back*
Posted 7 months ago. ( permalink )

view profile

simurai  Pro User  says:

I was wondering what that Chinese Tweet you sent a couple days ago all meant.. I never would've thought it could be an image. Nice job.
Posted 7 months ago. ( permalink )

view profile

bjdawes  Pro User  says:

er, what?
Posted 7 months ago. ( permalink )

view profile

bjdawes  Pro User  says:

seriously - very clever stuff.
Posted 7 months ago. ( permalink )

view profile

7pc  Pro User  says:

So, this www.flickr.com/photos/7pc/3525269607/ might be all of it then? pretty impressiv - even more impressive than the talk you gave (wich was a great talk #fmx).
Posted 7 months ago. ( permalink )

view profile

asjo says:

See also X-Face.
Posted 7 months ago. ( permalink )

view profile

jolyon_russ  Pro User  says:

Once again Mario, you've blown my mind!
Posted 7 months ago. ( permalink )

view profile

visualrinse says:

OMG, the stuff you do is just amazing.
Posted 7 months ago. ( permalink )

view profile

_fluffy says:

Two things I'd try:

1. Reduce the color precision in the LUT (every bit of savings helps). You could probably get away with 3:3:2 RGB instead of 8:8:8. At the very least try 5:6:5.

2. Instead of storing the raw coordinates for the Voronoi regions, sort them by Y value, then store the first one raw and each subsequent one as the delta from the last, using a variable-bit encoding. Or you could even just do a repeated transform (on the separate coordinates) and keep track of the number of wavelet passes it takes to decompose it into something that is efficient to store with bitwise RLE (i.e. 5 bits of 0, 100 bits of 1, etc.). If you sort the Voronoi regions by priority you could even just have it store regions in order of importance (perhaps based on total contrast to its adjacent regions) and then stop when it runs out of regions you can always be sure to make the most of your storage.
Posted 7 months ago. ( permalink )

view profile

The Mighty Cheops says:

Nice, but you should've gone with a Rothko. 2 colors, easy to tweet. Hell, you could've tweeted 5 or 6 of 'em.
Posted 7 months ago. ( permalink )

view profile

_fluffy says:

Also, you might consider just using raw UTF16 multiword characters and screw the fact that many of them won't render. Lots of UAs won't render the Chinese text either.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Thanks for the load of great suggestions _fluffy!

In my first version I actually had been using 16 RGB instead of 24. Don't remember why I abandoned it. Sounds worth putting it back into - that's 8 bytes saved.

UTF-16 unfortunately does not help in this case since Twitter counts each of those chars as at least 2 chars.

One approach with the coordinates I tried was to use a grid of equally distributed points, derived from the image's proportions and the amount of available points and then use just one byte per point as an offset from its grid position. This means that I've got 4 bits for each x and y. The offset formulas are
offsetX = (((value >> 4) / 0xf) - 0.5) * maxOffset;
offsetY = (((value & 0xf) / 0xf) - 0.5) * maxOffset;
Posted 7 months ago. ( permalink )

view profile

kylemechler says:

What a fascinating challenge you are undertaking.

The compression and interpretation by the image is perhaps the most interesting part that I've read about (description and comments). Wouldn't you gain _SO MUCH_ simply by expanding your character set, though? I mean, you'd be able to encode multiples of what you are now, wouldn't you? I understand the hurdle of some control characters, though those are limited. I somewhat understand the idea of not wanting characters that have no font representation as well, but simply for the technical challenge, haven't you already dismissed the ability to parse the message by anything other than the decompression process?

I don't mean to sound like I know what I'm talking about. Don't take my comments as critical. I'm just curious and _FASCINATED_. Keep going! Bookmarked!
Posted 7 months ago. ( permalink )

view profile

S Crume  Pro User  says:

Interesting experiment... I have a corollary for you the ponder:
You'll always have a very low max theoretical byte limit BUT if you made these packets and sent a string of tweets to a # hash tag, you could essentially have unlimited data transfer capability
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

@kylemechler My decision to limit this to Chinese characters was one part estetical since I wanted to avoid "ugly" chars, one part practical since this started as a weekend project and I wanted to get some results quickly.Having to figure out which characters I can use and which not sounded a bit tedious.

My tests showed me that the maximum range of UTF-8 encoded characters that Twitter still counts as "1 char" is 0 - 0xffff. So if I could actually use the whole range (which I can't since there are definitely control codes among them) the theoretical maximum would be 280 chars, so that's not really multiples.

@S_Crume of course one could send a huge image in small packets, but wouldn't that be against the spirit of Twitter? It would be like sending a novel in chunks of 140 chars.
Posted 7 months ago. ( permalink )

view profile

Darric says:

24 bit colour for your lookup table seems a bit excessive.

Also, a (admittedly only marginally) better alternative for your blending factor is [0=0.111, 1=0.222, 2=0.333, 3=0.444] mirrored to [0=0.555, 1=0.666, 2=0.777, 3=0.888], for an even distribution that isn't wasteful.
Posted 7 months ago. ( permalink )

view profile

Jim Rees says:

Fluffy's right, you should reduce the color precision. Transform it to YUV and you can throw away much of the color info. Then find a way to reduce the spatial resolution of the U and V channels compared to the Y, like NTSC did 60 years ago. Although since you're using a color lookup table I'm not sure how much this will save.
Posted 7 months ago. ( permalink )

view profile

Darric says:

Huge fan of this idea, incidentally. Going to have to give it a go myself!
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

@Darric yes - that's the idea. I surely don't claim that mine the best possible way and would love to see alternative approaches.
Posted 7 months ago. ( permalink )

view profile

tjp1982 says:

Ever thought of using fractal compression?
Posted 7 months ago. ( permalink )

view profile

guzi4real  Pro User  says:

Very interesting.
Posted 7 months ago. ( permalink )

view profile

ThenAndAgain  Pro User  says:

@Quasimondo: a group of friends and I have done some research on a similar topic. If you happen to find yourself attending LayerOne, you can sit in on our TwatFS talk. Otherwise, I'll update this with links to the tools we'll be releasing during the talk.

Good luck!
Posted 7 months ago. ( permalink )

view profile

Rick Cogley  Pro User  says:

This is quite amazing!
Posted 7 months ago. ( permalink )

view profile

Giantnerd says:

we are hiring a php developer to lead our open source commerce store. Hit me up on twitter if interested
Posted 7 months ago. ( permalink )

view profile

massmediamobile says:

impressive! i have a practical business application for this if you're interested. please contact me either way.
Posted 7 months ago. ( permalink )

view profile

jaxomlotus says:

This rocks. Great job Mario!
Posted 7 months ago. ( permalink )

view profile

JEBloem says:

Quite ambitious guy. Love it!
Posted 7 months ago. ( permalink )

view profile

Brian Campbell says:

This is a pretty neat idea! I like the challenge of doing the best compression in 140 characters you can. Since a lot of people have offerred suggestions for how you can do it better, I've decided to offer a challenge on StackOverflow to see what people can come up with.

Anyone who thinks they can do better can post their code on StackOverflow, along with an example, and I'll give a 500 rep bounty to the person I think did the best job. Other users can vote as well, so we can really see who has the best solution. And Quasimondo, feel free to post your solution there too if you want, though you do have a bit of a head start on everyone else.
Posted 7 months ago. ( permalink )

view profile

pxidistribution says:

this too kool

Posted 7 months ago. ( permalink )

view profile

l'Ours  Pro User  says:

ça me rappelle les deuxlignes d'HHHHHHHebdogiciel !
Posted 7 months ago. ( permalink )

view profile

rjzii  Pro User  says:

Have you done any work with run length encoding of the image information? That might allow you to get a bit more information in to the allowed bytes.

Also, are you using each character to represent a block of data, or are you allowing the data blocks to overlap between the characters? Granted doing that would require you to do a bit more work to ensure a valid character is returned, but it might allow for some more data to be sent.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

I have not used RLE yet because I think that it cannot play out its full potential in such a short span of data. But actually whilst' I'm typing this I do see a way that would allow me to introduce a span marker without having to sacrifice a dedicated bytecode for it, by simply using a different charcode outside my "data" range. So this would not add any overhead.
Good point, I will try that.

Currently 3 bytes of data are stored in two characters, which means 1 byte and a nibble per char.
Posted 7 months ago. ( permalink )

view profile

C.S. 2.0 says:

i was sold from the moment you translated a photo to words.
Posted 7 months ago. ( permalink )

view profile

Georgeasaurus says:

The poem sounds like something Dan Brown would write about the Mona Lisa.
Posted 7 months ago. ( permalink )

view profile

jopotts  Pro User  says:

That's the best thing I've seen all day! Thanks. How about sending a tune via twitter...
Posted 7 months ago. ( permalink )

view profile

kristophrr says:

Coming from a computer vision professional, you're taking the wrong approach: don't turn the image into vectors. Image compression is a well-studied field, learn from the considerable work in lossy compression that has already been done.

With 210 bytes, you can encode a 35x50 pixel version of the mona lisa using JPEG at lowest quality (probably even better with jpeg2000). You'd have to strip out the useless parts of the JPEG specification, but the image data itself would fit and look much better than the vectorized version that you have so far.
Posted 7 months ago. ( permalink )

view profile

dwonis says:

Quasimondo: What you're doing sounds similar to how the Amiga crammed 12-bpp colour into 6-bpp: Hold-and-modify (HAM). You might want to look at that for further ideas on how to improve things.
Posted 7 months ago. ( permalink )

view profile

jfrancis  Pro User  says:

Then average a few together?

www.digitalartform.com/archives/2009/05/image _stack_fun.html
Posted 7 months ago. ( permalink )

view profile

ironhelix001 says:

First of all, image compression

You know, JPEG is just a discrete cosine transform on independent RGB data. The image channels are seperated into red, green, blue, then 8x8 blocks are put through a discrete cosine transform, and depending on the quality level, some of the "low-priority" resultant data is discarded. An 8-bit 8x8 block (64 bytes) becomes 64 values, and you discard as many of the "lower" ones as you want, to aimed quality/size.

If you were to use 16-bit color, you would need 128 bytes to store a 8x8 pixel image. Reducing quality to ~10% (by discarding 90% of the transform) would yield a roughly 24x24, low-quality JPEG, in 128 bytes. 210? Roughly 32x32. There are optimizations to this of course...

But evolving vectorized graphics is actually an amazing new way of compressing images.

There's no reason you can't use a discrete cosine transform on your coordinates. Since you're doing an (almost) evolutionary algorithm, you could encode/decode the coordinates and compare THAT with fitness. The idea is that although DCT may not be optimally suited, a little precision loss is fine for the coordinates, and a good evolutionary algorithm will (eventually, probably) find the best usage of it.

The problem with your alrgorithm overall however is its greediness. It's a hill-climber. It goes up the nearest hill randomly and sits atop it, even if there's a much higher peak sitting just a few paces in the other direction, and a mountain off in the distance. To do a real evolutionary approach, you need to have these "gene sequences" "compete." You can do this sequentially as you did by re-running the same "randomly" directed evolution a few thousand times and judging the fittest, or you can make some cool inter-gene dynamics and create a complex competition system (many times faster, but much harder to make).

And you said in the comments that the range Twitter accepts as "1 char" is 0x0 - 0xffff. If I'm not mistaken, that's 65,536, or 16 bits characters. Yes there are control characters...But the real limit on Twitter is the SMS-based, 160-byte hard limit. You can't tweet more than 160 bytes from a mobile at a time in one tweet. You can't use variable-length UTF8 encoding to cheat that 160 byte hard limit. Twitter may count those Chinese characters as 1 'char', but in reality they're more like 2-3 bytes each. From a mobile at least it's nonsensical.

Also, it is probable that you should change the fitness function. Weight the areas with more "global/local contrast" and/or detected edges using an edge detection algorithm higher than bland areas. There are like 6-7 wasted triangles in the sky, for instance, and 1-2 in the hair, 4-5 in the dark arm, etc., that a simple contrast-weighting would've moved to the head and hands, significantly improving the quality.
Posted 7 months ago. ( permalink )

view profile

/\/\ATT GRU/\/\  Pro User  says:

I'm sorry but evolution contradicts the word of God as found in the bible and therefore your algorithm doesn't work.
Posted 7 months ago. ( permalink )

view profile

mattmihok says:

Brilliant, I love what your doing with this, very interesting idea definatly keep at it!!

Bookmarked.

@/\/\ATT GRU/\/\: I hope that was a joke, you didnt see the algorithm to make the atom bomb not work because of god....
Posted 7 months ago. ( permalink )

view profile

IgorCarron says:

Hi very intersting challenge,

I have several stupid questions as I am trying to size the challenge:
- where is the original picture (the one above has two images, including your result).
- how many pixels does the original picture have ? how many bytes goes into the encoding of each of the three RGB colors in the original picture ?
- I have a specific solution in mind, is there some type of requirement that the encoder is lightweight (i.e. simple, not CPU intensive) ?

Cheers,

Igor.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

@igor: The original is the one on the right. The original size is here: www.flickr.com/photos/quasimondo/3518306770/s izes/o/ but if you want to use it you will have to crop it yourself. I think I got the original from Google images.

The pixel size of the decoded image is irrelevant since I render it in vectors. The decoder scales the image's height according to the width I provide based on the stored proportion.

I am using a LUT of 8 24 bit RGB colors. For details check the long description above.

My encoder is definitely not lightweight, so feel free to shoot at the problem with the biggest gun you have.
Posted 7 months ago. ( permalink )

view profile

groovelock says:

Here is an interesting example that may be useful for anyone trying to make their own algorithm:

www.brainflux.org/java/classes/FFT2DApplet.ht ml
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Just came across an interesting article about Unicode and UTF-8 encoding. Note the code ranges that are onsidered "invalid": www.azillionmonkeys.com/qed/unicode.html So using the whole range from 0-0xffff is definitely not an option.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Nice: Macskeeball has recorded the poem
macskeeball.dnsalias.com/misc/digg/mona_lisa. mp3
Posted 7 months ago. ( permalink )

view profile

Jon Adair says:

It's cheating to some people, but there are some other bytes available beyond the 140 characters on each tweet. The "user agent" field can hold some if you can set it per tweet. You could even pick the timestamp carefully to get a few more bits.
Posted 7 months ago. ( permalink )

view profile

feoren says:

No difference between the encoded and original pictures would be a fitness of 0, not 1.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Yes, well spotted. I took the liberty to invert it since bigger felt better.
Posted 7 months ago. ( permalink )

Macskeeball [deleted] says:

@mikeg626: Nice! I performed a spoken version of the poem. Now we just need someone to compress the MP3 into 140 characters and we can go full circle.
Posted 7 months ago. ( permalink )

view profile

ingagilchrist  Pro User  says:

It's Inga Gilchrist from mX newspaper in Melbourne here.
Do you plan to convert other masterpieces into a tweet?
Posted 7 months ago. ( permalink )

view profile

Dieter Paul-Serge  Pro User  says:

I want a T-shirt saying:

"Where you?
Cape. Cylinder. Cry. "
Posted 7 months ago. ( permalink )

view profile

jguerry says:

man this is pretty cool!

i'm really got the DaVinci Code stuck in my head now after reading the translation. What if? lol.

Dieter Paul-Serge is on to something big. I would buy that shirt!
Posted 7 months ago. ( permalink )

view profile

Gerald5970  Pro User  says:

@mike626 Good stuff. It's a great translation. Turning an image into poetry for twitter. I'm impressed.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

It looks like Neil Graham has already done some very interesting research into image compression with vectors:
www.screamingduck.com/Article.php?ArticleID=4 6&Show=ABCE

screamingduck.com/Lerc/evopic.html
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

@ingagilchrist Oh did you write this: www.flickr.com/photos/pleribus/3553944624/? Thank you! To answer your question - yes I might do that, but right now I have to do some real work - unfortunately no time for recreational coding.
Posted 7 months ago. ( permalink )

view profile

pxidistribution says:

mona tweet
Posted 7 months ago. ( permalink )

view profile

Sam Hocevar says:

Hi there! I love your idea, it's probably one of the first interesting uses for Twitter.

Here's my first attempt:

Twitter Compression 1 by Sam Hocevar

Posted 7 months ago. ( permalink )

view profile

hackmaskate says:

amazing dude www.hackmaskate.net
Posted 7 months ago. ( permalink )

view profile

bumbolo_bill says:

This is extremely impressive, and I'd like to make some of these on my own. Problem is I have almost no knowledge of algorithms or generating vectors, even after your explanation. Is there any application or executable i could use that would create an automatic result, or a mutation program of some sort?
Posted 7 months ago. ( permalink )

view profile

Furee says:

that is intense, very clever competition.
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

BTW, encoded as a QR code the Mona Tweeta text looks like this: qrcode
Posted 7 months ago. ( permalink )

view profile

7pc  Pro User  says:

Sure? Chinese coding ;]
www.flickr.com/photos/7pc/3525269607/sizes/s/
Posted 7 months ago. ( permalink )

view profile

Sam Hocevar says:

@kristophrr: are you really a computer vision professional? Using vector-valued components to compress an image is used in the field, especially for very lossy compression. See the works of Joachim Weickert, for instance, especially his paper titled "Towards PDE-based image compression". Quasimondo's approcach is IMHO good, it just needs work 1) in the bit allocation, and 2) in the image reconstruction itself (smoothing the whole thing a bit).
Posted 7 months ago. ( permalink )

view profile

Quasimondo  Pro User  says:

Another great link - thank you very much Sam! It definitely shows that I am just a dilettante in this field.
Posted 7 months ago. ( permalink )

view profile

Brian Campbell says:

I rather like the effect that Quasimondo's approach gives you; I think while you might get something closer to the original by applying some smoothing, the sort of mosaic effect is actually very visually appealing. I do like the edge enhancing diffusion from the Joachim Weickert's work, though. I think that would be really interesting to apply to this problem.
Posted 7 months ago. ( permalink )

view profile

tsevis  Pro User  says:

Great idea. Congrats.
Posted 7 months ago. ( permalink )

view profile

bjornblog  Pro User  says:

love it :-D
Posted 6 months ago. ( permalink )

view profile

riceisnice says:

very nice
Posted 6 months ago. ( permalink )

view profile

moi_fotografii says:

That's very very smart!!
Do you think you can create Voronoi diagrams controlling the cells, so that smaller cells will be created in the area where more image details is present? (smaller cells in face area on the behalf of larger ones in less-of-interest areas)

Here is my version of Image Twitter which I've created a few weeks ago
uzhin.info/imagetwitter/

My thought was to create images in 144px (12x12) :)
Posted 6 months ago. ( permalink )

view profile

ThenAndAgain  Pro User  says:

: Sorry for the delay, here's the source of the project we worked on.

www.darrellnoice.com/download/utfsmuggler.tar .gz

the project was done up in netbeans if you don't want to wrestle with files manually. Once you compile it up, run it with --help and you should be good to go.

From a data point of view, you get a guaranteed 20bits of real data for every UTF8 character. And only the last character of the stream is lost for overhead.

I hope this helps! Good luck with your project.
Posted 6 months ago. ( permalink )

view profile

alxflickrrr says:

Thanks for sharing!
Posted 2 months ago. ( permalink )

Would you like to comment?

Sign up for a free account, or sign in (if you're already a member).

[?]
view photos Uploaded on May 10, 2009
by Quasimondo

Quasimondo's photostream

Processing & Flash (Set)

219
items
Part of: Arts & Crafts

Tags

Additional Information

AttributionNoncommercial Some rights reserved Anyone can see this photo

Add to your map