hough变换检测直线 matlab,Hough变换直线检测MatLab代码 | 学步园

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条主要直线

hough变换检测直线 matlab,Hough变换直线检测MatLab代码 | 学步园_第1张图片

你可能感兴趣的:(hough变换检测直线,matlab)