hough.m

本文详细介绍了如何使用MATLAB内置函数'hough.m'进行Hough变换,用于检测图像中的直线特征。通过实例展示了参数设置及其对检测结果的影响,为图像处理初学者提供了实用的教程。
摘要由CSDN通过智能技术生成
%hough源函数
function [h,theta,rho]=hough(f,dtheta,drho)
%hough计算图像下f的Hough变换
%dtheta明确了在水平上的Hough变换的bins与theta坐标的空间。
%drho明确了在水平上Hough变换bins与rho坐标的空间。
%h是Hough变换矩阵。当nrho=2*ceil(norm(size(f))/drho)-1和ntheta=2*ceil(90/dtheta)时,它是nrho*ntheta。
%标记:如果90/dtheta不是一个整数,则实际角度是90/ceil(90/dtheta)。
%
%theta是一个包含h中每个列元素对应角度的ntheta元素向量。
%rho是一个包含h中每个元素对应的rho的值的nrho元素的向量。
%
%[h,theta,rho]=hough(f,dtheta,drho)使用dtheta=1和drho=1计算hough变换

if nargin<3
    drho=1;
end
if nargin<2
    dtheta=1;
end

f=double(f);
[M,N]=size(f);
theta=linspace(-90,0,ceil(90/dtheta)+1);
theta=[theta-fliplr(theta(2:end-1))];
ntheta=length(theta);
D=sqrt((M-1)^2+(N-1)^2);
q=ceil(D/drho);
nrho=2*q-1;
rho=linspace(-q*drho,q*drho,nrho);

[x,y,val]=find(f);
x=x-1;y-1;

%初始化输出
h=zeros(nrho,length(theta));

%防止过度记忆使用,每次执行1000个非零像素值
for k=1:ceil(length(val)/1000)
    first=(k-1)*1000+1;
    last=min(first+999,length(x));
    
    x_matrix=repmat(x(first:last),1,ntheta);
    y_matrix=repmat(y(first:last),1,nthrta);
    val_matrix=repmat(val(first:last),1,ntheta);
    theta_matrix=repmat(theta,size(x_matrix,1),1)*pi/180;
    
    rho_matrix=x_matrix.*cos(theta_matrix)+...
        y_matrix.*sin(theta_matrix);
    slope=(`nrho-1)/(rho(end)-rho(1));
    rho_bin_index=round(slope*(rho_matrix,1),1);
    
    theta_bin_index=repmat(1:ntheta,size(x_matrix,1),1);
    %实际的优势是:sparse函数的结构是一个sparse矩阵,当输入指标是重复时累加。这是我们想要Hough变换的一个动作。
    %我们想要输出一个满(非sparse)矩阵,然而,我们称函数full为sparse的输出
   h=h+full(sparse(rho_bin_index(:),theta_bin_index(:),...
       val_matrix(:),nrho,ntheta));
end
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值