通过检测图像中的特定大对象或斑点来裁剪图像?

Asi*_*rif 0 c++ matlab opencv image-processing

请有人帮我解决我的问题.我正在从事基于图像处理的项目,我坚持了一点.我经过一些处理得到了这个图像,为了进一步处理我需要裁剪或检测只鹿并删除其他部分的图像.

这是我的初始形象:

在此输入图像描述

我的结果应该是这样的:

在此输入图像描述

如果我在图像中只获得一个最大的斑点并将其保存为图像,那将会更好.

ray*_*ica 6

看起来你的形象中的鹿几乎连接和关闭.我们可以做的是用于regionprops查找图像中的所有边界框.一旦我们这样做,我们就可以找到给出最大区域的边界框,这可能是你的鹿.一旦我们找到这个边界框,我们就可以裁剪您的图像并完全专注于鹿.因此,假设您的图像存储在im,请执行以下操作:

im = im2bw(im); %// Just in case...
bound = regionprops(im, 'BoundingBox', 'Area'); 

%// Obtaining Bounding Box co-ordinates
bboxes = reshape([bound.BoundingBox], 4, []).';

%// Obtain the areas within each bounding box
areas = [bound.Area].';

%// Figure out which bounding box has the maximum area
[~,maxInd] = max(areas);

%// Obtain this bounding box
%// Ensure all floating point is removed
finalBB = floor(bboxes(maxInd,:));

%// Crop the image
out = im(finalBB(2):finalBB(2)+finalBB(4), finalBB(1):finalBB(1)+finalBB(3));

%// Show the images
figure;
subplot(1,2,1);
imshow(im);
subplot(1,2,2);
imshow(out);
Run Code Online (Sandbox Code Playgroud)

我们慢慢来看看这段代码吧.我们首先将图像转换为二进制以防万一.你的图像可能是强度为0或255的RGB图像......我不能肯定地说,所以我们只是为了以防万一而进行二进制转换.然后regionprops,我们使用BoundingBox属性调用查找图像中每个唯一对象的每个边界框.此边界框是最小跨越边界框,以确保对象包含在其中.每个边界框都是一个4元素数组,其结构如下:

[x y w h]
Run Code Online (Sandbox Code Playgroud)

每个边界框由其在框左上角的原点描绘,表示为xy,其中x是水平坐标,y而是垂直坐标. x从左到右积极y增加,而从上到下积极增加. w,h是边界框的宽度和高度.因为这些点在一个结构中,我提取它们并将它们放入一个单一的1D向量中,然后重新整形它使它成为一个M x 4矩阵.请记住,这是我所知道的唯一方法,可以在没有任何for循环的情况下有效地为每个结构元素提取数组中的值.这将有助于我们更快地进行搜索.我也为该Area物业做了同样的事情.对于我们在图像中的每个边界框,我们还具有封装在边界框内的总面积的属性.

感谢@Shai的现场,我们不能简单地使用边界框坐标来确定是否有一个最大的区域,因为我们可以有一条细的对角线,可以驱动边界框坐标到更高.因此,我们还需要依赖于对象在边界框内占据的总面积.简单地说,它只是对象中包含的所有像素的总和.

因此,我们搜索我们创建的整个区域向量,以查看哪个区域具有最大区域.这对应于你的鹿.找到此位置后,提取边界框位置,然后使用此位置裁剪图像.请记住,边界框值可能具有浮点数.由于图像坐标是基于整数的,我们需要在决定裁剪之前删除这些浮点值.我决定用floor.然后我编写显示原始图像的代码,并显示裁剪结果.

请记住,这在图像中只有一个对象时才有效.如果要查找多个对象,请检查bwboundariesMATLAB.否则,我相信这应该让你开始.

为了完整起见,我们得到以下结果:

在此输入图像描述