Assignment 1

Photographic Mosaics
COSC450 Assignment 1
Due: 3rd September 2014, 5pm
This assignment is worth 20% of your final grade.
Photographic mosaics (also called Photomosaics, but that term is a trademark)
is the process of making a large image out of small tiles which are themselves
other images. An original image is divided into small square or rectangular
regions, and then each region is replaced by another image, which is scaled
down in size and chosen to best represent the original patch. As an example,
Figure 1 shows an original image of Barack Obama and three mosaics. Each
mosaic replaces square regions of the original image with another face. These
face images are taken from a collection called ‘labeled faces in the wild’, which
is available for you to use in your experiments. The three mosaic images differ
in how many images are used to create the mosaic effect.
Figure 1: An image of Barack Obama in front of a portrait of Abraham Lincoln
(left) made using a mosaic of (from left to right) 672 32 × 32 patches, 2,688
16 × 16 patches, and 10,752 8 × 8 patches. Each patch is itself an image of a
The process of creating a photographic mosaic is, in principle, quite simple
and is described in Algorithm 1. The key to making a good mosaic is choosing
a good function to describe an image or a patch as a vector of numbers. An
average value of the pixels in a patch can give good results, and in colour images
this average is a vector of values (red, green, and blue), rather than a simple
scalar value.
Data: An input image, I, of size w × h; a tile size, s; and a set of n patch
images, P = {P1 , P2 , . . . , Pn }
Result: A version of I where each s × s tile is a copy of some Pi
x ← 1;
y ← 1;
for x ← 1, s, 2s, . . . , w − s do
for y ← 1, s, 2s, . . . , h − s do
d = describe(I(x . . . x + s, y . . . y + s));
i = min ||d − describe(Pi )||;
Pi ∈P
I(x . . . x + s, y . . . y + s) ← resize(Pi , s × s);
Algorithm 1: Basic photographic mosaic algorithm
For large collections of patch images, there are also issues of computational
efficiency. Computing the descriptor for every patch inside the nested loops is
wasteful – it is much better to compute each patch’s descriptor once, and to
store these values for future reference, as shown in Algorithm 2. Further issues
arise when searching for the best descriptor to match a given tile. Searching the
full list of patch descriptors takes O(n) time, which can be quite time consuming
for large n. Faster results can be obtained by using tree-based index structures,
meaning that each search takes O(log n) time.
Data: An input image, I, of size w × h; a tile size, s; and a set of n patch
images, P = {P1 , P2 , . . . , Pn }
Result: A version of I where each s × s tile is a copy of some Pi
x ← 1;
y ← 1;
for i ← 1 . . . n do
di = describe(Pi );
for x ← 1, s, 2s, . . . , w − s do
for y ← 1, s, 2s, . . . , h − s do
d = describe(I(x . . . x + s, y . . . y + s));
i = min ||d − di ||;
I(x . . . x + s, y . . . y + s) ← resize(Pi , s × s);
Algorithm 2: Photographic mosaic algorithm with pre-computed descriptors
Other refinements to the algorithm can improve the appearance of the final
mosaic. Areas of uniform colour tend to lead to repeated use of the same patch
image, which creates a very regular appearance. In these situations, randomly
selecting from a few good matches often looks better than always using the best
match. Descriptors that capture more information about the structure within
a patch can also help improve the appearance of the final mosaic. For example,
the three patches shown in Figure 2 all have the same average colour, but look
very different. Descriptors which compute information about sub-patches (such
as the average colour in each quadrant of the tile), or which use information
about the variance as well as the average colour, can help in these cases.
Figure 2: These three patches all have the same average colour, but look quite
Assignment Requirements
For this assignment you need to write a program which creates photographic
mosaics using a choice of at least two descriptor functions, and write a report
on the results. Your program should also include some randomisation to reduce
the effects of repeated patches in uniform areas of the image.
Your program should take as input (on the command line) at least the following options:
• The original input image to be made into a mosaic
• A text file listing (one to a line) the images to use as patches
• The size (in pixels) of the patches
• A parameter indicating what method to use to describe the images
• The filename of the image to be written as output
For example, your program might be run using the average red-green-blue values
like this:
mosaic input.png listOfImages.txt 16 averageRGB output.png
If your program has other parameters that can be adjusted then these should
be included as command line parameters.
Your report should include:
• Clear directions for building and running your program, including any
command line parameters that are required.
• A discussion of the descriptors you have chosen to implement, including
the reasons why you chose them.
• A comparison of the results of the different methods, including a discussion
of the effects of parameters (such as patch size) on the results. You should
compare the visual quality of the results as well as the computational
requirements (time, memory use) of your methods.
Up to 80% of the marks for this assignment can be achieved by completing the
basic requirements above. The remaining 20% come from some extension to the
basic mosaicing program. Possible extensions include:
• Using an efficient index structure to speed up the process of selecting the
best image for each patch.
• Implementing an adaptive division of the image into tiles. For example,
if an image is found that represents a 32 × 32 patch well, it might be
accepted, but if no good image is found, that patch might be divided into
four 16 × 16 patches and so on.
• Ensuring that no adjacent tiles (or, more generally, no tiles within some
fixed distance of each other) use the same image. Note that a random
element in the selection process doesn’t necessarily guarantee this.
Skeleton Code
Skeleton code for this assignment is provided in ∼steven/Public/COSC450/
PhotographiMosaic/ This code uses the OpenCV library, which
will be discussed in the lectures. The code provides an abstract base class,
PatchDatabase, which provides a template for methods to select images for
each patch. Classes derived from PatchDatabase must implement the methods
add and find. The add method puts a potential patch into the database, and
the find method returns an appropriate patch given a target image.
Animplementation of PatchDatabase is given, called RandomPatchDatabase.
In this implementation, the add method simply puts the patches into a vector,
and the find method selects a random element from that vector. A more intelligent implementation would compute a descriptor for each patch, and store
this as well as the patch itself when add is called. The find method would
then compute the descriptor for the target image, and then find a patch with a
similar descriptor.
The skeleton code also contains two sample files listing patch images. These
are lfw.txt and lfw100.txt, and use faces from the Labeled Faces in the Wild
dataset ( There are about 5700 people
in the dataset, and lfw.txt uses one image of each. Since this is a fairly large
dataset to load when testing, lfw100.txt lists just the first 100 people.
You should send a report (PDF format preferred) and your source code (C++
code and headers, Makefile, etc.) to [email protected] You should include
everything that is needed to build and run your program, apart from the libraries that are provided. You may find it convenient to archive your files as
a .tar or .zip, but be aware that archives sent from outside of the department
often get caught in the University’s spam filters. This can be easily circumvented by renaming your files to remove the archive extension. If your code is
zipped up as, just rename it to mycode.txt or something (but not
mycode.exe!) and tell me in the body of your email what you’ve done. I will
reply to acknowledge receipt of your assignment in any case.
The marks for this assignment will be allocated as follows:
• 30% of the marks from your code
• 50% of the marks from the report
• 20% of the marks for extension (code + report)
Clarity and correctness are the main concerns with your code, and comments,
layout, variable names, etc. contribute to that. While efficient methods are
preferred, you should worry primarily about making sure that your code does
what it should, and that this is clear to someone else reading your code. The
complexity and appropriateness of the techniques that you have implemented
will also be a factor.
Your report will be marked based on clarity of expression, and how well it
fulfils the requirements listed above. I will be looking to see how you tested
your code, and how convincing any experiments and results you give are. It is
expected that reports should be about 4-5 pages long, although large numbers
of pictures could extend this. Any extensions you have made should also be
Late assignment submissions will be penalised at the rate of 10% per working day. Extensions to the deadline may be granted where appropriate, and will
require evidence of work done to date. The usual university regulations relating to plagiarism (
apply, and any work you submit for assessment must be your own.