Friday, August 14, 2009

Miscellaneous Stuff about OpenCV

Python Imaging Tricks

Thursday, August 13, 2009

Screen Capture on Mac

Unlike the PC, the Mac has no PrtScreen button. To capture a screen, use cmd-shift-4 to take screenshots and save to disk, and cmd-ctrl-shift-4 to take screenshots and copy to clipboard.

The captured screen will be on the desktop named Picture 1.pdf, Picture 2.pdf and so on. Some blogs say the default filetype is PNG, but not on my Mac.

To change default filetype to some other filetype, launch Terminal, and depending on what file type you want outputted, type (or copy and paste) the appropriate line below followed by return:

defaults write type pdf
defaults write type png
defaults write type jpg
defaults write type tif

Quit Terminal, log out of your account and log in for the change to take effect right away. To revert to the default png format, type 'defaults write type png' as shown above (no single quotes), or delete the plist file in your user preferences folder (no need to restart).

Using Canny edge detection in OpenCV

The second Python example works on my MacBook. So HighGUI does work on the Mac OS X.

Batch Image Processing with Python

Adapted from

If you want to make changes to a single image, such as resizing or converting from one file format to another, then you’ll probably load up the image in an editor and manually make the required changes. This approach is great for a single image, but it doesn’t really scale past more than a few images, at which point it becomes time consuming, not to mention boring!

This is where Python and the Python Imaging Library (or PIL) come in, allowing you to write scripts that process images in batch.

Batch Processing

No matter what processing we want to do on our images the script outline will be the same: loop over all provided arguments, and perform the processing. The code to do this is shown below:

#!/usr/bin/env python
import sys
import Image

# Loop through all provided arguments
for i in range(1, len(sys.argv)):
# Attempt to open an image file
filepath = sys.argv[i]
image =
except IOError, e:
# Report error, and then skip to the next argument
print "Problem opening", filepath, ":", e
# Perform operations on the image here

This will allow our script to be called in all of the following ways:

$ image.gif
$ image1.png image2.gif image3.jpg
$ *.png
$ image1.gif, *.png

With the help of PIL the image processing is really simple. Below is a collection of just some of the operations we could perform. For more details see the PIL documentation.

#Resize an image
image = image.resize((width, height), Image.ANTIALIAS)

# Convert to greyscale
image = image.convert('L')

# Blur
image = image.filter(ImageFilter.BLUR)

# Sharpen
image = image.filter(ImageFilter.SHARPEN)


Once we’ve processed the image we need to save the changes. In some instances we might just want to save over the original filename. If that’s the case we can just call the save method of image with its original filename. If we want to save the file under a different name, or as a different filetype we need to do a little more work:

# Split our original filename into name and extension
(name, extension) = os.path.splitext(filepath)

# Save with "_changed" added to the filename + '_changed' + extension)

# Save the image as a JPG + '.jpg')

Notice in the last example how PIL takes care of the conversion to JPG for us. All we do is provide the file extension and PIL does the rest for us.

A Complete Example

Each of the steps above can easily be put together to create a batch image processing script. Below is a complete script which creates thumbnails of all provided images, and saves them as PNG images, not matter what their original format:

!/usr/bin/env python
# Batch thumbnail generation script using PIL

import sys
import os.path
import Image

thumbnail_size = (28, 28)

# Loop through all provided arguments
for i in range(1, len(sys.argv)):
# Attempt to open an image file
filepath = sys.argv[i]
image =
except IOError, e:
# Report error, and then skip to the next argument
print "Problem opening", filepath, ":", e

# Resize the image
image = image.resize(thumbnail_size, Image.ANTIALIAS)

# Split our original filename into name and extension
(name, extension) = os.path.splitext(filepath)

# Save the thumbnail as "(original_name)_thumb.png" + '_thumb.png')

Instaling Eclipse for Python

Be default, we all can use python interpreter to test smaller codes but really, it is not a feasible way to write fast code so you can use Eclipse, probably the best open source IDE in the market and create and manage python programs using it.

IBM's Eclipse project was a veritable breath of fresh air, at a moment when it was most needed. The development of open source IDEs seemed to have stopped – with a lot of users sticking to emacs and vi, despite spectacular (but unfruitful) development from Kdevelop and Anjuta.

Eclipse is very extensible and able to work with just about any programming language. In this short tutorial, we will talk about how to set up a Python development environment, using Eclipse and PyDev. The reference distribution is Ubuntu, but aside from the command to install packages, everything will be identical on any distribution.

Step 1.
Obtain and install the Java Runtime Environment (JRE). In most cases, there is a package readily available for most distributions, and it is a dependency for Eclipse. You only need to install JRE manually if there is no readily-available package, or if your package manager does not resolve dependencies automatically (and unless you are using plain RPM, without Yum, or Slackware's package manager without a tool like slapt-get, chances are it does)

Step 2.
Install Python. The version you use depends on your needs. PyDev has a rather wide support.

Step 3.
Install Eclipse and PyDev. Most distributions have a separate package for Eclipse and PyDev. However, there are a lot of distributions which do not provide a PyDev package, since Eclipse can install it itself.

If PyDev cannot be installed by using the distribution's package manager, it can be installed by using Eclipse's Update Manager. To install PyDev from Eclipse, go to Help, Software Updates and click Find and Install.

In the wizard window that appears, choose “Search for new features to install” and click Next. This will open a new window. Click “New Remote Site”, and in the dialog box that appears, enter “PyDev Extensions” in the Name text box, and in the URL text box. Click Ok and follow the subsequent on-screen instructions.

Step 4.
Configure the Python interpreter. After you have installed PyDev, open Eclipse and go to Window, Preferences, PyDev, Interpretor – Python (or Jython if you use it instead of Python). Near the Python interpreters list box, click New and navigate to the Python executable on your system (it's usually /usr/bin/python. If it's not there, run the command 'which python' without quotes, and use the path it returns). PyDev will automatically detect some required settings. Once this is over, you are ready to go.

You can now use Eclipse to work on your Python projects. Most project management functions should be familiar to you, and PyDev has a wide range of features, from code completion to refactoring tools.

Installing Java on Ubuntu 9.04

Currently Ubuntu has the following Java packages

sun-java6-bin – Contains the binaries

sun-java6-demo – Contains demos and examples

sun-java6-doc – Contains the documentation

sun-java6-fonts – Contains the Lucida TrueType fonts from the JRE

sun-java6-jdk – Contains the metapackage for the JDK

sun-java6-jre – Contains the metapackage for the JRE

sun-java6-plugin – Contains the plug-in for Mozilla-based browsers

sun-java6-source – Contains source files for the JDK

Use the following command from a terminal

sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts

MacPorts commonly used commands

As usual, this blog is for keeping notes, as I, like, keep forgetting commands.

Installing a port (example given is for php):

port search php
port info php5
port variants php5 sudo
port -v install php5 +apache2 +mysql5

Upgrade all outdated packages:

sudo port selfupdate
sudo port upgrade outdated

Use the upgrade command with care. In the case of Python 2.5, it will update some of the libraries to 2.6, breaking half of the modules.

For a complete list of all installed ports:

sudo port installed