一、课题方案设计
1.将图像转换到HSV空间。球体和阴影的饱和度方面具有较大的差异,因此可借助饱和度来达到去除各球的阴影部分的干扰;
2.对图像进行二值化,和依据饱和度进行阈值分割,通过形态学运算形成二值化模板;
3.根据圆形度找到篮球和网球;
4.根据半径分别出篮球和网球。
二、具体实现
1.方法简述
将图像转换到HSV空间。球体和阴影的饱和度方面具有较大的差异,因此可借助饱和度来达到去除各球的阴影部分的干扰;对图像进行二值化,和依据饱和度进行阈值分割,通过形态学运算形成二值化模板。
(1)预处理
clc;clear;close all
image=imread("qiu.png");%读取图像
[high,width,c]=size(image);banjing=zeros(1,3);%获取图像长宽及创建存储半径的数组
BW=1-im2bw(image,240/255);
sigma=0.1;
hsvimage = rgb2hsv(image);%转换到HSV空间处理
s = hsvimage(:,:,2);
BW(s<65/256 | s>245/256) = 0;%对饱和度设定阈值,去除阴影的影像
BW=bwareaopen(BW,500);%进行形态学开运算
BW=imclose(BW,strel('disk',5));%闭运算
BW=imfill(BW,'hole'); %填充图像区域及孔
figure,imshow(BW),title('阈值分割后二值化模板');%显示二值化模板
[B,L]=bwboundaries(BW); %获取边缘
figure,imshow(image),title('提取目标');
STATS=regionprops(L,'Area','Centroid','BoundingBox');
STATS=regionprops(L,'Area','Centroid','BoundingBox');
(2)找到篮球和网球
a.方法简述
对圆形度、面积和半径设定对应的阈值,找出篮球和网球。
b.程序代码
len=length(STATS);
hold on
% 根据圆形度和半径判断篮球和网球
for i=1:len
R=STATS(i).Area/(STATS(i).BoundingBox(3)*STATS(i).BoundingBox(4));
boundary=fliplr(B{i});
everylen=length(boundary);
F=4*pi*STATS(i).Area/(everylen^2);
dis=pdist2(STATS(i).Centroid,boundary,'euclidean');
miu=sum(dis)/everylen;
C=miu/sigma;
if R>pi/4-0.1 && R<pi/4+0.1 && F>1 && C>10
rectangle('Position',[STATS(i).Centroid(1)-miu,STATS(i).Centroid(2)-miu,2*miu,2*miu],'Curvature',[1,1],'EdgeColor','r','LineWidth',2);
banjing(i)=miu;
plot(STATS(i).Centroid(1),STATS(i).Centroid(2),'r*');
t(i)=text(STATS(i).Centroid(1)-15,STATS(i).Centroid(2),'网球','Color','red','FontSize',15);
end
end
[M,I]=max(banjing);
plot(STATS(I).Centroid(1),STATS(I).Centroid(2),'g*');
t(I).String='篮球';
t(I).FontSize=30;
t(I).Color='b';
hold off
三、结果与分析
依据饱和度进行设定阈值分割后,可以有效的排除阴影对后续圆形度、半径的判断的影响。如结果图,我们可以得到与实际球体较为接近的二值化模板,最后的识别结果也与实际较吻合。