我在for
循环中调用一些图像,然后对这些图像进行一些处理。之后,我使用step
函数在视频播放器中显示这些帧及其掩码。如何在蒙版图像中为对象添加边界?另外,如何使边界更粗并在掩模图像中绘制掩模中每个斑点的质心?下面是代码的草图。
videoPlayer = vision.VideoPlayer();
maskPlayer = vision.VideoPlayer();
for ii = 1:nfiles
filenameii = [............]
frame= imread(filenameii);
mask = dOB(frame,BackgroundImg);
% some processing on the images
mask= bwareaopen(mask,27);
boundaries = bwboundaries(mask,'noholes');
B=boundaries{1};
Centroid = regionprops(mask,'centroid');
Centroids = cat(1, Centroid.Centroid);
plot(B(:,2),B(:,1),'g','LineWidth',3);
plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10); step(videoPlayer,frame);
step(maskPlayer, mask);
P.S:我知道如何使用hold on
在图形上显示它,但我希望在图像上直接显示它,然后再将其显示在视频播放器中。任何指导都将不胜感激。
答案 0 :(得分:2)
在视频播放器中显示像素之前,首先只需在面具上绘制像素。你有什么工作,但它将绘制掩模播放器图中的边界。因此,请从bwboundaries
获取您检测到的边界,从这些坐标创建线性索引,并将图像中的值设置为白色。更简单的方法是使用您检测到的掩码并使用bwperim
自动生成包含斑点边界的掩码。我也看到你正在填充面具的孔,所以你可以直接在后处理的输出上使用imfill
,这样它就会给你一个图像而不是坐标。然后,您可以使用此蒙版直接索引到图像中,并将斑点边界的坐标设置为所需的颜色。如果您希望使周边更厚,使用适当大小的方形结构元素imdilate
进行简单的图像扩张将有所帮助。只需将此结构元素的邻域大小定义为您所需的周长。最后,如果要将质心插入到蒙版中,并且因为您拥有MATLAB计算机视觉系统工具箱,请使用insertMarker
功能,以便您可以为每个质心使用一组点并将它们直接放在图像中。但是,您必须确保将掩码从logical
更改为更适合图像的数据类型。 uint8
应该有效。因此,将图像转换为此类型,然后将所有非零值乘以255,以确保在蒙版中保持白色。使用insertMarker
,您希望插入大小为10的红色加号,因此我们需要确保调用insertMarker
来反映这一点。此外,因为你想要一个彩色图像,你必须人工制作颜色的颜色,并为每个平面单独绘制你想要的颜色。由于您需要绿色,因此对应于(0,255,0)
的RGB值。
因此,我已修改您的代码,以便它执行此操作。另外,我计算了填充蒙版的质心而不是原始蒙版。我们不想错误地报告有间隙的物体的质心......除非这是你的目标,但让我们假设你不是:
videoPlayer = vision.VideoPlayer();
maskPlayer = vision.VideoPlayer();
% New - Specify colour you want
clr = [0 255 0]; % Default is green
% New - Define thickness of the boundaries in pixels.
thickness = 3;
% New - Create structuring element
se = strel('square', thickness);
for ii = 1:nfiles
filenameii = [............]
frame = imread(filenameii);
mask = dOB(frame, BackgroundImg);
% some processing on the images
mask = bwareaopen(mask,27);
%boundaries = bwboundaries(mask,'noholes');
%B=boundaries{1};
% New code - fill in the holes
mask = imfill(mask, 'holes');
Centroid = regionprops(mask,'centroid');
% New code - Create a boundary mask
mask_p = bwperim(mask, 8);
% New code - Make the boundaries thicker
mask_p = imdilate(mask_p, se);
% New code - create a colour image out of the mask
[red, green, blue] = deal(255*uint8(mask));
% Paint the perimeter of the blobs in the desired colour
red(mask_p) = clr(1); green(mask_p) = clr(2); blue(mask_p) = clr(3);
Centroids = cat(1, Centroid.Centroid);
%plot(B(:,2),B(:,1),'g','LineWidth',3);
%plot(Centroids(:,1), Centroids(:,2), 'r+', 'MarkerSize', 10);
% New - Make mask into RGB image for marker painting and to
% show to the user
mask_p = cat(3, red, green, blue);
% New - Insert the centroids directly in the mask image
mask_p = insertMarker(mask_p, Centroids, '+', 'color', 'r', 'size', 10);
step(videoPlayer, frame);
% New - Show new mask in the player
step(maskPlayer, mask_p);
end