%File Name: "nans.m"
%Title: Get rid of NaNs
%Author: Shashank G. Sawant
%Notes: Quite honestly I found this somewhere on the internet.
%Here I have just adapted it to a 2D Matrix according to my req.
mwnans=[1 4 NaN 5; 5 4 98 NaN; NaN NaN 3 2]; %Matrix with NaNs
t=find(isnan(mwnans));
mwonans=mwnans; %Initialize Matrix without %NaNs
mwonans(t)=zeros(size(t));
%somehow the mwonans doesn't have the NaNs which mwnans has
Result:
>> nans
>> mwnans
mwnans =
1 4 NaN 5
5 4 98 NaN
NaN NaN 3 2
>> mwonans
mwonans =
1 4 0 5
5 4 98 0
0 0 3 2
>>
Good Riddance!
After a lot of searching on the internet I couldn’t find a simple function to generate a Gaussian kernel mask of a given size and variance.
Hence the following code:
% ---------------------------------------------------------
% Author: Shashank G. Sawant
% Date: November 04, 2009
% Title: Generation of 2D Gaussian kernel mask
% Details:
% Mask Size: size x size = (2*k+1)x(2*k+1)
% Variance: Sigma
% Notes: The program is inefficient but easy to understand
% Also it accepts only odd numbers as its size parameter
% ---------------------------------------------------------
function H=gkm(size,sigma)
H=zeros(size);
k=(size-1)/2;
for i=1:(2*k+1)
for j=1:(2*k+1)
itpss=double(1/(2*pi*sigma^2));
num=double(((i-k-1)^2+(j-k-1)^2));
den=double(2*sigma^2);
H(i,j)=double(itpss*exp(-num/den));
end
end
The results of the same are as follows:
Result 1::
>> ceil(159*gkm(5,1.3))
ans =
2 4 5 4 2
4 9 12 9 4
5 12 15 12 5
4 9 12 9 4
2 4 5 4 2
The above result is quite a standard in the literature explaining Canny Edge Detection
Result 2:
>> format long
>> gkm(7,0.84089642)
ans =
Columns 1 through 4
0.000000667834529 0.000022915625609 0.000191165460524 0.000387705531367
0.000022915625609 0.000786311390357 0.006559523253494 0.013303467276683
0.000191165460524 0.006559523253494 0.054720490941357 0.110979446595403
0.000387705531367 0.013303467276683 0.110979446595403 0.225079076498442
0.000191165460524 0.006559523253494 0.054720490941357 0.110979446595403
0.000022915625609 0.000786311390357 0.006559523253494 0.013303467276683
0.000000667834529 0.000022915625609 0.000191165460524 0.000387705531367
Columns 5 through 7
0.000191165460524 0.000022915625609 0.000000667834529
0.006559523253494 0.000786311390357 0.000022915625609
0.054720490941357 0.006559523253494 0.000191165460524
0.110979446595403 0.013303467276683 0.000387705531367
0.054720490941357 0.006559523253494 0.000191165460524
0.006559523253494 0.000786311390357 0.000022915625609
0.000191165460524 0.000022915625609 0.000000667834529
The above result matches with the following Wikipedia article:
http://en.wikipedia.org/wiki/Gaussian_blur
Reading values located on a circle form a part of the template matching algorithm I am planning to implement. Hence I have written the following Matlab code.
Original source for the algorithm: http://cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html
function imgmat = drwcir(imgmat, xCenter, yCenter, radius)
x = 0;
y = radius;
p = floor((5 - radius*4)/4);
imgmat = cirpoints(imgmat, xCenter, yCenter, x, y);
while x < y,
x=x+1;
if (p<0)
p = p + 2*x+1;
else
y=y-1;
p = p + 2*(x-y)+1;
end
imgmat = cirpoints(imgmat, xCenter, yCenter, x, y);
end
return;
function img = cirpoints(img, cx, cy, x, y)
if (x == 0)
img = setpix(img, cx, cy + y);
img = setpix(img, cx, cy - y);
img = setpix(img, cx + y, cy);
img = setpix(img, cx - y, cy);
elseif (x == y)
img = setpix(img, cx + x, cy + y);
img = setpix(img, cx - x, cy + y);
img = setpix(img, cx + x, cy - y);
img = setpix(img, cx - x, cy - y);
elseif (x < y)
img = setpix(img, cx + x, cy + y);
img = setpix(img, cx - x, cy + y);
img = setpix(img, cx + x, cy - y);
img = setpix(img, cx - x, cy - y);
img = setpix(img, cx + y, cy + x);
img = setpix(img, cx - y, cy + x);
img = setpix(img, cx + y, cy - x);
img = setpix(img, cx - y, cy - x);
end
return;
function img = setpix(img,x,y)
img(x,y)=1;
return;
The following commands result in the accompanying picture:
figure;
image=zeros(500);
for i=1:2:250,
image=drwcir(image,250,250,i);
end
imshow(image);
Switching back and forth from one programming language to the other usually makes me forget the basic commands. Hence the post.
IF statement in Matlab: (Source: http://www.cyclismo.org/tutorial/matlab/if.html)
a = 2;
b = 3;
if (a<b)
j = -1;
end
For Loop in Matlab: (Source: http://www.cyclismo.org/tutorial/matlab/control.html)
>> v = [1:3:10]
v =
1 4 7 10
>> for j=1:4,
v(j) = j;
end
>> v
v =
1 2 3 4
Functions in Matlab: (Source: http://web.cecs.pdx.edu/~gerry/MATLAB/programming/basics.html)
The following 2 functions have to be stored in the files name traparea.m and cart2plr.m respectively. One can include auxiliary functions in the same file but the scope of such functions ends
function area = traparea(a,b,h)
% traparea(a,b,h) Computes the area of a trapezoid given
% the dimensions a, b and h, where a and b
% are the lengths of the parallel sides and
% h is the distance between these sides
% Compute the area, but suppress printing of the result
area = 0.5*(a+b)*h;
Finally, here is another simple function, cart2plr.m, with two input parameters and two output parameters.
function [r,theta] = cart2plr(x,y)
% cart2plr Convert Cartesian coordinates to polar coordinates
%
% [r,theta] = cart2plr(x,y) computes r and theta with
%
% r = sqrt(x^2 + y^2);
% theta = atan2(y,x);
r = sqrt(x^2 + y^2);
theta = atan2(y,x);
The following are 2 more examples: (Source: Matlab Help)
Example 1
The existence of a file on disk called stat.m containing
this code defines a new function called stat that calculates
the mean and standard deviation of a vector:
function [mean,stdev] = stat(x)
n = length(x);
mean = sum(x)/n;
stdev = sqrt(sum((x-mean).^2/n));
Example 2
avg is a subfunction within the file stat.m:
function [mean,stdev] = stat(x)
n = length(x);
mean = avg(x,n);
stdev = sqrt(sum((x-avg(x,n)).^2)/n);
function mean = avg(x,n)
mean = sum(x)/n;
After significant trial and error on morphological operations the following results were achieved:
The Program:
#include
#include
#include
#include
#include
IplImage *img=0; //the pointer is assigned value zero;
//thus it points to nothing untill something is loaded
IplImage *img2=0;
int main(void){
img=cvLoadImage("sg (25).jpg");
if(img==0){
fprintf(stderr,"Cannot load file.");
getchar();
return(1);
}
int i,j,height,width, step, channels;
int temp;
height=img->height;
width=img->width;
channels=img->nChannels;
step=img->widthStep;
unsigned char *data=(unsigned char *)img->imageData; //Since it's an IPL_DEPTH_8U image
for(i=0;i
for(j=0;j
temp=2*data[i*step+j*channels+2]
-data[i*step+j*channels+1]
-data[i*step+j*channels+0]; //temp=2*red - sum of blue and green
//thus the current range of temp is -510 to 510
temp=temp/4; //this reduces the range to -127 to 127
temp=temp+127; //this shifts the range to 0 to 254
data[i*step+j*channels+0]=temp;
data[i*step+j*channels+1]=temp;
data[i*step+j*channels+2]=temp;
}
}
//once the image is rendered into gray scale we don't modify img
//hence img2 - the dummy - is used
img2=cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
unsigned char *data2=(unsigned char *)img2->imageData;
cvErode(img,img2,NULL,5);
cvDilate(img2,img2,NULL,5);
cvThreshold(img2,img2,100,255,CV_THRESH_BINARY);
cvNamedWindow("image",CV_WINDOW_AUTOSIZE);
cvShowImage("image",img2);
cvSaveImage("obj.jpg",img2);
cvWaitKey(0);
cvDestroyWindow("image");
cvReleaseImage(&img);
}