图像处理大作业(用霍夫变换检测硬币及统计硬币个数,并设计GUI界面)
实现所给硬币图像中的硬币检测及计数
要求完成功能:自行查找、阅读有关的采用Hough变换来检测图像中圆的资料,设计实现所给图像中圆形的检测,要求检测出图像中硬币个数以及各个硬币的直径。
本题难度系数:★★★★
GUI界面设计参考:MATLAB学习笔记(十一)——MATLAB图形用户界面设计
https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4307777.html
我采用了霍夫变换对所给图形进行了检测和统计个数:
原图如下:
检测后的效果:
部分matlab代码如下:
I = imread('2.jpg');
I=imresize(I,0.5);
[m,n,l] = size(I);
if l == 3
I = rgb2gray(I); %如果为彩色图 则转化为灰度图
end
imshow(I)
I1=im2bw(I,graythresh(I)); %转化为二值图像
figure(1),imshow(I1)
I2=imopen(I1,strel('disk',3)); %开运算 平滑图像边缘
figure(2),imshow(I2)
I3=imfill(~I2,'holes'); %填充图像空洞
%~I2为对I2图像取反 具体效果可以自己看下
%I22=~I2;
%imshow(I22)
figure(3),imshow(I3)
I4=bwareaopen(I3,1500);%删除二值图像BW中面积小于1500的对象(就是图像中面积小于1500的白色块)
figure(4);imshow(I4);
BW = edge(I4,'sobel');
imshow(BW)
step_r = 1;
step_angle = 0.5;
minr =40;
maxr = 150;
thresh = 0.5;
[Hough_Space,Hough_Circle,para] = hough_circle(BW,step_r,step_angle,minr,maxr,thresh);
figure(1),imshow(I),title('原图')
figure(2),imshow(BW),title('边缘')
figure(3),imshow(Hough_Circle),title('检测结果')
circleParaXYR=para;
%输出
fprintf(1,'\n---------------圆统计----------------\n');
[r,c]=size(circleParaXYR);%r=size(circleParaXYR,1);
fprintf(1,' 检测出%d个圆\n',r);%圆的个数
fprintf(1,' 圆心 半径\n');%圆的个数
for n=1:r
fprintf(1,'%d (%d,%d) %d\n',n,floor(circleParaXYR(n,1)),floor(circleParaXYR(n,2)),floor(circleParaXYR(n,3)));
end
%标出圆
figure(4),imshow(I),title('检测出图中的圆')
hold on;
plot(circleParaXYR(:,2), circleParaXYR(:,1), 'r+');
for k = 1 : size(circleParaXYR, 1)
t=0:0.01*pi:2*pi;
x=cos(t).*circleParaXYR(k,3)+circleParaXYR(k,2);y=sin(t).*circleParaXYR(k,3)+circleParaXYR(k,1);
plot(x,y,'r-');
end
完整源码评论私信