Hough圓檢測的matlab實現


源代碼:

m文件1:

function newPic=hough_circle_main(oldPic)
close all
clear
clc


[filename,pathname]=uigetfile({'*.bmp;*.jpg;*.tif;*.gif'},'newpic');
if isequal(filename,0)
    disp('User selected cancel')
else
    disp(['User selected: ',fullfile(pathname,filename)])
end
root=fullfile(pathname,filename);
oldPic=imread(root);
I=oldPic;


% close all
% clear
% clc

% I=imread('circle.bmp');
[m,n,k] = size(I);
if k>1
    I = rgb2gray(I);
end
BW = edge(I,'sobel');
step_r = 10;
step_angle = 0.1;% 5.7296 degrees
minr = 100;      %need to modify by fact
maxr = 200;      %need to modify by fact
thresh = 0.5;    % 76.8000
[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('檢測結果')

M文件2:

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,'k=%d Center (%d,%d) radius %d\n',k,par2,par1,par3);    
    para(:,k) = [par1,par2,par3];
end   
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章