1.目的:利用Matlab提取视频图像中小鼠的质心坐标,从而追踪小鼠运动轨迹。
2.原本方案:根据小鼠身体为黑色的特性,利用图像的灰度,调控阈值得到视频图像中所有黑色物体的ROI,最终根据ROI大小判断小鼠身体所在ROI。
for k = 1 : length(frame_need)% 读取所有帧
frame = read(V,frame_need(k));
frame=frame(p(2):p(2)+p(4),p(1):p(1)+p(3),:);
frame_1=rgb2gray(frame);
frame_1=frame_1<Threshold;%进行逻辑判断,亮度小于阈值=1,否者为=0
frame_1=bwareaopen(frame_1,650);% 取图像I内连通区域大于100的区域
ROI=regionprops(frame_1);%测量图像内区域的特征
S=size(ROI);
if S(1)==0 %鼠没有被识别出来
Cent_all(k,:)=NaN;%鼠质心为空
Box_all(k,:)=NaN;
end
figure(1)
imshow(frame);
if S(1)==1 %老鼠被识别出来
[~,index] = max([ROI.Area]);
Cent_all(k,:)=ROI(index).Centroid;%记录每一帧老鼠质心
Box_all(k,:)=ROI.BoundingBox;
hold on;%在原图基础上继续画图
scatter(Cent_all(:,1),Cent_all(:,2),5,'MarkerEdgeColor'...
,'none','MarkerFaceColor',[1 0 0],'LineWidth',0.1);rectangle('Position',ROI.BoundingBox,'EdgeColor','b');
hold off%显示逻辑判断后的图像
end
end
3.出现的问题:视频图像中出现面积较大的固定的黑色背景区域,但该区域ROI和小鼠身体区域的ROI无法区分开。
4.原本处理方法:对视频图像进行预处理,即用其他的视频剪辑软件将黑色背景用浅色图像进行遮掩。再重新利用matlab,此时利用图像的灰度,调控阈值,可以得到小鼠的ROI,从而得到小鼠质心坐标。
5.最终问题:是否可以不用视频预处理的方法,而全程使用matlab代码,过滤掉大块的黑色背景物体,找到每一帧图像中小鼠的质心坐标?
补充
(图为原始视频某一帧图像,转为灰度图后通过阈值大小的条件,转换而成的新的图像,图中圆筒物体旁边的椭圆长条为小鼠。但是背景中固定位置的物体即圆筒的ROI面积不比小鼠面积小,所以难以直接选取到小鼠的ROI)