linehough.m
来自「这个程序检测出了图像中的直线,而且用绿色标出直线,直线断电用+表示,并且用不同颜」· M 代码 · 共 101 行
M
101 行
clc;
clear;
RGB = imread('test.jpg');%jaynes-thesis
I=rgb2gray(RGB); % 图片用的是灰度图像,
[x,y,z]=size(I);
BW=edge(I,'canny');
figure;
imshow(I);
title('原图');
figure;
imshow(BW);
title('边缘检测图像');
rho_max=floor(sqrt(x^2+y^2))+1; %由原图数组坐标算出ρ最大值,并取整数部分加1
%此值作为ρ,θ坐标系ρ最大值
accarray=zeros(rho_max,180); %定义ρ,θ坐标系的数组,初值为0。
%θ的最大值,180度
Theta=[0:pi/180:pi]; %定义θ数组,确定θ取值范围
for n=1:x,
for m=1:y
if BW(n,m)==1
for k=1:180
%将θ值代入hough变换方程,求ρ值
rho=(m*cos(Theta(k)))+(n*sin(Theta(k)));
%将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数
rho_int=round(rho/2+rho_max/2);
%在ρθ坐标(数组)中标识点,即计数累加
accarray(rho_int,k)=accarray(rho_int,k)+1;
end
end
end
end
%figure;colormap gray;
%imagesc(accarray);title('hough变换后的图')
%xlabel('\theta'), ylabel('\rho');
%=====下面程序的显示效果没上面好=====%
%accarray=uint8(accarray); %转换后会丢数据
%figure;imshow(accarray);title('hough变换后的图')
%xlabel('\theta'), ylabel('\rho');
%axis on, axis normal, hold on;
%=======利用hough变换提取直线======%
%寻找0.25%的图像大小个数像素以上的直线在hough变换后形成的点
K=1; %存储数组计数器
for rho_n=1:rho_max %在hough变换后的数组中搜索
for theta_m=1:180
if accarray(rho_n,theta_m)>=20 & rho_n<rho_max&accarray(rho_n,theta_m)>=accarray(rho_n+1,theta_m) & rho_n>1&accarray(rho_n,theta_m)>=accarray(rho_n-1,theta_m) & theta_m>1&accarray(rho_n,theta_m)>=accarray(rho_n,theta_m-1) & theta_m<179&accarray(rho_n,theta_m)>=accarray(rho_n,theta_m+1)%设定直线的最小值。
case_accarray_n(K)=rho_n; %存储搜索出的数组下标
case_accarray_m(K)=theta_m;
K=K+1;
end
end
end
%把这些点构成的直线提取出来,输出图像数组为I_out
I_out=zeros(x,y);
I_jiao_class=zeros(x,y);
for n=1:x,
for m=1:y
if BW(n,m)==1
for k=1:180
rho=(m*cos(Theta(k)))+(n*sin(Theta(k)));
rho_int=round(rho/2+rho_max/2);
%如果正在计算的点属于0.25%图像大小像素以上点,则把它提取出来
for a=1:K-1
if rho_int==case_accarray_n(a)&k==case_accarray_m(a)%%%==gai==%%% k==case_accarray_m(a)&rho_int==case_accarray_n(a)
I_out(n,m)=BW(n,m);
I_jiao_class(n,m)=k;
end
end
end
end
end
end
figure;
imshow(I_out);
title('利用经典hough变换提取的图像');
%===============New Code==================%
%disp(case_accarray_n);
%disp(case_accarray_m);
%dignant_k=zeros(1,K);
%dignant_b=zeros(1,K);
for k=1:K-1
if case_accarray_m~=0
dignant_k(k)=-atan(case_accarray_m(k));
dignant_b(k)=case_accarray_n(k)/sin(case_accarray_m(k));
else
dignant_k(k)=Inf;
dignant_b(k)=case_accarray_n(k);
end
end
disp(dignant_k);
disp(dignant_b);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?