应用霍夫变换方法,用matlab语言编写相应的程序

应用霍夫变换方法,用matlab语言编写相应的程序,第1张

RGB = imread('cankao.jpg')%jaynes-thesis

I=rgb2gray(RGB)% 图片用的是灰度图像

[x,y]=size(I)

BW=edge(I)

figureimshow(I)title('原图')

figureimshow(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

%figurecolormap gray

%imagesc(accarray)title('hough变换后的图')

%xlabel('theta'), ylabel('rho')

%=====下面程序的显示效果没上面好=====%

�carray=uint8(accarray)%转换后会丢数据

%figureimshow(accarray)title('老友hough变换后的图')

%xlabel('theta'), ylabel('rho')

%axis on, axis normal, hold on

%=======利用hough变换提取直线======%

%寻找100个像素以上的直线在hough变换后形成的点

K=1%存储数组计数器

for rho_n=1:rho_max %在hough变换后的数组中搜索

for theta_m=1:180

if accarray(rho_n,theta_m)>=10 %设定直线的最小值。

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)

%如果正在计算的点属于100像素以上点,则中弯把它提取出来

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

figureimshow(I_out)title('利用经典hough变换提取的图像')

%========hough变换=========%

%=====matlab自带函数========%

% 入口图像为 BW,出口图像为H

% [H,T,R] = hough(BW,'RhoResolution',0.5,'ThetaResolution',0.5)

% figureimshow(H,'XData',T,'YData',R,'InitialMagnification','fit')title('hough变换矩阵')

% xlabel('theta'), ylabel('rho')

% axis on, axis normal, hold on

首先讲一下这个函数: houghlines 这个函数在matlab中有两种调用形式,如下: lines = houghlines(BW, theta, rho,peaks) lines = houghlines(..., param1, val1,param2, val2) 在这备知里主要讲第二种(其实覆盖了第一种)。 这个函数的主要功能是基于霍夫变换对图像进行线段提取,有点类似于边缘检测之类的。 BW就是要进行线段提取的旅滚枯数字图像,theta和rho是hough函数的返回值。peaks是houghpeaks函数的返回值。 而hough函数是用来将一个二值图进行霍夫变换,在生成霍夫变换的图同时还返回了变换角度 theta和rho的值。 houghpeaks函数拆洞是用来确定经过所霍夫变换过后的图中峰值的位置。 至于param1 和param2是两个参数选项: 有两种:'FillGap'和'MinLength' FillGap是一个正实数,用来表示同一图像中两条线段的距离。当两条线的距离小于这个指定值时,houghlines函数就会将这两条线合并成一条线。 MinLength是一个正实数,用来确定是否保存线条。如果线条的长度小于这个值,线条将会被擦除,否则就保存。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12515025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存