Some examples using the tools in this distribution.
Contents
Load an image, and downsample to a size appropriate for the machine speed.
oim = pgmRead('einstein.pgm');
tic; corrDn(oim,[1 1; 1 1]/4,'reflect1',[2 2]); time = toc;
imSubSample = min(max(floor(log2(time)/2+3),0),2);
im = blurDn(oim, imSubSample,'qmf9');
clear oim;
ShowIm:
3 types of automatic graylevel scaling, 2 types of automatic
sizing, with or without title and Range information.
help showIm
RANGE = showIm (MATRIX, RANGE, ZOOM, LABEL, NSHADES )
Display a MatLab MATRIX as a grayscale image in the current figure,
inside the current axes. If MATRIX is complex, the real and imaginary
parts are shown side-by-side, with the same grayscale mapping.
If MATRIX is a string, it should be the name of a variable bound to a
MATRIX in the base (global) environment. This matrix is displayed as an
image, with the title set to the string.
RANGE (optional) is a 2-vector specifying the values that map to
black and white, respectively. Passing a value of 'auto' (default)
sets RANGE=[min,max] (as in MatLab's imagesc). 'auto2' sets
RANGE=[mean-2*stdev, mean+2*stdev]. 'auto3' sets
RANGE=[p1-(p2-p1)/8, p2+(p2-p1)/8], where p1 is the 10th percentile
value of the sorted MATRIX samples, and p2 is the 90th percentile
value.
ZOOM specifies the number of matrix samples per screen pixel. It
will be rounded to an integer, or 1 divided by an integer. A value
of 'same' or 'auto' (default) causes the zoom value to be chosen
automatically to fit the image into the current axes. A value of
'full' fills the axis region (leaving no room for labels). See
pixelAxes.m.
If LABEL (optional, default = 1, unless zoom='full') is non-zero, the range
of values that are mapped into the gray colormap and the dimensions
(size) of the matrix and zoom factor are printed below the image. If label
is a string, it is used as a title.
NSHADES (optional) specifies the number of gray shades, and defaults
to the size of the current colormap.
clf; showIm(im,'auto1','auto','Al')
ans =
0 237
clf; showIm('im','auto2')
ans =
33.5299 181.9745
clf; showIm(im,'auto3',2)

ans =
34.5314 161.4488
Statistics:mean2(im)
var2(im)
skew2(im)
kurt2(im)
entropy2(im)
imStats(im)
ans =
107.7522
ans =
1.3772e+03
ans =
-0.3853
ans =
3.4430
ans =
6.8841
Image statistics:
Range: [0.000000, 237.000000]
Mean: 107.752213, Stdev: 37.111143, Kurtosis: 3.442999
Synthetic images. First pick some parameters:
sz = 200;
dir = 2*pi*rand(1)
slope = 10*rand(1)-5
int = 10*rand(1)-5;
orig = round(1+(sz-1)*rand(2,1));
expt = 0.8+rand(1)
ampl = 1+5*rand(1)
ph = 2*pi*rand(1)
per = 20
twidth = 7
dir =
5.0015
slope =
-4.3516
expt =
1.1006
ampl =
5.2370
ph =
2.5244
per =
20
twidth =
7
clf;
showIm(mkRamp(sz,dir,slope,int,orig));
showIm(mkImpulse(sz,orig,ampl));
showIm(mkR(sz,expt,orig));
showIm(mkAngle(sz,dir));
showIm(mkDisc(sz,sz/4,orig,twidth));
showIm(mkGaussian(sz,(sz/6)^2,orig,ampl));
showIm(mkZonePlate(sz,ampl,ph));
showIm(mkAngularSine(sz,3,ampl,ph,orig));
showIm(mkSine(sz,per,dir,ampl,ph,orig));
showIm(mkSquare(sz,per,dir,ampl,ph,orig,twidth));
showIm(mkFract(sz,expt));
Point operations (lookup tables):
[Xtbl,Ytbl] = rcosFn(20, 25, [-1 1]);
plot(Xtbl,Ytbl);
showIm(pointOp(mkR(100,1,[70,30]), Ytbl, Xtbl(1), Xtbl(2)-Xtbl(1), 0));
histogram Modification/matching:
[N,X] = histo(im, 150);
[mn, mx] = range2(im);
matched = histoMatch(rand(size(im)), N, X);
showIm(im + sqrt(-1)*matched);
[Nm,Xm] = histo(matched,150);
nextFig(2,1);
subplot(1,2,1); plot(X,N); axis([mn mx 0 max(N)]);
subplot(1,2,2); plot(Xm,Nm); axis([mn mx 0 max(N)]);
nextFig(2,-1);
Convolution routines:
Compare speed of convolution/downsampling routines:
noise = rand(400); filt = rand(10);
tic; res1 = corrDn(noise,filt(10:-1:1,10:-1:1),'reflect1',[2 2]); toc;
tic; ires = rconv2(noise,filt); res2 = ires(1:2:400,1:2:400); toc;
imStats(res1,res2)
Elapsed time is 0.047516 seconds.
Elapsed time is 0.445268 seconds.
Difference statistics:
Range: [-2.486900e-14, 2.842171e-14]
Mean: 0.000000, Stdev (rmse): 0.000000, SNR (dB): 302.015673
Display image and extension of left and top boundaries:
fsz = [9 9];
fmid = ceil((fsz+1)/2);
imsz = [16 16];
im = eye(imsz);
im = mkRamp(imsz,pi/6);
im = mkSquare(imsz,6,pi/6);
edges='reflect1';
edges='reflect2';
edges='repeat';
edges='extend';
edges='zero';
edges='circular';
edges='dont-compute';
filt = mkImpulse(fsz,[1 1]);
showIm(corrDn(im,filt,edges));
line([0,0,imsz(2),imsz(2),0]+fmid(2)-0.5, ...
[0,imsz(1),imsz(1),0,0]+fmid(1)-0.5);
title(sprintf('Edges = %s',edges));
Multi-scale pyramids (see pyramids.m for more examples, and explanations):
A Laplacian pyramid:
[pyr,pind] = buildLpyr(im);
showLpyr(pyr,pind);
res = reconLpyr(pyr, pind);
imStats(im,res);
Difference statistics:
Range: [-1.110223e-16, 1.110223e-16]
Mean: 0.000000, Stdev (rmse): 0.000000, SNR (dB): 328.192949
res = reconLpyr(pyr, pind, [2 3]);
showIm(res);
Wavelet/QMF pyramids:
filt = 'qmf9'; edges = 'reflect1';
filt = 'haar'; edges = 'qreflect2';
filt = 'qmf12'; edges = 'qreflect2';
filt = 'daub3'; edges = 'circular';
[pyr,pind] = buildWpyr(im, 'auto', filt, edges);
showWpyr(pyr,pind,'auto2');
res = reconWpyr(pyr, pind, filt, edges);
clf;
showIm(im + i*res);
imStats(im,res);
Difference statistics:
Range: [-1.419542e-11, 1.515488e-11]
Mean: 0.000000, Stdev (rmse): 0.000000, SNR (dB): 225.129905
res = reconWpyr(pyr, pind, filt, edges, 'all', [2]);
clf;
showIm(res);
Steerable pyramid:
[pyr,pind] = buildSpyr(im,'auto','sp3Filters');
showSpyr(pyr,pind);
Steerable pyramid, constructed in frequency domain:
[pyr,pind] = buildSFpyr(im);
showSpyr(pyr,pind);
res = reconSFpyr(pyr,pind);
imStats(im,res);
Difference statistics:
Range: [-1.176482e-05, 1.176482e-05]
Mean: -0.000000, Stdev (rmse): 0.000006, SNR (dB): 102.665681