Lecture_1&2
Lecture_1&2
Introduction
We shall be concerned with digital image processing, which involves using a computer to change the
nature of a digital image (see below). It is necessary to realize that these two aspects represent two
separate but equally important aspects of image processing. A procedure which satisfies condition
(1)—a procedure which makes an image “look better”—may be the very worst procedure for satis-
fying condition (2). Humans like their images to be sharp, clear and detailed; machines prefer their
images to be simple and uncluttered.
Examples of (1) may include:
1
2 CHAPTER 1. INTRODUCTION
Enhancing the edges of an image to make it appear sharper; an example is shown in figure 1.1.
Note how the second image appears “cleaner”; it is a more pleasant image. Sharpening edges
is a vital component of printing: in order for an image to appear “at its best” on the printed
page; some sharpening is usually performed.
Removing “noise” from an image; noise being random errors in the image. An example is given
in figure 1.2. Noise is a very common problem in data transmission: all sorts of electronic
components may affect data passing through them, and the results may be undesirable. As
we shall see in chapter 5 noise may take many different forms;each type of noise requiring a
different method of removal.
Removing motion blur from an image. An example is given in figure 1.3. Note that in the
deblurred image (b) it is easier to read the numberplate, and to see the spikes on the fence
behind the car, as well as other details not at all clear in the original image (a). Motion blur
may occur when the shutter speed of the camera is too long for the speed of the object. In
photographs of fast moving objects: athletes, vehicles for example, the problem of blur may
be considerable.
Examples of (2) may include:
Obtaining the edges of an image. This may be necessary for the measurement of objects in
an image; an example is shown in figures 1.4. Once we have the edges we can measure their
spread, and the area contained within them. We can also use edge detection algorithms as a
first step in edge enhancement, as we saw above.
1.2. WHAT IS IMAGE PROCESSING? 3
From the edge result, we see that it may be necessary to enhance the original image slightly,
to make the edges clearer.
Removing detail from an image. For measurement or counting purposes, we may not be
interested in all the detail in an image. For example, a machine inspected items on an assembly
line, the only matters of interest may be shape, size or colour. For such cases, we might want
to simplify the image. Figure 1.5 shows an example: in image (a) is a picture of an African
buffalo, and image (b) shows a blurred version in which extraneous detail (like the logs of
wood in the background) have been removed. Notice that in image (b) all the fine detail is
gone; what remains is the coarse structure of the image. We could for example, measure the
size and shape of the animal without being “distracted” by unnecessary detail.
Sampling an image again requires that we consider the Nyquist criterion, when we consider an
image as a continuous function of two variables, and we wish to sample it to produce a digital image.
An example is shown in figure 1.8 where an image is shown, and then with an undersampled
version. The jagged edges in the undersampled image are examples of aliasing. The sampling rate
will of course affect the final resolution of the image; we discuss this below. In order to obtain a
sampled (digital) image, we may start with a continuous representation of a scene. To view the
scene, we record the energy reflected from it; we may use visible light, or some other energy source.
Using light
Light is the predominant energy source for images; simply because it is the energy source which
human beings can observe directly. We are all familiar with photographs, which are a pictorial
record of a visual scene.
Many digital images are captured using visible light as the energy source; this has the advantage
of being safe, cheap, easily detected and readily processed with suitable hardware. Two very popular
methods of producing a digital image are with a digital camera or a flat-bed scanner.
CCD camera. Such a camera has, in place of the usual film, an array of photosites; these are
silicon electronic devices whose voltage output is proportional to the intensity of light falling
on them.
For a camera attached to a computer, information from the photosites is then output to a
suitable storage medium. Generally this is done on hardware, as being much faster and more
efficient than software, using a frame-grabbing card. This allows a large number of images to
be captured in a very short time—in the order of one ten-thousandth of a second each. The
images can then be copied onto a permanent storage device at some later time.
This is shown schematically in figure 1.9.
The output will be an array of values; each representing a sampled point from the original
scene. The elements of this array are called picture elements, or more simply pixels.
1.3. IMAGE ACQUISITION AND SAMPLING 7
Digital output
CCD Array
Original scene
Digital still cameras use a range of devices, from floppy discs and CD’s, to various specialized
cards and “memory sticks”. The information can then be downloaded from these devices to a
computer hard disk.
Flat bed scanner. This works on a principle similar to the CCD camera. Instead of the entire
image being captured at once on a large array, a single row of photosites is moved across the
image, capturing it row-by-row as it moves. Tis is shown schematically in figure 1.10.
Row of photosites
Photosites: silicon electronic devices whose voltage
Motion of row
Output row
Output array
Original scene
Since this is a much slower process than taking a picture with a camera, it is quite reasonable
to allow all capture and storage to be processed by suitable software.
the form of waves of varying wavelength. These range from cosmic rays of very short wavelength,
to electric power, which has very long wavelength. Figure 1.11 illustrates this. For microscopy, we
may use x-rays, or electron beams. As we can see from figure 1.11, x-rays have a shorter wavelength
than visible light, and so can be used to resolve smaller objects than are possible with visible light.
See Clark [2] for a good introduction to this. X-rays are of course also useful in determining the
structure of objects usually hidden from view: such as bones.
A further method of obtaining images is by the use of x-ray tomography, where an object is
encircled by an x-ray beam. As the beam is fired through the object, it is detected on the other side
of the object, as shown in figure 1.12. As the beam moves around the object, an image of the object
can be constructed; such an image is called a tomogram. In a CAT (Computed Axial Tomography)
scan, the patient lies within a tube around which x-ray beams are fired. This enables a large number
of tomographic “slices” to be formed, which can then be joined to produce a three-dimensional image.
A good account of such systems (and others) is given by Siedband [13]
X-ray source
Object
Detectors
Figure 1.14: The image of figure 1.13 plotted as a function of two variables
A digital image differs from a photo in that the , , and values are all discrete. Usually
they take on only integer values, so the image shown in figure 1.13 will have and ranging from 1
to 256 each, and the brightness values also ranging from 0 (black) to 255 (white). A digital image, as
we have seen above, can be considered as a large array of sampled points from the continuous image,
each of which has a particular quantized brightness; these points are the pixels which constitute the
digital image. The pixels surrounding a given pixel constitute its neighbourhood. A neighbourhood
can be characterized by its shape in the same way as a matrix: we can speak, for example, of a
(
neighbourhood, or of a neighbourhood. Except in very special circumstances, neighbourhoods
have odd numbers of rows and columns; this ensures that the current pixel is in the centre of the
neighbourhood. An example of a neighbourhood is given in figure 1.15. If a neighbourhood has
an even number of rows or columns (or both), it may be necessary to specify which pixel in the
neighbourhood is the “current pixel”.
1. Medicine
1.6. ASPECTS OF IMAGE PROCESSING 11
Inspection and interpretation of images obtained from X-rays, MRI or CAT scans,
analysis of cell images, of chromosome karyotypes.
2. Agriculture
Satellite/aerial views of land, for example to determine how much land is being used for
different purposes, or to investigate the suitability of different regions for different crops,
inspection of fruit and vegetables—distinguishing good and fresh produce from old.
3. Industry
4. Law enforcement
Fingerprint analysis,
sharpening or de-blurring of speed-camera images.
Image enhancement. This refers to processing an image so that the result is more suitable for
a particular application. Example include:
removing noise.
Image restoration. This may be considered as reversing the damage done to an image by a
known cause, for example:
Image segmentation. This involves subdividing an image into constituent parts, or isolating
certain aspects of an image:
These classes are not disjoint; a given algorithm may be used for both image enhancement or for
image restoration. However, we should be able to decide what it is that we are trying to do with
our image: simply make it look better (enhancement), or removing damage (restoration).
Acquiring the image. First we need to produce a digital image from a paper envelope. This an
be done using either a CCD camera, or a scanner.
Preprocessing. This is the step taken before the “major” image processing task. The problem here
is to perform some basic tasks in order to render the resulting image more suitable for the job
to follow. In this case it may involve enhancing the contrast, removing noise, or identifying
regions likely to contain the postcode.
Segmentation. Here is where we actually “get” the postcode; in other words we extract from the
image that part of it which contains just the postcode.
Representation and description. These terms refer to extracting the particular features which
allow us to differentiate between objects. Here we will be looking for curves, holes and corners
which allow us to distinguish the different digits which constitute a postcode.
Recognition and interpretation. This means assigning labels to objects based on their descrip-
tors (from the previous step), and assigning meanings to those labels. So we identify particular
digits, and we interpret a string of four digits at the end of the address as the postcode.
Binary. Each pixel is just black or white. Since there are only two possible values for each pixel,
we only need one bit per pixel. Such images can therefore be very efficient in terms of
storage. Images for which a binary representation may be suitable include text (printed or
handwriting), fingerprints, or architectural plans.
An example was the image shown in figure 1.4(b) above. In this image, we have only the two
colours: white for the edges, and black for the background. See figure 1.16 below.
1 1 0 0 0 0
0 0 1 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 1 1 0
0 0 0 0 0 1
Greyscale. Each pixel is a shade of grey, normally from (black) to (white). This range
means that each pixel can be represented by eight bits, or exactly one byte. This is a very
natural range for image file handling. Other greyscale ranges are used, but generally they are
a power of 2. Such images arise in medicine (X-rays), images of printed works, and indeed
%
different grey levels is sufficient for the recognition of most natural objects.
An example is the street scene shown in figure 1.1 above, and in figure 1.17 below.
True colour, or RGB. Here each pixel has a particular colour; that colour being described by the
amount of red, green and blue in it. If each of these components has a range – , this gives
a total of
% ( ( (
%
different possible colours in the image. This is enough colours
for any image. Since the total number of bits required for each pixel is , such images are
also called -bit colour images.
Such an image may be considered as consisting of a “stack” of three matrices; representing the
red, green and blue values for each pixel. This means that for every pixel there correspond
three values.
An example is shown in figure 1.18.
Indexed. Most colour images only have a small subset of the more than sixteen million possible
colours. For convenience of storage and file handling, the image has an associated colour map,
14 CHAPTER 1. INTRODUCTION
or colour palette, which is simply a list of all the colours used in that image. Each pixel has
a value which does not give its colour (as for an RGB image), but an index to the colour in
the map.
%
It is convenient if an image has colours or less, for then the index values will only require
one byte each to store. Some image file formats (for example, Compuserve GIF), allow only
%
colours or fewer in each image, for precisely this reason.
Figure 1.19 shows an example. In this image the indices, rather then being the grey values
of the pixels, are simply indices into the colour map. Without the colour map, the image
would be very dark and colourless. In the figure, for example, pixels labelled 5 correspond to
0.2627 0.2588 0.2549, which is a dark greyish colour.
%
( %
bytes
1.9. IMAGE FILE SIZES 15
49 55 56 57 52 53 64 76 82 79 78 78 66 80 77 80 87 77
58 60 60 58 55 57 93 93 91 91 86 86 81 93 96 99 86 85
58 58 54 53 55 56 88 82 88 90 88 89 83 83 91 94 92 88
83 78 72 69 68 69 125 119 113 108 111 110 135 128 126 112 107 106
88 91 91 84 83 82 137 136 132 128 126 120 141 129 129 117 115 101
69 76 83 78 76 75 105 108 114 114 118 113 95 99 109 108 112 109
61 69 73 78 76 76 96 103 112 108 111 107 84 93 107 101 105 102
Indices
Colour map
Figure 1.19: An indexed colour image
( % Kb
Mb.
(Here we use the convention that a kilobyte is one thousand bytes, and a megabyte is one million
bytes.)
A greyscale image of the same size requires:
%
bytes
%
Kb
%
Mb.
If we now turn our attention to colour images, each pixel is associated with 3 bytes of colour
information. A image thus requires
512 ( %
bytes
( % Kb
( % Mb.
much
Many images are of course such larger than this; satellite images may be of the order of several
thousand pixels in each direction.
2. recognising and interpreting the image with the visual cortex in the brain.
The combination and immense variability of these steps influences the ways in we perceive the world
around us.
There are a number of things to bear in mind:
1. Observed intensities vary as to the background. A single block of grey will appear darker
if placed on a white background than if it were placed on a black background. That is, we
don’t perceive grey scales “as they are”, but rather as they differ from their surroundings. In
figure 1.20 a grey square is shown on two different backgrounds. Notice how much darker the
square appears when it is surrounded by a light grey. However, the two central squares have
exactly the same intensity.
2. We may observe non-existent intensities as bars in continuously varying grey levels. See for
example figure 1.21. This image varies continuously from light to dark as we travel from left
to right. However, it is impossible for our eyes not to see a few horizontal edges in this image.
3. Our visual system tends to undershoot or overshoot around the boundary of regions of different
intensities. For example, suppose we had a light grey blob on a dark grey background. As
our eye travels from the dark background to the light region, the boundary of the region
appears lighter than the rest of it. Conversely, going in the other direction, the boundary of
the background appears darker than the rest of it.
We have seen in the previous chapter that matrices can be handled very efficiently in Matlab.
Images may be considered as matrices whose elements are the pixel values of the image. In this
chapter we shall investigate how the matrix capabilities of Matlab allow us to investigate images
and their properties.
>>
>> w=imread(’wombats.tif’);
This takes the grey values of all the pixels in the greyscale image wombats.tif and puts them all
into a matrix w. This matrix w is now a Matlab variable, and so we can perform various matrix
operations on it. In general the imread function reads the pixel values from an image file, and
returns a matrix of all the pixel values.
Two things to note about this command:
1. It ends in a semicolon; this has the effect of not displaying the results of the command to the
screen. As the result of this particular command is a matrix of size
% %
, or with
% %
2. The name wombats.tif is given in single quote marks. Without them, Matlab would assume
that wombats.tif was the name of a variable, rather than the name of a file.
>> figure,imshow(w),pixval on
This is really three commands on the one line. Matlab allows many commands to be entered on
the same line; using commas to separate the different commands. The three commands we are using
here are:
figure, which creates a figure on the screen. A figure is a window in which a graphics object can
be placed. Objects may include images, or various types of graphs.
pixval on, which turns on the pixel values in our figure. This is a display of the grey values of the
pixels in the image. They appear at the bottom of the figure in the form
where is the column value of the given pixel; its row value, and its grey value. Since
wombats.tif is an 8-bit greyscale image, the pixel values appear as integers in the range
– .
If there are no figures open, then an imshow command, or any other command which generates
a graphics object, will open a new figure for displaying the object. However, it is good practice to
use the figure command whenever you wish to create a new figure.
We could display this image directly, without saving its grey values to a matrix, with the
command
imshow(’wombats.tif’)
However, it is better to use a matrix, seeing as these are handled very efficiently in Matlab.
in fact a number of different methods for describing colour, but for image display and storage a
standard model is RGB, for which we may imagine all the colours sitting inside a “colour cube” of
side as shown in figure 1.23. The colours along the black-white diagonal, shown in the diagram
Cyan White
Blue Magenta
Yellow
Green
Black Red
Figure 1.23: The colour cube for the RGB colour model
as a dotted line, are the points of the space where all the , , values are equal. They are the
different intensities of grey. We may also think of the axes of the colour cube as being discretized
to integers in the range 0–255.
RGB is the standard for the display of colours: on computer monitors; on TV sets. But it is not
a very good way of describing colours. How, for example, would you define light brown using RGB?
As we shall see also in chapter 11, there are some colours which are not realizable with the RGB
model; in that they would require negative values of one or two of the RGB components. Matlab
handles 24-bit RGB images in much the same way as greyscale. We can save the colour values to a
matrix and view the result:
>> a=imread(’autumn.tif’);
>> figure,imshow(a),pixval on
Note now that the pixel values now consist of a list of three values, giving the red, green and blue
components of the colour of the given pixel.
An important difference between this type of image and a greyscale image can be seen by the
command
>> size(a)
which returns three values: the number of rows, columns, and “pages” of a, which is a three-
dimensional matrix, also called a multidimensional array. Matlab can handle arrays of any di-
mension, and a is an example. We can think of a as being a stack of three matrices, each of the
same size.
To obtain any of the RGB values at a given location, we use similar indexing methods to above.
For example
1.13. INDEXED COLOUR IMAGES 21
>> a(100,200,2)
returns the second colour value (green) at the pixel in row 100 and column 200. If we want all the
colour values at that point, we can use
>> a(100,200,1:3)
However, Matlab allows a convenient shortcut for listing all values along a particular dimension;
just using a colon on its own:
>> a(100,200,:)
>> impixel(a,200,100)
returns the red, green, and blue values of the pixel at column 200, row 100. Notice that the order
of indexing is the same as that which is provided by the pixval on command. This is opposite to
the row, column order for matrix indexing. This command also applies to greyscale images:
>> impixel(g,100,200)
will return three values, but since g is a single two-dimensional matrix, all three values will be the
same.
>> figure,imshow(’emu.tif’),pixval on
produces a nice colour image of an emu. However, the pixel values, rather than being three integers
as they were for the RGB image above, are three fractions between 0 and 1. What is going on here?
If we try saving to a matrix first and then displaying the result:
>> em=imread(’emu.tif’);
>> figure,imshow(em),pixval on
we obtain a dark, barely distinguishable image, with single integer grey values, indicating that em
is being interpreted as a single greyscale image.
In fact the image emu.tif is an example of an indexed image, consisting of two matrices: a
colour map, and an index to the colour map. Assigning the image to a single matrix picks up only
the index; we need to obtain the colour map as well:
>> [em,emap]=imread(’emu.tif’);
>> figure,imshow(em,emap),pixval on
Matlab stores the RGB values of an indexed image as values of type double, with values between
0 and 1.
22 CHAPTER 1. INTRODUCTION
A great deal of information can be obtained with the imfinfo function. For example, suppose we
take our indexed image emu.tif from above.
>> imfinfo(’emu.tif’)
ans =
Filename: ’emu.tif’
FileModDate: ’26-Nov-2002 14:23:01’
FileSize: 119804 (has been compressed)
Format: ’tif’
FormatVersion: []
Width: 331 = 127,104 bytes
Height: 384
BitDepth: 8
ColorType: ’indexed’
FormatSignature: [73 73 42 0]
ByteOrder: ’little-endian’
NewSubfileType: 0
BitsPerSample: 8
Compression: ’PackBits’
PhotometricInterpretation: ’RGB Palette’
StripOffsets: [16x1 double]
SamplesPerPixel: 1
RowsPerStrip: 24
StripByteCounts: [16x1 double]
XResolution: 72
YResolution: 72
ResolutionUnit: ’Inch’
Colormap: [256x3 double]
PlanarConfiguration: ’Chunky’
TileWidth: []
TileLength: []
TileOffsets: []
TileByteCounts: []
Orientation: 1
FillOrder: 1
GrayResponseUnit: 0.0100
MaxSampleValue: 255
MinSampleValue: 0
Thresholding: 1
Much of this information is not useful to us; but we can see the size of the image in pixels, the size
of the file (in bytes), the number of bits per pixel (this is given by BitDepth), and the colour type
(in this case “indexed”).
1.14. DATA TYPES AND CONVERSIONS 23
For comparison, let’s look at the output of a true colour file (showing only the first few lines of
the output):
>> imfinfo(’flowers.tif’)
ans =
ans =
What is going on here? We have a binary image, and yet the colour type is given as “grayscale”.
The fact is that Matlab does not distinguish between greyscale and binary images: a binary image
is just a special case of a greyscale image which has only two intensities. However, we can see that
text.tif is a binary image since the number of bits per pixel is only one.
b =
24 CHAPTER 1. INTRODUCTION
23
>> whos a b
Name Size Bytes Class
Even though the variables a and b have the same numeric value, they are of different data types. An
important consideration (of which we shall more) is that arithmetic operations are not permitted
with the data types int8, int16, uint8 and uint16.
A greyscale image may consist of pixels whose values are of data type uint8. These images are
thus reasonably efficient in terms of storage space, since each pixel requires only one byte. However,
arithmetic operations are not permitted on this data type; a uint8 image must be converted to
double before any arithmetic is attempted.
We can convert images from one image type to another. Table 1.2 lists all of Matlab’s functions
for converting between different image types. Note that the gray2rgb function, does not create a
colour image, but an image all of whose pixel colours were the same as before. This is done by
simply replicating the grey values of each pixel: greys in an RGB image are obtained by equality of
the red, green and blue values.
they include:
1. ambient lighting,
4. monitor resolution.
The same image may appear very different when viewed on a dull CRT monitor or on a bright LCD
monitor. The resolution can also affect the display of an image; a higher resolution may result in
the image taking up less physical area on the screen, but this may be counteracted by a loss in the
colour depth: the monitor may be only to display 24-bit colour at low resolutions. If the monitor
is bathed in bright light (sunlight, for example), the display of the image may be compromised.
Furthermore, the individual’s own visual system will affect the appearance of an image: the same
image, viewed by two people, may appear to have different characteristics to each person. For our
purpose, we shall assume that the computer set up is as optimal as is possible, and the monitor is
able to accurately reproduce the necessary grey values or colours in any image.
A very basic Matlab function for image display is image. This function simply displays a
matrix as an image. However, it may not give necessarily very good results. For example:
>> c=imread(’cameraman.tif’);
>> image(c)
will certainly display the cameraman, but possibly in an odd mixture of colours, and with some
stretching. The strange colours come from the fact that the image command uses the current colour
map to assign colours to the matrix elements. The default colour map is called jet, and consists of
64 very bright colours, which is inappropriate for the display of a greyscale image.
To display the image properly, we need to add several extra commands to the image line.
1. truesize, which displays one matrix element (in this case an image pixel) for each screen
pixel. More formally, we may use truesize([256 256]) where the vector components give
the number of screen pixels vertically and horizontally to use in the display. If the vector is
not specified, it defaults to the image size.
3. colormap(gray(247)), which adjusts the image colour map to use shades of grey only. We
can find the number of grey levels used by the cameraman image with
>> size(unique(c))
ans =
247 1
Since the cameraman image thus uses 247 different grey levels, we only need that number of
greys in the colour map.
We may to adjust the colour map to use less or more colours; however this can have a dramatic
effect on the result. The command
will produce a dark image. This happens because only the first 247 elements of the colour map will
be used by the image for display, and these will all be in the first half of the colour map; thus all
dark greys. On the other hand,
will produce a very light image, because any pixel with grey level higher than 128 will simply pick
that highest grey value (which is white) from the colour map.
The image command works well for an indexed colour image, as long as we remember to use
imread to pick up the colour map as well:
>> [x,map]=imread(’cat.tif’);
>> image(x),truesize,axis off,colormap(map)
For true colour images, the image data will be read (by imread) as a three dimensional array.
In such a case, image will ignore the current colour map, and assign colours to the display based
on the values in the array. So
>> t=imread(’twins.tif’);
>> image(t),truesize,axis off
imshow(x)
will display x as an image. This is reasonable, since the data type uint8 restricts values to be
integers between 0 and 255. However, not all image matrices come so nicely bundled up into this
data type, and lots of Matlab image processing commands produces output matrices which are of
type double. We have two choices with a matrix of this type:
The second option is possible because imshow will display a matrix of type double as a greyscale
image as long as the matrix elements are between 0 and 1. Suppose we take an image and convert
it to type double:
>> c=imread(’caribou.tif’);
>> cd=double(c);
>> imshow(c),figure,imshow(cd)
However, as you can see, figure 1.24(b) doesn’t look much like the original picture at all! This is
because for a matrix of type double, the imshow function expects the values to be between 0 and 1,
where 0 is displayed as black, and 1 is displayed as white. A value with
is displayed as
grey scale . Conversely, values greater than 1 will be displayed as 1 (white) and values less
than 0 will be displayed as zero (black). In the caribou image, every pixel has value greater than
or equal to 1 (in fact the minimum value is 21), so that every pixel will be displayed as white. To
display the matrix cd, we need to scale it to the range 0—1. This is easily done simply by dividing
all values by 255:
>> imshow(cd/255)
and the result will be the caribou image as shown in figure 1.24(a).
We can vary the display by changing the scaling of the matrix. Results of the commands:
>> imshow(cd/512)
>> imshow(cd/128)
(a) The matrix cd divided by 512 (b) The matrix cd divided by 128
The display of the result of a command whose output is a matrix of type double can be greatly
affected by a judicious choice of a scaling factor.
We can convert the original image to double more properly using the function im2double. This
applies correct scaling so that the output values are between 0 and 1. So the commands
>> cd=im2double(c);
>> imshow(cd)
will produce a correct image. It is important to make the distinction between the two functions
double and im2double: double changes the data type but does not change the numeric values;
im2double changes both the numeric data type and the values. The exception of course is if the
original image is of type double, in which case im2double does nothing. Although the command
double is not of much use for direct image display, it can be very useful for image arithmetic. We
have seen examples of this above with scaling.
Corresponding to the functions double and im2double are the functions uint8 and im2uint8.
If we take our image cd of type double, properly scaled so that all elements are between 0 and 1,
we can convert it back to an image of type uint8 in two ways:
>> c2=uint8(255*cd);
>> c3=im2uint8(cd);
Use of im2uint8 is to be preferred; it takes other data types as input, and always returns a correct
result.
Binary images
Recall that a binary image will have only two values: 0 and 1. Matlab does not have a binary
data type as such, but it does have a logical flag, where uint8 values as 0 and 1 can be interpreted
as logical data. The logical flag will be set by the use of relational operations such as ==, < or >
or any other operations which provide a yes/no answer. For example, suppose we take the caribou
matrix and create a new matrix with
1.16. THE IMSHOW FUNCTION 29
>> cl=c>120;
(we will see more of this type of operation in chapter 2.) If we now check all of our variables with
whos, the output will include the line:
cl 256x256 65536 uint8 array (logical)
will display the matrix as a binary image; the result is shown in figure 1.26.
(a) The caribou image turned binary (b) After conversion to type uint8
Suppose we remove the logical flag from cl; this can be done by a simple command:
>> cl = +cl;
If we now try to display this matrix with imshow, we obtain the result shown in figure 1.26(b). A
very disappointing image! But this is to be expected; in a matrix of type uint8, white is 255, 0 is
black, and 1 is a very dark grey–indistinguishable from black. Remember: c1 is an array of 0's and 1's
To get back to a viewable image, we can either turn the logical flag back on, and the view the
result:
>> imshow(logical(cl))
Both these commands will produce the image seen in figure 1.26.
30 CHAPTER 1. INTRODUCTION
>> c=imread(’cameraman.tif’);
>> cd=double(c);
We now isolate the bit planes by simply dividing the matrix cd by successive powers of 2, throwing
away the remainder, and seeing if the final bit is 0 or 1. We can do this with the mod function.
>> c0=mod(cd,2);
>> c1=mod(floor(cd/2),2);
>> c2=mod(floor(cd/4),2);
>> c3=mod(floor(cd/8),2);
>> c4=mod(floor(cd/16),2);
>> c5=mod(floor(cd/32),2);
>> c6=mod(floor(cd/64),2);
>> c7=mod(floor(cd/128),2);
These are all shown in figure 1.27. Note that the least significant bit plane, c0, is to all intents and
purposes a random array, and that as the index value of the bit plane increases, more of the image
appears. The most significant bit plane, c7, is actually a threshold of the image at level 127:
>> ct=c>127;
>> all(c7(:)==ct(:))
ans =
>> cc=2*(2*(2*(2*(2*(2*(2*c7+c6)+c5)+c4)+c3)+c2)+c1)+c0;
>> imshow(uint8(cc))
c0 c1 c2
c3 c4 c5
c6 c7
% %
imresize function. Suppose we have an 8-bit greyscale image saved to the matrix x.
Then the command
imresize(x,1/2);
will halve the size of the image. It does this by taking out every other row and every other column,
thus leaving only those matrix elements whose row and column indices are even:
imresize(x,1/2)
If we apply imresize to the result with the parameter 2 rather than 1/2, all the pixels are repeated
to produce an image with the same size as the original, but with half the resolution in each direction:
.. .. .. ..
. . . .
The effective resolution of this new image is only . We can do all this in one line:
x2=imresize(imresize(x,1/2),2);
By changing the parameters of imresize, we can change the effective resolution of the image to
smaller amounts:
To see the effects of these commands, suppose we apply them to the image newborn.tif:
x=imread(’newborn.tif’);
The effects of increasing blockiness or pixelization become quite pronounced as the resolution de-
creases; even at
clear, and at
% %
resolution fine detail, such as the edges of the baby’s fingers, are less
all edges are now quite blocky. At
the image is barely recognizable,
% %
and at and the image becomes unrecognizable.
1.18. SPATIAL RESOLUTION 33
(a) The original image (b) at resolution
(a) At
% %
resolution (b) At
resolution
% %
)
(a) At resolution (b) at resolution
Exercises
1. Watch the TV news, and see if you can observe any examples of image processing.
2. If your TV set allows it, turn down the colour as far as you can to produce a monochromatic
display. How does this affect your viewing? Is there anything which is hard to recognize
without colour?
3. Look through a collection of old photographs. How can they be enhanced, or restored?
4. For each of the following, list five ways in which image processing could be used:
medicine
astronomy
sport
music
agriculture
travel
5. Image processing techniques have become a vital part of the modern movie production process.
Next time you watch a film, take note of all the image processing involved.
6. If you have access to a scanner, scan in a photograph, and experiment with all the possible
scanner settings.
(a) What is the smallest sized file you can create which shows all the detail of your photo-
graph?
(b) What is the smallest sized file you can create in which the major parts of your image are
still recognizable?
1.18. SPATIAL RESOLUTION 35
7. If you have access to a digital camera, again photograph a fixed scene, using all possible
camera settings.
8. Suppose you were to scan in a monochromatic photograph, and then print out the result.
Then suppose you scanned in the printout, and printed out the result of that, and repeated
this a few times. Would you expect any degradation of the image during this process? What
aspects of the scanner and printer would minimize degradation?
9. Look up ultrasonography. How does it differ from the image acquisition methods discussed in
this chapter? What is it used for? If you can, compare an ultrasound image with an x-ray
image. How to they differ? In what ways are they similar?
10. If you have access to an image viewing program (other than Matlab) on your computer,
make a list of the image processing capabilities it offers. Can you find imaging tasks it is
unable to do?
This will give you a list of, amongst other things, all the sample TIFF images which come
with the Image Processing Toolbox. Make a list of these sample images, and for each image
(a) determine its type (binary, greyscale, true colour or indexed colour),
(b) determine its size (in pixels)
(c) give a brief description of the picture (what it looks like; what it seems to be a picture
of)
12. Pick a greyscale image, say cameraman.tif or wombats.tif. Using the imwrite function,
write it to files of type JPEG, PNG and BMP.
What are the sizes of those files?
14. Open the greyscale image cameraman.tif and view it. What data type is it?
These will produce a greyscale image of type double. View this image.
36 CHAPTER 1. INTRODUCTION
>> e2=im2uint8(e);
(a) cameraman.tif
(b) The greyscale emu image
(c) blocks.tif
(d) buffalo.tif
In each case note the point at which the image becomes unrecognizable.