close all;
clear all;
clc;
DIR='G:\1213\';%图片文件夹路径,最后必须加\
source=dir(strcat(DIR,'*.jpg'));
filenum=size(source,1); %图片个数
p=0;
for k = 2: 70 %需要读取哪个图片到多少个图片,修改这两个数字
p=p+1;
fname = strcat(DIR, strcat('normal',num2str(k)), '.jpg');%图片名称数字前面的字母“normal”,不正常的改为“abnormal”
img = imread(fname);%读取图片
[m,n]=size(img); %查看图像的大小
img=rgb2hsv(img);%rgb转hsv
img1=img(:,:,2);%取色调层
figure(1);imshow(img1);
level=graythresh(img1); %%求二值化的阈值
bw=im2bw(img1,level); %%二值化图像
[m,n]=size(bw); %查看图像的大小
disk = strel('disk',1); %形态修正
bw=imdilate(imerode(bw,disk),disk);
I_bw=bwareaopen(bw,55); %删除二值图像BW中面积小于P的对象。默认情况下conn使用8邻域
[L,num]=bwlabel(I_bw,8);%bwlabel标注二值图像I_bw中的目标物体,返回标识矩阵L和I_bw中目标物体的数量num,8表示连通数.
plot_x=zeros(1,num);%%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的横坐标
plot_y=zeros(1,num);%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的纵坐标
for k=1:num %%num个区域依次统计质心位置
sum_x=0; sum_y=0; area=0; %初始化
for i=1:m
for j=1:n
if L(i,j)==k
sum_x=sum_x+i; %计算第K区域的横坐标总和
sum_y=sum_y+j; %计算第K区域的纵坐标总和
area=area+1; %计算第K区域的由多少个坐标点表示
end
end
end
plot_x(k)=fix(sum_x/area); %计算第K区域的质心横坐标
plot_y(k)=fix(sum_y/area);%计算第K区域的质心纵坐标
end
%-----------------------------------------------
part1(p)={;plot_y};
part2(p)={;plot_x};
c(p)=size(part1{p},2);
if c(p)<3
part1{p}=part1{p-1};
part2{p}=part2{p-1};
end
d(p)=size(part1{p},2);
part3=part1';%每幅图每条鱼y方向的值
part4=part2';%每幅图每条鱼y方向的值
xx(p)=floor(mean(part4{p}));%x方向的平均值
yy(p)=floor(mean(part3{p}));%y方向的平均值
c(p)=size(part3{p},1);
if ((c(p)<3)&&(p>1))
part3{p}=part3{p-1};
end
%------------------------------------------
figure(2);imshow(I_bw);%显示取反后的二值图像(背景为黑色),并在图上标注质心点位置
hold on
plot(yy ,xx, 'r-');
end
figure(3);plot(yy ,m-xx, 'b-')
axis([0 n 0 m])
grid on
grid on;set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',1);%画虚线方格
saveas(gcf,['C:\Users\清风\Desktop\鱼群轨迹测试\','22','.jpg']);%'C:\Users\清风\Desktop\鱼群轨迹测试\'生成的轨迹图片保存路径,最后需加\,'normal'图片名称,可修改
原始图像
提取色调层
二值化
形态修正
单条鱼质心提取
最后轨迹