Using MATLAB code must be written for MATLAB and the concept
Using MATLAB (code must be written for MATLAB) and the concept of Hough Transformations.
Create an image containing 4 distinct points, 3 of which are collinear, the 4th not collinear. Plan how to attack this problem, looking specifically for the line with the most collinear points. Write code to find the line formed by the 3 points.
Thank you for any help you are able to provide.
Solution
The Hough transform is powerful method to detect the edges in the computer visison developed by Paul Hough in 1962, in order to solve this problem we need to create a GUI for the same.
We need to first create an image or upload an image to the system and then detect all the possible edges in the system and then use cvhough and cvunhough functions which i have defined below in this project
Matlab Code for CVImageGet
function P = CVImageGet
[P,W] = get_image_file( \'*.bmp,*.gif,*.jpeq\', \'choose the file format\');
if
W==0
I=[ ];// there is no image input to the system
else
WP=[W,P];
ext=WP(findstr(WP,\'.\')+1:end);
if
strcmp(ext,\'pgm\')
I = readpgm(WP);
else
%matlab image types
[Im,MAP]=imread(PF);
I = ind2gray(Im,MAP);
end
I = I/max(I(:));
end
function CV Edge
function edgedata = CVEdge(I,M,T,A);
if
M>2
error(
\'M should be 1(subpixel) or 2(edge)\'
);
elseif
M==1
%SUBPIXEL
edgedata=[];
for
rownr = 1:size(I,1);
row = I(rownr,:);
edgeposfine=rowedges(row,A,T);
26
edgedata=[edgedata
[edgeposfine;rownr*ones(size(edgeposfine))]];
end
;
elseif
M==2
%EDGE
switch
A
case
1,
meth=
\'sobel\'
;
case
2,
meth=
\'prewitt\'
;
case
3,
meth=
\'roberts\'
;
case
4,
meth=
\'log\'
;
case
5,
meth=
\'zerocross\'
;
case
6,
meth=
\'canny\'
;
otherwise
,
error(
\'edge method values only 1 through 6\'
);
end
E=edge(I,meth,T);
[r,c]=find(E);
edgedata=[c\';r\'];
end
Function CVhough
function [H,m,b] = CVhough(edgedata,nT,nS)
MAXDIST=1.2;
if
nargin<1
error(
\'require at least one input argument: binary image\'
)
elseif
nargin<2
warning(
\'defualt value of 200 assigned to number of orientations
nT\'
)
nT=200;
warning([
\'defualt value of\'
, max(edgedata(:))*MAXDIST,
\'assigned
to number of orientations nS\'
])
nS=max(edgedata(:))*MAXDIST;
elseif
nargin<3
warning([
\'defualt value of\'
, max(edgedata(:))*MAXDIST,
\'assigned
to number of orientations nS\'
])
nS=max(edgedata(:))*MAXDIST;
end
row=edgedata(2,:)\';
col=edgedata(1,:)\';
%defining the range of the orientations of line
Ts=[0:pi/nT:pi-pi/nT]\';
27
%cos and sin of all the angles
CsT=cos(Ts);
SnT=sin(Ts);
%solving for distances for all orientations at all nonzero pixels
%size of S is: [length(row) , length(Ts)]
S=row*CsT\' + col*SnT\';
%mapping:
%
Smin = min(S(:))--> 1
%
Smax = max(S(:))--> nS
%gives (y=mx+b):
%
m=(nS-1)/(Smax-Smin)
%
b=(Smax-nS*Smin)/(Smax-Smin)
%and then round it and get rounded mapped S:rmS
Smin=min(S(:));
Smax=max(S(:));
m =(nS-1)/(Smax-Smin);
b =(Smax-nS*Smin)/(Smax-Smin);
rmS=round(m*S + b);
%Note:
H is [nT,nS]
%
rmS is
[nP,nT] nP:number of edge points
H=[];
hw=waitbar(0,
\'Performing Hough Transform...\'
);
for
k=1:nS,
isEq=(rmS==k);
%
H=[H,sum(isEq)\']; %sum(isEq) 1 x nT
H(:,k)=sum(isEq)\';
waitbar(k/nS,hw);
end
close(hw);
CV unhough Code
function [SL,TL,intSL,intTL]=CVunhough(H,m,b,P)
DILATEFRAC=.02;
if
nargin<3
error(
\'require at least 3 input arguments: histogram matrix H, 2
distance mapping parameters m & b\'
);
elseif
nargin<4
warning(
\'defualt value of 0.7 assigned to percentage threshold
P\'
);
P=0.7;
end
[nT,nS]=size(H);
TH=im2bw(H,P*max(H(:)));
H1=dilate(TH,ones(round(DILATEFRAC*size(H))),1);
L=bwlabel(H1,8);
n=max(L(:));
intSL=[]; intTL=[];
for
k=1:n,
[r,c]=find(L==k);
intTL=[intTL; mean(r)];
intSL=[intSL; mean(c)];
end
TL=(intTL-1)*pi/nT;
SL=(intSL-b)/m;
disp(
\'Selected lines in the form [a b c]\'
)
disp(
\'----------------------------------\'
)
for
k=1:n,
a=num2str(cos(TL(k)));
b=num2str(sin(TL(k)));
c=num2str(-SL(k));
disp([\'Line \',num2str(k),\'/\',num2str(n),\': [ \',a,\' \',b,\' \',c,\']\']);
end




