当前位置:首页 > 哈夫(霍夫)变换
哈夫变换
1、 利用哈夫变换数钱 clc,close all
A=imread('money2.jpg'); A=rgb2gray(A);
A=imresize(A,0.25);
figure,subplot(131),imshow(A),title('原图')
BW = edge(A,'roberts',0.04);
subplot(132),imshow(BW),title('Roberts, thresh=0.04') se1 = strel('square',3);
BW=imdilate(BW,se1);
subplot(133),imshow(BW),title('imdilate,消除边界的不连续') BW=imclearborder(BW);
figure,subplot(131),imshow(BW),title('imclearborder,清除边界上不相关部分') BW2=imfill(BW,'holes');
subplot(132),imshow(BW2),title('imfill,填补空洞') se1 = strel('square',3); BW3=bwperim(BW2);
subplot(133),imshow(BW3),title('bwperim,提取边缘')
[M,N]=size(A);
H=zeros(M,N,round(sqrt(M^2+N^2))); for row=1:M for col=1:N
if(BW3(row,col)~=0) for x0=1:M for y0=1:N
r=round(sqrt((row-x0)^2+(col-y0)^2));%半径 if r~=0
H(x0,y0,r)=H(x0,y0,r)+1;%H是累加器,三维矩阵 end end end end end end
%为了方便观察,将三维参数矩阵根据半径的不同做成不同的帧,制作成视频 for fn=1:360
[C,map]=gray2ind(mat2gray(H(:,:,fn),[0 90]),100); mov(fn)=im2frame(C,map); end
movie2avi(mov,'hough.avi')
figure%在matlab内用动画的方式按半径增长的方式显示霍夫变换得到的三维矩阵 for i = 1:50
imshow(mat2gray(H(:,:,i),[0 90]));title(num2str(i)),drawnow pause(0.3); end
%另一种表示方法,设定恰当的阈值,将超过阈值的点在三维空间标示出来 figure, hold on, [m,n,p]=size(H); for i=1:m i
for j=1:n
for k=1:p/4
if(H(i,j,k)>50)
colors=H(i,j,k)/125*[1 0 0];
plot3(i,j,k,'.','Color',colors,'MarkerSize',6); end end end end
实验结果:
哈夫变换40353025半径201510502001801601401201008010060200300
由上图可见,超过累加器阈值50的点聚集为6个不同的小范围空间内,有3个半径接近21,另外3个半径接近25,假设半径小的是5毛,半径大的是1元,则可以得到结论:图中有
4.5元。
实验总结: 由于不同钱币半径相差很小(比如5角和1元),所以拍照时必须小心排除阴影的干扰
(比如在不同方向的光照下),而且,应该注意相机与钱币的相对角度,使得图片中钱币呈圆形。
附:
视频hough.avi,可以在暴风影音中播放
共分享92篇相关文档