function Img_hough = hough_s(Img, bw)
%该函数实现hough变换提取直线的功能。
%输入图像x,运行之后直接画出直线。
%选择进行Hough变换的图像行
%Img为原图像;bw为边缘图像
%%
[H,W,D]=size(Img);
Img_hough = Img;
if D==1
channel = Img_hough;
Img_hough = cat(3,channel, channel, channel);
end
[M,N]=size(bw);
%求出图像大小。
%%
dtheta=1;
drho=1;
md=ceil((N+round(sqrt(M^2+N^2)))/drho);
%确定网格的最大区域。
ma=ceil(180/dtheta);
numrhotheta=zeros(md,ma);
%产生计数矩阵。
coordrhotheta=cell(1,1);
% para=cell(1,3);
%cell数组相当于c语言中的指针,可动态的改变大小。
for i=1:md
for j=1:ma
coordrhotheta{i,j}=[];
end
end
%产生空网格。
ymin = 5;
ymax = M - 4;
for i=ymin:ymax
for j=1:N
if bw(i,j) == 1
for k=1:ma
rho=round((j*cos(dtheta*k*pi/180)+i*sin(dtheta*k*pi/180))/drho);
%根据直线的法线式表示,计算出平面上不同点的hough变换值。
rho=rho+ceil(N/drho);%可能的最大负值。
numrhotheta(rho+1,k)=numrhotheta(rho+1,k)+1;
%将hough变换值相应位置的计数值加1。
coordrhotheta{rho+1,k}=[coordrhotheta{rho+1,k};[i,j]];
%记录hough变换值相应位置对应的点的坐标。
end
end
end
end
%%
figure;imshow(Img);
hold on
num = 8;
for i=1 : num
[y1,col1]=max(numrhotheta);
[y2,col]=max(y1);
row=col1(col);
%求出hough变换值最大值的坐标。
numrhotheta(row,col)=0;
%为了避免重复计算,将计算过的点置0。
rhood=1;
chood=0;
top=max(row-rhood,1);
down=min(row+rhood,md);
left=max(col-chood,1);
right=min(col+chood,ma);
numrhotheta(top:down,left:right)=0;
% nds=coordrhotheta{row,col};
nds = [];
for r = top : down
for c = left : right
nds = [nds; coordrhotheta{r, c}];
end
end
Img_hough=draw(Img_hough, nds);
end
imwrite(mat2gray(numrhotheta),'numrhotheta.bmp')
效果图如下:8条主要直线