Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中最大轮廓的选择_Matlab_Image Processing_Contour_Pixels_Supervised Learning - Fatal编程技术网

MATLAB中最大轮廓的选择

MATLAB中最大轮廓的选择,matlab,image-processing,contour,pixels,supervised-learning,Matlab,Image Processing,Contour,Pixels,Supervised Learning,在我的工作过程中,我必须检测寄生虫。我用HSV发现了这种寄生虫,后来把它做成了灰色的图像。现在我也做了边缘检测。我需要一些代码,告诉MATLAB找到最大的轮廓(寄生虫),并使该地区作为黑色像素的其余部分 您可以通过填充每个轮廓周围的孔来选择“最大”轮廓,找出哪个形状为您提供了最大的面积,然后使用最大面积的位置并将其复制到最终图像。正如Benoit_11所建议的,使用-特别是区域和像素列表标志。大概是这样的: im = imclearborder(im2bw(imread('http://i.st

在我的工作过程中,我必须检测寄生虫。我用HSV发现了这种寄生虫,后来把它做成了灰色的图像。现在我也做了边缘检测。我需要一些代码,告诉MATLAB找到最大的轮廓(寄生虫),并使该地区作为黑色像素的其余部分

您可以通过填充每个轮廓周围的孔来选择“最大”轮廓,找出哪个形状为您提供了最大的面积,然后使用最大面积的位置并将其复制到最终图像。正如Benoit_11所建议的,使用-特别是
区域
像素列表
标志。大概是这样的:

im = imclearborder(im2bw(imread('http://i.stack.imgur.com/a5Yi7.jpg')));
im_fill = imfill(im, 'holes');
s = regionprops(im_fill, 'Area', 'PixelList');
[~,ind] = max([s.Area]);
pix = sub2ind(size(im), s(ind).PixelList(:,2), s(ind).PixelList(:,1));
out = zeros(size(im));
out(pix) = im(pix);
imshow(out);
第一行代码直接从StackOverflow读取图像。由于某种原因,该图像也是RGB图像,因此我通过将其转换为二进制。图像周围还有一个白色边框。您很可能在
图中打开了此图像
并保存了该图中的图像。我通过使用删除白色边框来消除此问题

接下来,我们需要填充轮廓环绕的区域,因此使用
标志。接下来,使用
regionprops
分析图像中不同的填充对象-特别是
区域
,以及哪些像素属于填充图像中的每个对象。一旦我们获得这些属性,找到提供最大面积的填充轮廓,然后访问正确的
regionprops
元素,提取出属于对象的像素位置,然后使用这些并将像素复制到输出图像并显示结果

我们得到:


或者,您可以使用
周长
标志(如Benoit_11所示),只需找到对应于最大轮廓的最大周长即可。这仍然会给你你想要的。因此,只需将第三行和第四行代码中的
区域
标记替换为
周长
,您仍然可以得到相同的结果。

这可能是一种方法-

%// Read in image as binary
im = im2bw(imread('http://i.stack.imgur.com/a5Yi7.jpg'));
im = im(40:320,90:375); %// clear out the whitish border you have
figure, imshow(im), title('Original image')

%// Fill all contours to get us filled blobs and then select the biggest one
outer_blob = imfill(im,'holes');
figure, imshow(outer_blob), title('Filled Blobs')

%// Select the biggest blob that will correspond to the biggest contour
outer_blob = biggest_blob(outer_blob); 

%// Get the biggest contour from the biggest filled blob
out = outer_blob & im;
figure, imshow(out), title('Final output: Biggest Contour')
基于
bsxfun
maximum\u blob
功能是此处发布的其他答案使用
regionprops
执行的替代功能。根据我的经验,我发现这种基于
bsxfun
的技术比
regionprops
更快。在我之前的一个答案中,比较这两种技术的运行时性能

关联函数-

function out = biggest_blob(BW)

%// Find and labels blobs in the binary image BW
[L, num] = bwlabel(BW, 8); 

%// Count of pixels in each blob, basically should give area of each blob
counts = sum(bsxfun(@eq,L(:),1:num)); 

%// Get the label(ind) cooresponding to blob with the maximum area 
%// which would be the biggest blob
[~,ind] = max(counts);

%// Get only the logical mask of the biggest blob by comparing all labels 
%// to the label(ind) of the biggest blob
out = (L==ind);

return;
调试映像-


因为我的答案几乎都写出来了,所以我还是会给你的,不过这个想法和@rayryeng的答案很相似

基本上,我在调用
regionprops
期间使用
周长
PixelIdxList
标志,因此在使用
imclearborder
删除图像边界后,获得形成最大轮廓的像素的线性索引

代码如下:

clc
clear


BW = imclearborder(im2bw(imread('http://i.stack.imgur.com/a5Yi7.jpg')));

S= regionprops(BW, 'Perimeter','PixelIdxList');

[~,idx] = max([S.Perimeter]);

Indices = S(idx).PixelIdxList;

NewIm = false(size(BW));

NewIm(Indices) = 1;

imshow(NewIm)
以及输出:


正如你所见,有很多方法可以达到同样的效果,哈哈。

这很模糊,你能详细说明/提供示例图像/代码吗?否则你可能会对我现在添加的图片感兴趣@Benoit_11。我没有写任何代码。我只想有大面积的覆盖线(像腰果形状),并使其余的黑色像素。通过阅读stack overflow上的另一个相关问题,我了解到我应该使用contour,如果我可以编写任何代码来选择大的contour,我可以让它工作。但我不知道该怎么做。哈哈,我写的是完全相同的答案,但带有
周长
标志:)干得好,当然是+1。@Benoit_11-哦,是的!周界也会在这里工作。哦,哈哈。你还是应该把答案放在:)我也会加1。啊
像素idxlist
。聪明。它删除了我不必要的
sub2ind
调用+1.为什么每次运行时都会出现此错误?:???[~,idx]=max([S.周长]);|错误:表达式或语句不正确--可能是不平衡的(,{,或[.Mhh它不应该…看起来还可以。您正是使用此代码吗?啊。
bwlabel
bsxfun
。另一种有效的方法。它不依赖
regionprops
+1。@rayreng是的,这是我能做的!;)我很喜欢你用它来计算每个物体的像素数。好奇:你认为在这种情况下,
accumarray
bsxfun
相比怎么样?可比?更快?更慢?是的,非常聪明的方法我喜欢!当然,
bsxfun
FTW!@rayryeng告诉你!!乍看起来非常适合
histc
,因为这就是histc的目的(计数),这就是我们在这里所做的!