⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matlab hough变换对圆的检测.txt

📁 MATLAB绘制出权值wv和阀值bv确定的误差曲面
💻 TXT
字号:
Hough变换对圆的检测2008年05月11日 星期日 12:57Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。


圆的方程为:(x-a)*(x-a)+(y-b)*(y-b)=r*r ,通过Hough变换,将图像空间(x,y)对应到(a,b,r)参数空间 。


Hough对圆的检测程序如下:

function [hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,r_min,r_max,p)


% %%%%%%%%%%%%%%%%%%%%%%%%%%

% input

% BW:二值图像;

% step_r:检测的圆半径步长

% step_angle:角度步长,单位为弧度

% r_min:最小圆半径

% r_max:最大圆半径

% p:以p*hough_space的最大值为阈值,p取0,1之间的数


% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% output

% hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数

% hough_circl:二值图像,检测到的圆

% para:检测到的圆的圆心、半径


[m,n] = size(BW);

size_r = round((r_max-r_min)/step_r)+1;

size_angle = round(2*pi/step_angle);


hough_space = zeros(m,n,size_r);


[rows,cols] = find(BW);

ecount = size(rows);


% Hough变换

% 将图像空间(x,y)对应到参数空间(a,b,r)

% a = x-r*cos(angle)

% b = y-r*sin(angle)

for i=1:ecount

    for r=1:size_r

        for k=1:size_angle

            a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));

            b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));

            if(a>0&a<=m&b>0&b<=n)

                hough_space(a,b,r) = hough_space(a,b,r)+1;

            end

        end

    end

end


% 搜索超过阈值的聚集点

max_para = max(max(max(hough_space)));

index = find(hough_space>=max_para*p);

length = size(index);

hough_circle=zeros(m,n);

for i=1:ecount

    for k=1:length

        par3 = floor(index(k)/(m*n))+1;

        par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;

        par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;

        if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&...

                (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5)

            hough_circle(rows(i),cols(i)) = 1;

        end

    end

end


% 打印结果

for k=1:length

    par3 = floor(index(k)/(m*n))+1;

    par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;

    par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;

    par3 = r_min+(par3-1)*step_r;

    fprintf(1,'Center %d %d radius %d\n',par1,par2,par3);

    para(:,k) = [par1,par2,par3];

end


运行如下程序:

clc,clear all


I = imread('2.bmp');

[m,n,l] = size(I);

if l>1

    I = rgb2gray(I);

end

BW = edge(I,'sobel');

step_r = 1;

step_angle = 0.1;

minr = 20;

maxr = 30;

thresh = 0.7;

[hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,minr,maxr,thresh);


subplot(221),imshow(I),title('原图')

subplot(222),imshow(BW),title('边缘')

subplot(223),imshow(hough_circle),title('检测结果')


运行结果如下:

Center 60 27 radius 20

Center 61 27 radius 20

Center 62 27 radius 20

Center 63 27 radius 20

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -