<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9440128</id><updated>2011-12-14T18:55:14.318-08:00</updated><category term='linux'/><category term='image-processing'/><category term='css'/><category term='web-design'/><category term='shell'/><category term='unix'/><category term='seam-carving'/><title type='text'>The Hunter</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9440128.post-725009610442097375</id><published>2007-10-20T11:07:00.000-07:00</published><updated>2007-10-20T11:35:05.667-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image-processing'/><category scheme='http://www.blogger.com/atom/ns#' term='seam-carving'/><title type='text'>Objective Evaluation of Seam Carving</title><content type='html'>&lt;p&gt;Recently, I've &lt;a href="http://orion67.blogspot.com/2007/09/experiments-on-seam-carving.html"&gt;blogged on some experiments&lt;/a&gt; I've done to investigate the seam carving algorithm. In particular, I wanted to test the algorithm against some real-world images with different reduction factors. The idea was to find in which conditions the algorithm performed best and in which it performed worst, and although I used a specific implementation, the &lt;a href="http://liquidrescale.wikidot.com/"&gt;gimp plug-in&lt;/a&gt; developed by Carlo Bassaldi, on the images, I did run a few of these images through other implementations (especifically, &lt;a href="http://ultra-premium.com/b#source_party"&gt;Andy Owen's implementation&lt;/a&gt; and &lt;a href="http://www.semanticmetadata.net/2007/09/20/content-based-image-resizing-update-to-v2/"&gt;a Java one&lt;/a&gt;) to verify the results (they gave the same result).&lt;/p&gt;&lt;p&gt;Wolfger has also &lt;a href="http://wolfger.wordpress.com/2007/09/19/seam-carving/"&gt;blogged&lt;/a&gt; on the algorithm, later giving an update stating that the gimp plug-in seemed to be worthless. Since I used the plug-in a lot and found it quite useful, I left a &lt;a href="http://wolfger.wordpress.com/2007/09/19/seam-carving/#comment-622"&gt;comment&lt;/a&gt; stating that, in my opinion, the plug-in was not worthless, to which he answered  &lt;blockquote&gt;&lt;emph&gt;"The horse pic on your site demonstrates why I called the Gimp plugin worthless."&lt;/emph&gt;&lt;/blockquote&gt;and finished saying &lt;blockquote&gt;&lt;emph&gt;"So it’s far less useful than it ought to be. Can we agree on that?".&lt;/emph&gt;&lt;/blockquote&gt;Well, no, I'm afraid we can't agree on that since the plug-in does allow to preserve important areas in the image, as I've shown later in the blog for the same image he mentioned. I guess he didn't make to the end of the blog, although on his defense I must say the post was a long, albeit (in my opinion) interesting, one, and you had to have more than a fleeting interest on the algorithm to read it all.&lt;/p&gt;&lt;p&gt;For the mark, I'd like to reiterate that the gimp plug-in is not only &lt;strong&gt;NOT&lt;/strong&gt; worthless, but in fact it is one of the best implementations of seam carving out there that I've tried, both in performace and in flexibility. It's also very easy to use, especially if you have some basic knowledge on gimp.&lt;/p&gt;&lt;p&gt;As I said, the whole point in my previous blog was to explore the strengths and weaknesses of the algorithm itself, not of any implementation in particular. The conclusion I've arrived is that the algorithm is somewhat limited for most images, especially those with persons and animals, &lt;strong&gt;if done without assistance&lt;/strong&gt;. By that I mean if you just run the algorithm on an image without marking down areas to be preserved (like human shapes) or areas to be removed prioritarily.&lt;/p&gt;&lt;p&gt;If, on the other hand, you take the time to give hints to the algorithm, you can get quite good results, although it may take more than one try, and it may depend on the image itself. This can be seen not only in the many sites throught the web, but also from the landscape image with a horse in the foreground shown in the previous blog entry.&lt;/p&gt;&lt;p&gt;You can see how different are the results by the images below, taken from the previous blog. At the left we have the original image, in the middle the one processed without any preserved area, and the last protecting the horse against any seam carving. &lt;div style="margin-top: 1em; margin-bottom: 1em; width: 520px; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 33%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ4Aw3UvVI/AAAAAAAAACU/yEoVMcvHoMI/s1600-h/horse.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ4Aw3UvVI/AAAAAAAAACU/yEoVMcvHoMI/s400/horse.jpg" border="0" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Original Image.  &lt;/div&gt; &lt;/div&gt; &lt;div style="float: left; text-align: center; width: 32%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ43g3UvWI/AAAAAAAAACc/aFhZogJmpWA/s1600-h/horse_0_75_width.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ6GQ3UvYI/AAAAAAAAACs/WELDeWnuHu4/s400/horse_0_50_width.jpg" border="0" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Seam carving with no protective mask applied. &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 66%; width: 33%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ74Q3UvoI/AAAAAAAAAEs/SL5qqHQMkjU/s1600-h/horse_0_50_width_preserve.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ74Q3UvoI/AAAAAAAAAEs/SL5qqHQMkjU/s400/horse_0_50_width_preserve.jpg" border="0" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Seam carving with a protective mask around the horse applied. &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;It's easily seen how much difference our interaction made to the end result. Using a protective mask for the horse actually ensures no seam which goes through the horse is removed, which guarantees the horse's shape in unaltered.&lt;/p&gt;&lt;p&gt;Why is this issue important? Because it makes automatic image processing with seam carving more difficult, not to mention applying it to video processing, as some have already considered. It is not that it is impossible to do a good job, but it certainly is far from trivial. And having a good notion of when and how seam carving can give good results is essential for someone deciding what is the best algorithm to apply in any circunstance. To ignore it makes anyone susceptible of easily falling for sweet talk.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-725009610442097375?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/725009610442097375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=725009610442097375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/725009610442097375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/725009610442097375'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/10/objective-evaluation-of-seam-carving.html' title='Objective Evaluation of Seam Carving'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ4Aw3UvVI/AAAAAAAAACU/yEoVMcvHoMI/s72-c/horse.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-9124461942578088663</id><published>2007-09-21T10:43:00.001-07:00</published><updated>2007-10-20T11:44:37.324-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image-processing'/><category scheme='http://www.blogger.com/atom/ns#' term='seam-carving'/><title type='text'>Implementations of the Seam Carving Algorithm</title><content type='html'>Since I first started blogging about this technique, several implementations have been popping up, so I decided to make a list of them. Some of them are web-based (mostly in flash), others are plug-ins to another software, and still others are stand-alone applications. Here they are: &lt;p&gt; &lt;span style="font-weight: bold;"&gt;Web-based&lt;/span&gt; &lt;/p&gt;&lt;ul&gt; &lt;li&gt; Patrick Swieskowski has a &lt;a href="http://swieskowski.net/carve/"&gt;Seam Carving Demo&lt;/a&gt; which allows you to try it on any photo on the web. &lt;/li&gt; &lt;li&gt; There is another flash implementation in &lt;a href="http://blog.je2050.de/2007/09/02/content-aware-image-resizing/"&gt;je2050.de&lt;/a&gt; which does a pretty good job. Unfortunately it is restricted to two pictures only. &lt;/li&gt; &lt;li&gt; Zero point nine has its own &lt;a href="http://www.zeropointnine.com/blog/seam-carving-in-as3-with-source"&gt;flash implementation&lt;/a&gt;, too &lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Plug-ins&lt;/span&gt; &lt;ul&gt; &lt;li&gt; &lt;a href="http://web.tiscali.it/carlobaldassi/"&gt;Carlo Baldassi&lt;/a&gt; developed a &lt;a href="http://http//registry.gimp.org/plugin?id=10292"&gt;plug-in&lt;/a&gt; for the Gimp &lt;/li&gt; &lt;li&gt; &lt;a href="http://www.kennberg.com/project_resize.php"&gt;Kennberg&lt;/a&gt; has a photoshop plug-in. &lt;/li&gt; &lt;li&gt; Picutel also has a &lt;a href="http://picutel.com/"&gt;PhotoShop plug-in&lt;/a&gt;, but it seems the free version limits the image size. &lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Stand-alone&lt;/span&gt; &lt;ul&gt; &lt;li&gt; Semanticmetadata.net has a &lt;a href="http://www.semanticmetadata.net/2007/09/20/content-based-image-resizing-update-to-v2/"&gt;java application&lt;/a&gt;. &lt;/li&gt; &lt;li&gt; &lt;a href="http://www.intuimage.com/"&gt;IntuImage&lt;/a&gt; has a windows app &lt;/li&gt; &lt;li&gt; &lt;a href="http://www.thegedanken.com/retarget/"&gt;Liquid Resize&lt;/a&gt; has received good comments &lt;/li&gt; &lt;li&gt; &lt;a href="http://kai.system7.de/2007/09/14/seam-carving/"&gt;Another one&lt;/a&gt;, this time in C# and mono (in Linux) &lt;/li&gt;&lt;li&gt;Andy Owen implemented his own routine in C to create a &lt;a href="http://ultra-premium.com/b#source_party"&gt;command-line version&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Gabi took Andy's version above and created a &lt;a href="http://gabeiscoding.com/2007_08_01_archive.html"&gt;GUI application&lt;/a&gt; around it (see also &lt;a href="http://www.gabeiscodingstatic.com/contentawareimageresizing-seamcarving"&gt;here&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Kometbomb has implemented his &lt;a href="http://kometbomb.net/2007/09/04/image-retargeting/"&gt;version&lt;/a&gt; in C for windows.&lt;/li&gt;&lt;li&gt;Michael at Nerdblog has mada available a &lt;a href="http://www.nerdblog.com/2007/08/seam-carving.html"&gt;windows application&lt;/a&gt; (no source code).&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt; Others &lt;/span&gt; &lt;ul&gt; &lt;li&gt; &lt;a href="http://hectorgon.blogspot.com/2007/08/seam-carving-my-quick-and-dirty.html"&gt;Hector Yee&lt;/a&gt; has implemented in flash, too, but is not on-line&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Tim Wintle has told me he also has an implementation of seam carving in python &lt;a href="http://www.timwintle.co.uk/apps/seamresizer/"&gt;here&lt;/a&gt;.  I haven't tested as it is a binary-only program for Windows.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-9124461942578088663?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/9124461942578088663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=9124461942578088663' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/9124461942578088663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/9124461942578088663'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/09/implementation-of-seam-carving.html' title='Implementations of the Seam Carving Algorithm'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-8816023656454511133</id><published>2007-09-20T05:21:00.000-07:00</published><updated>2007-10-20T11:36:23.092-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image-processing'/><category scheme='http://www.blogger.com/atom/ns#' term='seam-carving'/><title type='text'>Experiments on Seam Carving</title><content type='html'>&lt;p&gt; OK, I admit. I was really curious about the technique named &lt;a href="http://www.faculty.idc.ac.il/arik/imret.pdf"&gt;seam carving&lt;/a&gt;, which &lt;a href="http://orion67.blogspot.com/2007/09/seam-carving-sequel.html"&gt;I've blogged before&lt;/a&gt;, and which has received a fair amount of attention on the net recently. I then decided to explore it a bit more using the &lt;a href="http://registry.gimp.org/plugin?id=10292"&gt;gimp plug-in&lt;/a&gt; (BTW, kudos to &lt;a href="http://web.tiscali.it/carlobaldassi/"&gt;Carlo Baldassi&lt;/a&gt; for this plug-in, I'll write more about it later). So, I've chosen a few representative images and ran the implementation on them in order to evaluate in what conditions the algorithm performed ok and when it failed. The rest of this blog details these experiments. &lt;/p&gt; &lt;h2&gt; A Reference Image &lt;/h2&gt; Before checking the algorithm on real pictures, I've decided to test it on the following somewhat artificial image to better check for its effects on image features: &lt;div style="margin-top: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJz4w3UvNI/AAAAAAAAABU/-a_NHIiBnQs/s1600-h/fruits_grad2.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; cursor:pointer; cursor:hand; width: 512px; padding: 2px; border: 1px solid #000000;" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJz4w3UvNI/AAAAAAAAABU/-a_NHIiBnQs/s400/fruits_grad2.jpg" alt="Gradient picture" id="BLOGGER_PHOTO_ID_5112275946045750482" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; A Reference Picture With a 1024 Pixels Width &lt;/div&gt; &lt;/div&gt; &lt;p&gt; As can be seen, the image, which has a width of 1024 pixels, consists of two subjects, an apple and grapes, with a gradient background behind them. Why the gradient background? Well, since for this image the seam carving algorithm is going to be applied on its width, and hence it will run roughly over the vertical columns of pixels, we should get approximately the same results as for a plain background. On the other hand, any distortion caused by the carving will be readily apparent, due to distortion on the gradient itself. &lt;/p&gt; &lt;p&gt; Just for the sake of comparison, I've scaled the width down to 640 pixels, which gives a little less than 40% reduction, and the result is shown below. As can be seen, distortion is evident throughout the scaled-down image. &lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ0ig3UvOI/AAAAAAAAABc/SYkC-K-7gD8/s1600-h/fruits_grad2_scaled_640.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; cursor:pointer; cursor:hand; width: 320px; padding: 2px; border: 1px solid #000000;" src="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ0ig3UvOI/AAAAAAAAABc/SYkC-K-7gD8/s400/fruits_grad2_scaled_640.jpg" alt="Gradient scaled down" id="BLOGGER_PHOTO_ID_5112276663305288930" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Scaled Down Version of Reference Picture &lt;/div&gt; &lt;/div&gt;&lt;p&gt;Applying the seam carving algorithm on the reference image to reduce it to a 640-pixel width gives the result below. Comparing it with the previous scaled-down image, we can immediately see the gains the algorithm gives. Although distortion is visible in the gradient background, the apple and the grapes keep their original shapes.&lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ1QQ3UvPI/AAAAAAAAABk/6GlOgLoaFog/s1600-h/fruits_grad2_seamed_640.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; cursor:pointer; cursor:hand; width: 320px; padding: 2px; border: 1px solid #000000;" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ1QQ3UvPI/AAAAAAAAABk/6GlOgLoaFog/s400/fruits_grad2_seamed_640.jpg" border="0" alt="Gradient picture with seam carving at 640 pixels" id="BLOGGER_PHOTO_ID_5112277449284304114" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Reducing Reference Picture to 640 pixel-width With Seam Carving &lt;/div&gt; &lt;/div&gt;&lt;p&gt;We also reduced the image further to a 480 pixel width (a reduction of more than 50%), as shown below. In this case, the fruits start to present some distortion, but this is unavoidable seeing that they are already packed against each other.&lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ1og3UvQI/AAAAAAAAABs/DTR9Up-tJJk/s1600-h/fruits_grad2_seamed_480.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; cursor:pointer; cursor:hand; width: 240px; padding: 2px; border: 1px solid #000000;" src="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ1og3UvQI/AAAAAAAAABs/DTR9Up-tJJk/s400/fruits_grad2_seamed_480.jpg" border="0" alt="Gradient picture with seam carving at 480 pixels" id="BLOGGER_PHOTO_ID_5112277865896131842" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Reducing Reference Picture to 480 pixel-width With Seam Carving &lt;/div&gt; &lt;/div&gt;&lt;p&gt;From these pictures we see that the algorithm performs reasonably well when applied to an image with an homogeneous background. Let's check now for more interesting images.&lt;/p&gt; &lt;h2&gt; Selected Images &lt;/h2&gt; &lt;p&gt; For real-world images, five images were chosen (two landscapes, two with people and one geometric) having features that are representative of most pictures, like human and animal figures, geometric shapes and loosely-constrained shapes (like trees, mountains, grass fields and clouds, whose shapes can vary significantly and still look ok). The images were reduced to 75% and 50% of their original size using seam carving in both width and height (separately). &lt;/p&gt; &lt;p&gt; The first landscape image is a picture of a small village in a valley. &lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvPDtRh2UrI/AAAAAAAAAE8/GPvS68XYu9w/s1600-h/valley.jpg"&gt;&lt;img style="display:block; width: 450px; margin:0px auto 0px; cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000;" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvPDtRh2UrI/AAAAAAAAAE8/GPvS68XYu9w/s400/valley.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5112268760565464258" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; First Landscape Picture - A Valley &lt;/div&gt; &lt;/div&gt; Here we see that the image contains a detailed bottom half and a more homogeneous upper half. Besides, none of the elements in the picture are too constrained on their shapes. We then applied the algorithm on this image, getting the results below. As I said in &lt;a href="http://orion67.blogspot.com/2007/09/seam-carving-sequel.html"&gt;my previous post&lt;/a&gt;, the processing time for 1024x800 pixels images are in the order of 15 - 20 seconds. This one, being a little smaller (680x500), took less than 10 seconds. &lt;div style="margin-top: 1em; margin-bottom: 1em; width: 520px; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ1-Q3UvRI/AAAAAAAAAB0/heNUnAL23Rc/s1600-h/valley_0_75_width.jpg"&gt;&lt;img style="display:block; width: 75%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ1-Q3UvRI/AAAAAAAAAB0/heNUnAL23Rc/s400/valley_0_75_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112278239558286610" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ2YA3UvSI/AAAAAAAAAB8/O_AybpTXQ68/s1600-h/valley_0_75_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ2YA3UvSI/AAAAAAAAAB8/O_AybpTXQ68/s400/valley_0_75_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112278681939918114" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; margin-top: 1em; margin-bottom: 1em; width: 520px; padding: 0px;"&gt; &lt;div style="float: left; vertical-align: bottom; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ3dQ3UvTI/AAAAAAAAACE/1FoPZF9MzWw/s1600-h/valley_0_50_width.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ3dQ3UvTI/AAAAAAAAACE/1FoPZF9MzWw/s400/valley_0_50_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112279871645859122" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; width: 50%; margin-left: 50%"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ3mg3UvUI/AAAAAAAAACM/fgXIJTaQRJ0/s1600-h/valley_0_50_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ3mg3UvUI/AAAAAAAAACM/fgXIJTaQRJ0/s400/valley_0_50_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112280030559649090" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both"&gt; &lt;/div&gt;&lt;p&gt;From the above images we see that the algorithm performs reasonably well at both reduction rates and in both directions (width and height). So far, so good.&lt;/p&gt; &lt;p&gt; The next image is a landscape picture with a horse in the middleground. &lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ4Aw3UvVI/AAAAAAAAACU/yEoVMcvHoMI/s1600-h/horse.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000;" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ4Aw3UvVI/AAAAAAAAACU/yEoVMcvHoMI/s400/horse.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112280481531215186" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Horse at a Grass Field &lt;/div&gt; &lt;/div&gt; &lt;div style="width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ43g3UvWI/AAAAAAAAACc/aFhZogJmpWA/s1600-h/horse_0_75_width.jpg"&gt;&lt;img style="display:block; width: 75%; margin:0px auto 0px; cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ43g3UvWI/AAAAAAAAACc/aFhZogJmpWA/s400/horse_0_75_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112281422129053026" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ52Q3UvXI/AAAAAAAAACk/VoO0NC7_fMM/s1600-h/horse_0_75_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ52Q3UvXI/AAAAAAAAACk/VoO0NC7_fMM/s400/horse_0_75_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112282500165844338" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ6GQ3UvYI/AAAAAAAAACs/WELDeWnuHu4/s1600-h/horse_0_50_width.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ6GQ3UvYI/AAAAAAAAACs/WELDeWnuHu4/s400/horse_0_50_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112282775043751298" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6MA3UvZI/AAAAAAAAAC0/mpFbvI1ysjQ/s1600-h/horse_0_50_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6MA3UvZI/AAAAAAAAAC0/mpFbvI1ysjQ/s400/horse_0_50_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112282873827999122" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both"&gt; &lt;/div&gt; &lt;p&gt; The situation here is a little different. The algorithm has problems even at the lower scaling rate, since the horse is significantly distorted in all cases, even though the rest of the picture looks ok. That may be partly due to the patterns for the grass and the clouds having more details than for the horse, but it is also because any change in the shape of the horse is much more noticeable than for the other elements in the picture. This effect can be seen not only here but in the next pictures, too. &lt;/p&gt; &lt;p&gt; Another problematic picture is the one below with a man silhouette in the center of the image. &lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6YA3UvaI/AAAAAAAAAC8/uEiUN9LLoOM/s1600-h/portal.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000;" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6YA3UvaI/AAAAAAAAAC8/uEiUN9LLoOM/s400/portal.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283079986429346" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Silhoueted Man &lt;/div&gt; &lt;/div&gt;&lt;p&gt;This is a rather interesting picture because of its lack of details, both in the man as in the other parts of the picture. Running the algorithm on it gives the following images:&lt;/p&gt; &lt;div style="clear: both; width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ6iw3UvbI/AAAAAAAAADE/MKoUNOofBbU/s1600-h/portal_0_75_width.jpg"&gt;&lt;img style="display:block; width: 75%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ6iw3UvbI/AAAAAAAAADE/MKoUNOofBbU/s400/portal_0_75_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283264670023090" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6rA3UvcI/AAAAAAAAADM/cONpNtWcxlo/s1600-h/portal_0_75_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6rA3UvcI/AAAAAAAAADM/cONpNtWcxlo/s400/portal_0_75_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283406403943874" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6yA3UvdI/AAAAAAAAADU/WmnLPQX5SWs/s1600-h/portal_0_50_width.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ6yA3UvdI/AAAAAAAAADU/WmnLPQX5SWs/s400/portal_0_50_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283526663028178" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ63w3UveI/AAAAAAAAADc/Qf5AGVRuknk/s1600-h/portal_0_50_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ63w3UveI/AAAAAAAAADc/Qf5AGVRuknk/s400/portal_0_50_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283625447276002" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both"&gt; &lt;/div&gt; &lt;p&gt; We can see that only the least reduced-height picture is really acceptable, since it is the only one where the man is not significantly distorted. Again, it may partly due to the lack of details in the man texture, but also is due to more stringent criteria for the human shape. &lt;/p&gt; &lt;p&gt; The fourth picture also has human figures in it, in this case, two children. &lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ6-Q3UvfI/AAAAAAAAADk/sS2En38xypw/s1600-h/children_at_beach.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000;" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ6-Q3UvfI/AAAAAAAAADk/sS2En38xypw/s400/children_at_beach.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283737116425714" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Children at the Beach &lt;/div&gt; &lt;/div&gt; &lt;p&gt; It's worth noticing that the children are well-lit and have good details, unlike the silhoutted man in the previous image. Applying the algorithm gives the images below. &lt;/p&gt; &lt;div style="clear: both; width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ7Dw3UvgI/AAAAAAAAADs/82wYw0CuQus/s1600-h/children_at_beach_0_75_width.jpg"&gt;&lt;img style="display:block; width: 75%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ7Dw3UvgI/AAAAAAAAADs/82wYw0CuQus/s400/children_at_beach_0_75_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283831605706242" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ7Kg3UvhI/AAAAAAAAAD0/G3851_5iPUo/s1600-h/children_at_beach_0_75_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ7Kg3UvhI/AAAAAAAAAD0/G3851_5iPUo/s400/children_at_beach_0_75_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112283947569823250" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ7PA3UviI/AAAAAAAAAD8/I2_np7ssWY8/s1600-h/children_at_beach_0_50_width.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ7PA3UviI/AAAAAAAAAD8/I2_np7ssWY8/s400/children_at_beach_0_50_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284024879234594" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ7TA3UvjI/AAAAAAAAAEE/xlQrGKtLG1c/s1600-h/children_at_beach_0_50_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ7TA3UvjI/AAAAAAAAAEE/xlQrGKtLG1c/s400/children_at_beach_0_50_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284093598711346" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both;"&gt; &lt;/div&gt; &lt;p&gt; We can see that, even though the algorithm performs a little better, the higher-compressed images are still problematic. &lt;/p&gt; &lt;p&gt; The last image is a picture of a part of the Golden Gate, in San Francisco, and as such is strongly geometric. &lt;/p&gt; &lt;div style="margin-top: 1em; margin-bottom: 1em; text-align:center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ7cg3UvkI/AAAAAAAAAEM/F3E_hVJ9cHQ/s1600-h/golden_gate2.jpg"&gt;&lt;img style="display:block; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000;" src="http://3.bp.blogspot.com/_6ThxGQEWxgI/RvJ7cg3UvkI/AAAAAAAAAEM/F3E_hVJ9cHQ/s400/golden_gate2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284256807468610" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Golden Gate &lt;/div&gt; &lt;/div&gt;&lt;p&gt;Although the picture doesn't have a lot of detailed patterns, it has lots of straight lines. Applying then the algorithm gives the following results:&lt;/p&gt; &lt;div style="width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ7jA3UvlI/AAAAAAAAAEU/8m9I_0_9x3k/s1600-h/golden_gate2_0_75_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://1.bp.blogspot.com/_6ThxGQEWxgI/RvJ7jA3UvlI/AAAAAAAAAEU/8m9I_0_9x3k/s400/golden_gate2_0_75_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284368476618322" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 75% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; width: 520px; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; margin-top: 1em; margin-bottom: 1em; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ7ow3UvmI/AAAAAAAAAEc/yh2NQpnerC0/s1600-h/golden_gate2_0_50_width.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ7ow3UvmI/AAAAAAAAAEc/yh2NQpnerC0/s400/golden_gate2_0_50_width.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284467260866146" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-top: 1em; margin-bottom: 1em; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ7tw3UvnI/AAAAAAAAAEk/kv60z0XMrpo/s1600-h/golden_gate2_0_50_height.jpg"&gt;&lt;img style="display:block; width: 100%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ7tw3UvnI/AAAAAAAAAEk/kv60z0XMrpo/s400/golden_gate2_0_50_height.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284553160212082" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Height &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; margin-top: 1em; margin-bottom: 1em;"&gt; &lt;/div&gt; &lt;p&gt; We can see that in none of the cases the algorithm performs satisfactorily. &lt;a href="http://hectorgon.blogspot.com/2007/08/seam-carving-my-quick-and-dirty.html"&gt;Hector Yee&lt;/a&gt; in his blog reported finding problems with geometric shapes, too. Interestingly, he tried a modified algorithm which chooses the seam to be removed in a more stochastically way found that it apparently gave better results. Since I didn't have access to the modified algorithm, I couldn't test with the above image, but in some way it makes sense, since removing seams more or less randomly may give straighter lines. &lt;/p&gt; &lt;h2&gt; The Gimp Plug-in &lt;/h2&gt; &lt;p&gt; The gimp plug-in has a feature where one can define a region of the image to be (mostly) preserved from the operations of the algorithm. We used this feature to re-run the algorithm for the second and third pictures, preserving the areas around the horse and the man, respcectively. The results for the 50% reduction cases are shown below. &lt;/p&gt; &lt;div style="width: 520px; margin-top: 1em; margin-bottom: 1em; padding: 0px;"&gt; &lt;div style="float: left; text-align: center; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ74Q3UvoI/AAAAAAAAAEs/SL5qqHQMkjU/s1600-h/horse_0_50_width_preserve.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://2.bp.blogspot.com/_6ThxGQEWxgI/RvJ74Q3UvoI/AAAAAAAAAEs/SL5qqHQMkjU/s400/horse_0_50_width_preserve.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112284733548838530" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width Preserving Horse Shape &lt;/div&gt; &lt;/div&gt; &lt;div style="text-align: center; margin-left: 50%; width: 50%;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ8Qw3UvpI/AAAAAAAAAE0/mlFkzAUTybI/s1600-h/portal_0_50_width_smallpreserve.jpg"&gt;&lt;img style="display:block; width: 50%; margin:0px auto 0px; text-align:center;cursor:pointer; cursor:hand; padding: 2px; border: 1px solid #000000" src="http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJ8Qw3UvpI/AAAAAAAAAE0/mlFkzAUTybI/s400/portal_0_50_width_smallpreserve.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112285154455633554" /&gt;&lt;/a&gt; &lt;div style="margin-top: 0.5em; padding-top: 0px; font-size: 75%; font-weight: bold;"&gt; Applying Seam Carving at 50% on Width Preserving Human Shape &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="clear: both; margin-top: 1em; margin-bottom: 1em;"&gt; &lt;/div&gt; It can be readily seen that the results have improved very significantly, with both the man and the horse shapes preserved (as they should), while the rest of the picture with the same good results as before. We can conclude that seam carving, as implemented by the gimp plug-in, does a good job in scaling down images with "generic" shapes, like trees and mountains, which are present in most landscape pictures. It has, however, problems with pictures with more constrained shapes, like human and animal shapes. These problems can be, though, substantially improved by protecting the sensitive parts manually before applying the algorithm. On the other hand, images with strong geometric shapes are not suitable in general for the seam carving algoritm. &lt;h2&gt; Conclusions &lt;/h2&gt; &lt;p&gt; I'd be most interested in hearing comments on the finding of other implementations. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-8816023656454511133?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/8816023656454511133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=8816023656454511133' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/8816023656454511133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/8816023656454511133'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/09/experiments-on-seam-carving.html' title='Experiments on Seam Carving'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6ThxGQEWxgI/RvJz4w3UvNI/AAAAAAAAABU/-a_NHIiBnQs/s72-c/fruits_grad2.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-3598252093910597583</id><published>2007-09-19T12:45:00.000-07:00</published><updated>2007-10-20T11:36:23.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image-processing'/><category scheme='http://www.blogger.com/atom/ns#' term='seam-carving'/><title type='text'>Seam Carving - The Sequel</title><content type='html'>There seems to be a flurry of activity over the &lt;a href="http://www.faculty.idc.ac.il/arik/imret.pdf"&gt;algorithm&lt;/a&gt; developed by a couple of &lt;a href="http://www.faculty.idc.ac.il/arik/"&gt;Israeli researchers&lt;/a&gt; on resizing an image with minimum loss.  I've &lt;a href="http://orion67.blogspot.com/2007/09/seam-carving.html"&gt;written&lt;/a&gt; a blog on it a couple of days ago, noting the interesting results they got based on a &lt;a href="http://www.youtube.com/watch?v=vIFCV2spKtg"&gt;video&lt;/a&gt; available on YouTube.&lt;br /&gt;&lt;br /&gt;People were fast to implement the algorithm on flash.  I've found already four versions, one by &lt;a href="http://swieskowski.net/carve/"&gt;Patrick Swieskowski&lt;/a&gt;, another by &lt;a href="http://je2050.de/showroom.php?file=ImageResizing"&gt;joa&lt;/a&gt;, still another by &lt;a href="http://hectorgon.blogspot.com/2007/08/seam-carving-my-quick-and-dirty.html"&gt;Hector Yee&lt;/a&gt; and finally one by &lt;a href="http://www.zeropointnine.com/blog/seam-carving-in-as3-with-source#comment-269"&gt;zero point nine&lt;/a&gt;.  There is also a plug-in for &lt;a href="http://www.gimp.org"&gt;Gimp&lt;/a&gt; (very cool, BTW) amd an &lt;a href="http://www.timwintle.co.uk/blog.pl/Programming/content-aware-image-rescaling.html"&gt;implementation&lt;/a&gt; in python (no source code yet, though).  As expected, the algorithm demands some computing processing but not that much.  I've clocked the gimp plug-in performing a reduction on the width of an image from 1024 pixels down to 640 between 15 to 20 seconds.  The flash version is slower, but still workable.  With these implementations one can play a bit with different images.&lt;br /&gt;&lt;br /&gt;The one by Patrick Swieskowski can be fed any image, something important to try out different subjects.  In his blog he points out that &lt;emph&gt;"It's a little tricky to find photos that can be resized by a large amount with cool results"&lt;/emph&gt;.  The &lt;a href="http://je2050.de/showroom.php?file=ImageResizing"&gt;second implementation&lt;/a&gt; has pretty good results with the images they've chosen (the second image is &lt;a href="http://je2050.de/showroom.php?file=ImageResizing2"&gt;here&lt;/a&gt;).  Hector Yee makes an interesting comment where he also tried implementing the algorithm choosing randomly the next seam to be carved, and got somewhat better results for images more geometric.&lt;br /&gt;&lt;br /&gt;Well, then, how does it fare in the real world?  Not that bad, would be the answer, but some images are better than others.  The algorithm performs best for those images that have homogeneous expanses, like sky, water and snow, where it can unnoticeably suppress those expanses (or expand them) without affecting more interesting details (like a human shape).  As soon the image becomes a little more complex, though, the algorithm may disturb important portions of the image.  This can be seen from the &lt;a href="http://swieskowski.net/carve/"&gt;first demo&lt;/a&gt; above, where the tree (arguably the main subject in the picture) gets purged from the photography when we try to reduce its height by more than approximately 40% (at 50% reduction it no longer draws any attention).  Still, the algorithm does a good job below that level, and maybe, with a little hint of our part on the importance of the tree, it can squeeze it further keeping a good job.  Also, if the subjects in the image are not that familiar (many landscape images are like that) then the processing gives better results.&lt;br /&gt;&lt;br /&gt;On the other hand, for some images, especially those more geometric, the algorithm may perform poorly.  You can see that with the following two images:&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a href="http://farm1.static.flickr.com/24/98945754_4bd5065b93_b.jpg"&gt;&lt;img height="100px" src="http://farm1.static.flickr.com/24/98945754_4bd5065b93_m.jpg"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://farm1.static.flickr.com/4/4314082_3a0b6146ad.jpg"&gt;&lt;img src="http://farm1.static.flickr.com/4/4314082_3a0b6146ad_t.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;For those, the algorithm seems to disturb the image faster and more noticeably.  But maybe folks are going to improve it.  We'll see.&lt;br /&gt;&lt;br /&gt;I'll post laster some experiments I did with the gimp plug-in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-3598252093910597583?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/3598252093910597583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=3598252093910597583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/3598252093910597583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/3598252093910597583'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/09/seam-carving-sequel.html' title='Seam Carving - The Sequel'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/24/98945754_4bd5065b93_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-1020522740338120076</id><published>2007-09-18T20:58:00.000-07:00</published><updated>2007-09-18T21:00:00.434-07:00</updated><title type='text'>Creativity (or the lack of)</title><content type='html'>Searching the web for information on outline and brainstorm editors (something that I'll write about later when I consolidate my ideas on them), I found a &lt;a href="http://john.redmood.com/organizers.html"&gt;web site&lt;/a&gt; that does a relatively good job in reviewing several "organizers applications" (although the applications themselves are not that interesting).  But better than the reviews (and surely the reviewed applications) is a link to a web site dedicated to &lt;span style="font-style:italic;"&gt;Creativity&lt;/span&gt;.  That &lt;a href="http://www.ozemail.com.au/~caveman/Creative/"&gt;link&lt;/a&gt; is dead but curious about the site I looked at the &lt;a href="http://web.archive.org/web/20021013090238/members.ozemail.com.au/~caveman/Creative/Basics/kickstart.htm"&gt;WayBack Machine&lt;/a&gt;, and surely the site was there (apparently it went dead by the end of 2004).  Having checked, and approved of, its contents, I went to Google to try and find if the site had moved somewhere else, and indeed &lt;a href="http://members.optusnet.com.au/~charles57/Creative/"&gt;it had&lt;/a&gt;.  Excellent!  But Google didn't return just that site.  I had searched for a complete phrase from the original site to make sure I found an exact copy, and an exact copy I found.  Actually, something more like twenty copies!  Upon looking more closely, I saw that most of them (if not all), with the exception of the "true" one, took the article from the site and "borrowed" it, publishing it themselves giving no credits to the original author, with &lt;a href="http://www.creativityforlife.com/full_article.php?article_id=28"&gt;one exception&lt;/a&gt; (and even this one points back to the dead site).  Kinda ironic an article on creativity be "used" in the least creative way, isn't it?  And many of them are personal blogs, passing the articles as if it were their ideas!&lt;br /&gt;&lt;br /&gt;Nonetheless, the &lt;a href="http://members.optusnet.com.au/~charles57/Creative/Basics/kickstart.htm"&gt;article&lt;/a&gt; is short and to the point, well worth reading.&lt;br /&gt;&lt;br /&gt;Oh, and two of the xeroed blogs are &lt;a href="http://eventsmedia.blogspot.com/2003/12/home-kickstart-your-creativity.html"&gt;here&lt;/a&gt; and &lt;a href="http://http://amerm.net/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-1020522740338120076?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/1020522740338120076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=1020522740338120076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/1020522740338120076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/1020522740338120076'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/09/creativity-or-lack-of.html' title='Creativity (or the lack of)'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-7580702659628392291</id><published>2007-09-17T07:17:00.000-07:00</published><updated>2007-10-20T11:36:23.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='image-processing'/><category scheme='http://www.blogger.com/atom/ns#' term='seam-carving'/><title type='text'>Seam Carving</title><content type='html'>I stumbled upon a &lt;a href="http://www.youtube.com/watch?v=vIFCV2spKtg"&gt;video&lt;/a&gt; today that shows an amazing image processing tool that allows for rescaling an image with minimum distortion.  By minimum distortion I mean the main features are preserved by the operation, whereas more redundant parts are suppressed (or augmented) to make for the size difference.  This is best illustrated by two still frames from the video:&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm2.static.flickr.com/1410/1396497297_ff39e470bd.jpg?v=0" alt="First Snapshot" border="0" /&gt;&amp;nbsp;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm2.static.flickr.com/1089/1396497305_9640a19a14.jpg?v=0" alt="Second Snapshot" border="0" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;In both still frames you can see the original image on the upper right of the frames, and its scaled versions on the lower left.  Note that the two persons in the image keep their apparent sizes and shapes.  The video has many more examples.&lt;br /&gt;&lt;br /&gt;This is a pretty interesting image manipulation.  I wonder, though, how much computing processing power and memory you need for these operations?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-7580702659628392291?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/7580702659628392291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=7580702659628392291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/7580702659628392291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/7580702659628392291'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/09/seam-carving.html' title='Seam Carving'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-3234705951131690509</id><published>2007-09-04T07:30:00.000-07:00</published><updated>2007-09-04T07:55:30.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web-design'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>The overflow attribute</title><content type='html'>You know those web sites where the text in a menu or a side column spills out from the space it's supposed to be and overlaps the main content or some other menu of the web page?  Isn't it annoying?  Surely that was not the web designer's intention.  Maybe the designer considered only one browser and didn't really test the web page with another.  Or maybe the user has selected a different text size, which made text larger than intended.   Whatever the reason, it is a unnecessary problem, especially because there is an work-around for it.&lt;br /&gt;&lt;br /&gt;The CSS (from Cascading Style Sheet) standard has the &lt;span style="font-style: italic;"&gt;overflow&lt;/span&gt; style attribute,  which can be used in almost any tag, which controls how to display the content of the tag in case it is larger than the visual area allocated for it.  For the problem above, the value for this attribute that interest us is &lt;span style="font-style: italic;"&gt;overflow: hidden&lt;/span&gt;.  By specifying it in the corresponding CSS selector, the designer can ensure that&lt;br /&gt;the text or link or image in that tag will not overflow its area and disturb other contents.&lt;br /&gt;&lt;br /&gt;It's certainly a big advantage for a very small price.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-3234705951131690509?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/3234705951131690509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=3234705951131690509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/3234705951131690509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/3234705951131690509'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/09/overflow-attribute.html' title='The overflow attribute'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-1797206707519238605</id><published>2007-08-30T05:17:00.000-07:00</published><updated>2007-08-30T05:53:38.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Taking Screen Shots in Linux</title><content type='html'>Often one needs to take a snapshot of something, usually a window, in the computer screen, for registering, for example, something that is shown in screen (an error message, some fabulous work you have done, or your incredibly beautiful desktop layout).  My favorite for this is to use &lt;a href="http://freshmeat.net/projects/ksnapshot/"&gt;ksnapshot&lt;/a&gt; , available in the KDE desktop system, but several others programs are available.  A useful list of these is available in this &lt;a href="http://tips.webdesign10.com/how-to-take-a-screenshot-on-ubuntu-linux"&gt;page&lt;/a&gt;, which focus on the ubuntu distribution but is also valid for other Linux distributions.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://download.freshmeat.net/screenshots/5366.png" alt="The KSnapshot Application" width="300" /&gt;&lt;br /&gt;&lt;br /&gt;But one called my attention.   &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1146"&gt;Screen Grab&lt;/a&gt;, an add-on for Firefox, which makes it possible to take a screenshot of a web page being visited by Firefox.  Its usefulness is due to the fact that it saves not only what is being shown on the screen, but also the hidden parts, too (if the web page is longer than can be displayed in one window), that is, of the whole web page!  Before stumbling on this add-on I had to painstakingly take as many screen shots of the Firefox window (after maximizing it as much as possible, with full screen enabled and all toolbars disabled) and then stitch them back using &lt;a href="http://www.gimp.org/"&gt;gimp&lt;/a&gt;.  Now it is much simpler and the end result is much better.  Definitely worth a look.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-1797206707519238605?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/1797206707519238605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=1797206707519238605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/1797206707519238605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/1797206707519238605'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/08/taking-screen-shots-in-linux.html' title='Taking Screen Shots in Linux'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-8824143546460932894</id><published>2007-06-19T07:12:00.000-07:00</published><updated>2007-07-19T06:31:50.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>Be Prompt!</title><content type='html'>For those of us using command line often enough, the shell prompt is not only for prompting you to enter your command but also (and perhaps more importantly) displaying information back to you without you having to dig for it.&lt;br /&gt;&lt;br /&gt;If you are using bash, there are plenty of good pages out there explaining how to customize its prompt.  Below are some of my favorites:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/linux/library/l-tip-prompt/"&gt;Prompt Magic&lt;/a&gt; (from ibm.com): a good introductory text that explains not only how to use color (with a good color diagram for easy color look-up) but also, if you are using xterm-compatible terminal, how to change other things beside the prompt from within the prompt.;-)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/"&gt;Change the color of my shell prompt&lt;/a&gt;: another good introductory text which explains how to use the &lt;span style="font-style: italic;"&gt;tput&lt;/span&gt; (to initialize a terminal) to avoid terminal-dependent colored prompts.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/index.html"&gt;The Official HOWTO&lt;/a&gt;: of course if you need details there is always the excellent Bash Prompt HOWTO.&lt;/li&gt;&lt;/ul&gt;It's worth noting that most of this color stuff is done through what is know as ANSI escape code, detailed in the &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-048.htm"&gt;ECMA-48 standard&lt;/a&gt;.  A more concise and understandable list of ANSI codes can be found at&lt;a href="http://rrbrandt.dyndns.org:8080/docs/tut/redes/ansi.php"&gt; RRBrandt Services&lt;/a&gt;, &lt;span style="text-decoration: underline;"&gt;the ANSI/VT100 Terminal Control&lt;/span&gt;&lt;a href="http://www.termsys.demon.co.uk/vtansi.htm"&gt;&lt;/a&gt; site and &lt;a href="http://isthe.com/chongo/tech/comp/ansi_escapes.html"&gt;ANSI Escape Sequence&lt;/a&gt; site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-8824143546460932894?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/8824143546460932894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=8824143546460932894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/8824143546460932894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/8824143546460932894'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2007/06/be-prompt.html' title='Be Prompt!'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9440128.post-110205237250650367</id><published>2004-12-02T21:36:00.000-08:00</published><updated>2004-12-02T21:39:32.506-08:00</updated><title type='text'>My First Blog</title><content type='html'>The title says it all!  Go navigate the web some more.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9440128-110205237250650367?l=orion67.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orion67.blogspot.com/feeds/110205237250650367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9440128&amp;postID=110205237250650367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/110205237250650367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9440128/posts/default/110205237250650367'/><link rel='alternate' type='text/html' href='http://orion67.blogspot.com/2004/12/my-first-blog.html' title='My First Blog'/><author><name>Orion the Hunter</name><uri>http://www.blogger.com/profile/13463725997546735789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
