关键词:
【中文标题】如何在MATLAB中选择最大的轮廓【英文标题】:How to select the largest contour in MATLAB 【发布时间】:2015-04-21 06:03:05 【问题描述】:在我的进度工作中,我必须检测寄生虫。我使用 HSV 发现了寄生虫,后来将其制成了灰色图像。现在我也做了边缘检测。我需要一些代码来告诉 MATLAB 找到最大的轮廓(寄生虫)并将该区域的其余部分设为黑色像素。
【问题讨论】:
这很模糊,你能详细说明/提供示例图像/代码吗?否则您可能对regionprops 感兴趣 我现在添加了图片@Benoit_11。我没有写任何代码。我只想在那里有大面积的覆盖线(如腰果形状),并将其余部分变为黑色像素。我通过阅读堆栈溢出时的另一个相关问题了解到我应该使用轮廓,如果我可以编写任何代码来选择大轮廓,我可以让它工作。但我不知道该怎么做。 【参考方案1】:这可能是一种方法 -
%// 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
的函数biggest_blob
是此处发布的其他答案使用regionprops
执行的替代方法。根据我的经验,我发现这种基于bsxfun
的技术比regionprops
更快。 Here are few benchmarks 在我之前的一个答案中比较这两种技术的运行时性能。
关联函数-
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;
调试图像 -
【讨论】:
啊。bwlabel
和 bsxfun
。另一种有效的方法。它不依赖于regionprops
。 +1。
@rayryeng 是的,这就是我能做的! ;)
我很喜欢你用它来计算每个对象有多少像素。好奇:在这种情况下,您认为accumarray
与bsxfun
相比如何?可比?快点?慢一点?
是的,非常聪明的方法,我喜欢它!当然bsxfun
FTW!
@rayryeng 告诉你!!乍一看,histc
看起来很完美,因为这就是 histc 的用途(计数),这就是我们在这里所做的!【参考方案2】:
由于我的答案几乎都写出来了,所以无论如何我都会给你,但这个想法类似于@rayryeng 的答案。
基本上,我在调用regionprops
期间使用Perimeter
和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)
还有输出:
如您所见,有很多方法可以达到相同的效果哈哈。
【讨论】:
啊PixelIdxList
。聪明的。它消除了我打的不必要的sub2ind
电话。 +1。
为什么每次运行都会出现这个错误?:??? [~,idx] = max([S.Perimeter]); |错误:表达式或语句不正确——可能是不平衡的 (、 或 [.
嗯它不应该......它似乎没问题。你使用的正是这段代码?【参考方案3】:
您可以通过填充每个轮廓围绕的孔来选择“最大”轮廓,找出哪个形状为您提供最大的区域,然后使用最大区域的位置并将其复制到最终图像。正如 Benoit_11 所建议的那样,使用 regionprops
- 特别是 Area
和 PixelList
标志。像这样的:
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);
第一行代码直接从 *** 读取图像。由于某种原因,该图像也是 RGB 图像,因此我通过im2bw
将其转换为二进制。图像周围还有一个白色边框。您很可能在figure
中打开了此图像并保存了图中的图像。我通过使用imclearborder
删除白色边框来摆脱这个问题。
接下来,我们需要填充轮廓包围的区域,所以使用imfill
和holes
标志。接下来,使用regionprops
来分析图像中不同的填充对象——具体来说是Area
以及填充图像中每个对象属于哪些像素。一旦我们获得这些属性,找到为您提供最大区域的填充轮廓,然后访问正确的regionprops
元素,提取属于对象的像素位置,然后使用这些并将像素复制到输出图像和显示结果。
我们得到:
或者,您可以使用 Perimeter
标志(如 Benoit_11 所建议的那样),并简单地找到对应于最大轮廓的最大周长。这仍然应该给你你想要的。因此,只需将第三行和第四行代码中的Area
标志替换为Perimeter
,您仍然应该得到相同的结果。
【讨论】:
哈哈,我写的是完全相同的答案,但带有Perimeter
标志:) 做得好,当然+1。
@Benoit_11 - 哦,是的!周边也可以在这里工作。哦,哈哈。你仍然应该把你的答案放在:) 我也会+1。android如何在javaopencv中查找最大轮廓
我们都知道要学opencv必须会C或者C++语言,但是opencv为了照顾我们这些java程序员,整出来了个java-opencv预编译包。说白了,包里面就是一个个用java写的opencv代码,这样我们就可以通过类和对象的方式去调用这个opencv包里面的方法... 查看详情
如何在选择图像中的轮廓时避免对图像(条形)进行分组?
】如何在选择图像中的轮廓时避免对图像(条形)进行分组?【英文标题】:Howtoavoidgroupingimages(bars)whileselectingcontoursinanimage?【发布时间】:2019-05-2714:31:48【问题描述】:我正在从图表图像中提取单个条形的长度。它在大多数情... 查看详情
如何将灰度图像中的轮廓值设置为该轮廓的最大值?
】如何将灰度图像中的轮廓值设置为该轮廓的最大值?【英文标题】:Howtosetthevalueofacontoursinagrayimagetothehighestvalueofthiscontours?【发布时间】:2017-04-0409:20:07【问题描述】:我想将一个轮廓的所有值与该轮廓的最高值相等,为了更... 查看详情
如何在 HALCON 中选择最大的区域?
】如何在HALCON中选择最大的区域?【英文标题】:HowcanIselectthelargestregioninHALCON?【发布时间】:2021-03-0912:13:55【问题描述】:我想从一组区域中选择最大的区域(在本例中为ConnectedRegions)。threshold(Image,Region,250,255)connection(Region,Co... 查看详情
用于在 KMeans 聚类中选择适当数量的聚类的轮廓索引
】用于在KMeans聚类中选择适当数量的聚类的轮廓索引【英文标题】:SilhouetteIndexforselectingapropernumberofclustersinKMeansclustering【发布时间】:2014-02-0207:11:32【问题描述】:我正在使用轮廓索引在KMeans聚类中选择适当数量的聚类。剪影... 查看详情
如何寻找第二大轮廓(代码片段)
在有背景的图像处理中,往往你关注的区域并不是最大的轮廓(那是背景),而是第二大轮廓之前我们有这样的函数://寻找最大的轮廓 VP FindBigestContour(Mat src) &nbs... 查看详情
Caffe:如何选择可以容纳在内存中的最大可用批量大小?
】Caffe:如何选择可以容纳在内存中的最大可用批量大小?【英文标题】:Caffe:howtochoosemaximumavaliblebatchsizethatcanfitinmemory?【发布时间】:2016-10-0811:44:14【问题描述】:由于GPU内存(1Gb)较小,我遇到了一些问题,问题是现在我通过... 查看详情
如何设置可以在 react-select 中选择的最大项目数?
】如何设置可以在react-select中选择的最大项目数?【英文标题】:Howtosetmaxnumberofitemsthatcanbeselectedinreact-select?【发布时间】:2019-08-0218:52:00【问题描述】:我正在使用react-select中的CreatableSelect组件。现在用户可以选择任意数量的... 查看详情
如何在 MATLAB 中找到多维矩阵的最大值或最小值? [复制]
】如何在MATLAB中找到多维矩阵的最大值或最小值?[复制]【英文标题】:HowcanIfindthemaximumorminimumofamulti-dimensionalmatrixinMATLAB?[duplicate]【发布时间】:2011-02-0718:32:00【问题描述】:我在MATLAB中有一个4D测量数组。每个维度代表测量的... 查看详情
如何在 Python OpenCV 中删除轮廓内的轮廓?
】如何在PythonOpenCV中删除轮廓内的轮廓?【英文标题】:HowtoremoveacontourinsidecontourinPythonOpenCV?【发布时间】:2016-09-2513:10:32【问题描述】:Python中的OpenCV提供以下代码:regions,hierarchy=cv2.findContours(binary_image,cv2.RETR_LIST,cv2.CHAIN_APPROX_... 查看详情
如何在 Matlab 中最大限度地利用多线程 CPU?
】如何在Matlab中最大限度地利用多线程CPU?【英文标题】:HowcanIutilizemultithreadCPUmostinMatlab?【发布时间】:2013-09-2404:49:51【问题描述】:我刚买了Matlab并行计算工具箱。命令matlabpoolopen使用我的CPU中的内核数打开并行工作器。但... 查看详情
找到最大的轮廓 OpenCV
】找到最大的轮廓OpenCV【英文标题】:FindlargestcontoursOpenCV【发布时间】:2015-10-2821:18:04【问题描述】:我使用了精巧的边缘检测,并在我尝试处理的图像上找到了轮廓。我想找到五个最大的轮廓,然后看看图像中五个最大的轮... 查看详情
如何在 OpenCV 2.3.1 中使用轮廓?
】如何在OpenCV2.3.1中使用轮廓?【英文标题】:HowtouseContoursinOpenCV2.3.1?【发布时间】:2011-11-2100:56:09【问题描述】:我最近在OpenCV中从使用C接口更改为C++接口。在C接口中,有很多C++中似乎不存在的东西。有谁知道这些问题的解... 查看详情
如何使用 openCV 库在视频中提取清晰的轮廓
】如何使用openCV库在视频中提取清晰的轮廓【英文标题】:HowcanIextractclearcontoursinvideowithopenCVlibrary【发布时间】:2011-12-2721:02:08【问题描述】:大家好,我在从视频中提取清晰轮廓时遇到了一些问题。目前,轮廓看起来像一团糟... 查看详情
如何在数组 matlab 中选择正确的块?
】如何在数组matlab中选择正确的块?【英文标题】:Howtopicktherightblocksinarraymatlab?【发布时间】:2016-08-1305:22:49【问题描述】:我有一些用Matlab编写的代码,我有一个5x5矩阵,其中块(1,1)、(2,2)、(3,3)、(4,4)和(5,5)=1.我将这些块设置... 查看详情
OpenCV跟踪轮廓将整个图像跟踪为最大轮廓?
】OpenCV跟踪轮廓将整个图像跟踪为最大轮廓?【英文标题】:OpenCVtracecontourstracingwholeimageaslargestcontour?【发布时间】:2021-03-1218:10:43【问题描述】:我正在尝试生成用于训练神经网络的数据集,这需要我在视频的多个帧中围绕移... 查看详情
如何在 SQL 中为每个组选择最大行
】如何在SQL中为每个组选择最大行【英文标题】:HowtoselectamaxrowforeachgroupinSQL【发布时间】:2014-05-1205:00:10【问题描述】:我希望选择“grpid”的最大值为“Value”的国家/地区。在检查最大值时,不应将已选择的“国家”用于其... 查看详情
如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列
】如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列【英文标题】:Howtogettotalrowcountandmax(timestamp)columninselectlistforalltableinparticularschema【发布时间】:2016-05-2609:42:05【问题描述】:我们有基于Postgres的只读数... 查看详情