-
2020-12-21 14:24:48
【实例简介】查找二值图像最大连通区域,返回连通域的矩形框
【实例截图】
【核心代码】
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
CvRect FindMaxContour(IplImage *pImg)
{
IplImage* pContourImg = NULL;
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contour = 0;
CvSeq *contmax = 0;
int mode = CV_RETR_EXTERNAL;
int area,maxArea = 10;//设面积最大值大于10Pixel
CvRect aRect;
cvFindContours( pImg, storage, &contour, sizeof(CvContour),mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
for(;contour;contour = contour->h_next)
{
area = fabs(cvContourArea( contour, CV_WHOLE_SEQ )); //获取当前轮廓面积
//printf("area == %d\n", area);
if(area > maxArea)
{
contmax = contour;
maxArea = area;
}
}
aRect = cvBoundingRect( contmax, 0 );
return aRect;
}
int main( int argc, char** argv )
{
//声明IplImage指针
IplImage* pImg = cvLoadImage("black.jpg",0);
IplImage* pImg_tmp = cvLoadImage("black.jpg",0);
pImg_tmp =cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
cvCopy(pImg,pImg_tmp);
CvRect aRect;
aRect = FindMaxContour(pImg_tmp);
CvPoint pt1;
CvPoint pt2;
pt1.x = aRect.x;
pt1.y = aRect.y;
pt2.x = aRect.x aRect.width;
pt2.y = aRect.y aRect.height;
cvRectangle(pImg,pt1,pt2,CV_RGB(255,255,255));
//显示图像
cvShowImage( "contour", pImg );
cvWaitKey(0);
//销毁窗口
cvDestroyWindow( "src" );
cvDestroyWindow( "contour" );
//释放图像
cvReleaseImage( &pImg );
return 0;
}
更多相关内容 -
opencv 查找连通区域 最大面积实例
2020-09-16 18:31:21主要介绍了opencv 查找连通区域 最大面积实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
算法题_寻找最大连通区域
2020-09-17 15:15:49思路:深度搜索(dfs)。 接下来我们用C++进行编程: ... * 获取最大连通区域 * @param data int整型vector<vector<>> 二维数组 * @return int整型 */ int getMaxArea(vector<vector<int>..思路:深度搜索(dfs)。
接下来我们用C++进行编程:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 获取最大连通区域 * @param data int整型vector<vector<>> 二维数组 * @return int整型 */ int getMaxArea(vector<vector<int> >& data) { // write code here int ans = 0; for (int i = 0; i != data.size(); ++i) { for (int j = 0; j != data[0].size(); ++j) ans = max(ans, dfs(data, i, j)); } return ans; } int dfs(vector<vector<int>>& grid, int cur_i, int cur_j) { if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1) return 0; grid[cur_i][cur_j] = 0; int di[4] = {0, 0, 1, -1}; int dj[4] = {1, -1, 0, 0}; int ans = 1; for (int index = 0; index != 4; ++index) { int next_i = cur_i + di[index], next_j = cur_j + dj[index]; ans += dfs(grid, next_i, next_j); } return ans; } };
-
求最大连通区域,然后分割最大连通区域
2009-07-30 17:09:40二值化图像,求最大连通区域,然后分割最大连通区域,用vc++ opencv开发,内有测试图像 -
Matlab获得二值图像中最大连通区域
2021-04-18 03:41:00有时候要将二值化图像中最大的连通域保存下来,下面函数提供了一种方法:函数%function [img]=maxLianTongYu(I):求图像中最大的连通域%输入:I 输入图像%输出:img 仅包含最大连通域的图像function [img]=...有时候要将二值化图像中最大的连通域保存下来,下面函数提供了一种方法:函数
%function [img]=maxLianTongYu(I):求图像中最大的连通域
%输入:I 输入图像
%输出:img 仅包含最大连通域的图像
function [img]=maxLianTongYu(I)
if length(size(I))>2
I = rgb2gray(I);
end
if ~islogical(I)
imBw = im2bw(I); %转换为二值化图像
else
imBw = I;
end
imBw = im2bw(I); %转换为二值化图像
imLabel = bwlabel(imBw); %对各连通域进行标记
stats = regionprops(imLabel,'Area'); %求各连通域的大小
area = cat(1,stats.Area);
index = find(area == max(area)); %求最大连通域的索引
img = ismember(imLabel,index); %获取最大连通域图像
原图:
运行:code
img=maxLianTongYu(I);
imshow(img);
获得:blog
若是返回图像中连通域大小大于阈值的连通域,可用matlab自带函数:BW2 = bwareaopen(BW, P)索引
或:io
%function [img]=chooseLianTongYu(I,thres): 返回图像中连通域大小大于阈值的连通域
%输入:I 输入图像 thres 阈值
%输出:img 图像中连通域大小大于阈值的连通域
function [img]=chooseLianTongYu(I,thres)
if length(size(I))>2
I = rgb2gray(I);
end
if ~islogical(I)
imBw = im2bw(I); %转换为二值化图像
else
imBw = I;
end
imLabel = bwlabel(imBw); %对各连通域进行标记
stats = regionprops(imLabel,'Area'); %求各连通域的大小
area = cat(1,stats.Area);
index = find(area > thres); %求连通域大小大于阈值的索引
img = ismember(imLabel,index(:)); %获取指定连通域
-
ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域
2021-12-28 16:10:00ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域1、代码2、效果 1、代码 #include "itkConnectedComponentImageFilter.h" #include "itkImage.h" #include "itkImageFileReader.h" #include ...1、代码
#include "itkConnectedComponentImageFilter.h" #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkImageRegionIterator.h" #include "itkLabelShapeKeepNObjectsImageFilter.h" using namespace std; void print(const std::string& file, itk::Image<unsigned char, 2>* image) { ofstream fout(file); auto size = image->GetBufferedRegion().GetSize(); for (auto i = 0; i < size[0]; i++) { for (auto j = 0; j < size[1]; j++) { itk::Image<unsigned char, 2>::IndexType index{ {i,j} }; auto c = image->GetPixel(index); fout << (int)c; } fout << std::endl; } } int main(int argc, char *argv[]) { // 1、获取二值化的分割结果mask const char* input_path = "D:/documents/vs2019/itk_tutorial/largestcompent/build/RelWithDebInfo/left_femur.nrrd";// 图像保存的路径 using ImageType = itk::Image<unsigned char, 3>; using ReaderFilter = itk::ImageFileReader<ImageType>; auto reader = ReaderFilter::New(); reader->SetFileName(input_path); reader->Update(); ImageType::Pointer image = reader->GetOutput(); // 2, 调用ITK的itkConnectedComponentImageFilter using ConnectedComponentFilter = itk::ConnectedComponentImageFilter<ImageType, ImageType>; auto connnectedComponentFilter = ConnectedComponentFilter::New(); connnectedComponentFilter->SetInput(image); connnectedComponentFilter->Update(); // 3,调用ITK的itkLabelShapeKeepNObjectsImageFilter using LabelShapeKeepNObjectsFilter = itk::LabelShapeKeepNObjectsImageFilter<ImageType>; auto labelShapeKeepNObjectsFilter = LabelShapeKeepNObjectsFilter::New(); labelShapeKeepNObjectsFilter->SetInput(connnectedComponentFilter->GetOutput()); labelShapeKeepNObjectsFilter->SetBackgroundValue(0); labelShapeKeepNObjectsFilter->SetNumberOfObjects(1); labelShapeKeepNObjectsFilter->SetAttribute( LabelShapeKeepNObjectsFilter::LabelObjectType::NUMBER_OF_PIXELS); labelShapeKeepNObjectsFilter->Update(); // 4、将Label便签转换为1 typedef itk::RescaleIntensityImageFilter<ImageType, ImageType> RescaleFilterType; RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); rescaleFilter->SetOutputMinimum(0); rescaleFilter->SetOutputMaximum(1); rescaleFilter->SetInput(labelShapeKeepNObjectsFilter->GetOutput()); rescaleFilter->Update(); //ImageType::Pointer largestccimage = rescaleFilter->GetOutput(); // 5,保存最大连通区域图像 const char* out_path = "D:/documents/vs2019/itk_tutorial/largestcompent/build/RelWithDebInfo/output.nii.gz"; // 保存输出结果的路径 using WriterFilter = itk::ImageFileWriter<ImageType>; auto writer = WriterFilter::New(); writer->SetFileName(out_path); writer->SetInput(rescaleFilter->GetOutput()); writer->Update(); return EXIT_SUCCESS; }
2、效果
原始图像:
去除小连通域之后
参考:基于C++和ITK获取2D或3D医学图像的最大连通区域(完整代码)
3、主要函数介绍
itk::ConnectedComponentImageFilter<ImageType, OutputImageType>;
该filter值检测连通区域,不编号,不排序。
itk::LabelShapeKeepNObjectsImageFilter;
该filter对连通区域进行排序,然后只保留最大的几个连通区域。
itk::LabelImageToShapeLabelMapFilter< OutputImageType, LabelMapType> ;
为保留的每个连通区域打上标签(标号),编号顺序为找到不同区域的顺序.
虽然LabelShapeKeepNObjectsImageFilter调用SetAttribute 之后,按照attribute对连通区域大小进行了排序,但该排序并不反映在label上。即大的label并不一定对应大的size。反映在 SetNumberOfObjects(n) 设定保留区域之后,只保留排序后前n个区域的label。
itk::RescaleIntensityImageFilter<OutputImageType, ImageType>;
上一步图像只有标签,图像上没有直接的区别,本步对保留下来的不同连通区域进行不同的染色,以示区分。
参考:二维ITK连通区域提取
-
MATLAB求图像最大连通区域程序
2010-11-10 16:44:33求出一幅图像中最大连通区域的MATLAB源程序 -
图像处理中最大连通区域的求解
2017-02-11 11:30:41在matlab中有对图像的连通区域进行求解的函数,即bwlabel。但是opencv里好像没有,所以这里自己实现一下,方便以后使用。 首先,我回顾一下bwlabel的参数和用法: L =bwlabel(BW,n) 返回一个和BW大小相同的L... -
skimage.measure求最大连通区域
2019-08-01 15:52:09#最大连通区域的bounding box minr, minc, maxr, maxc = props[index].bbox#[minr, maxr),[minc, maxc) #最大连通区域中的原始值 classPlat = testa0[minr,minc]-1 print(props[index].bbox) print(classPlat) ... -
matlab如何给连通分量编号并求数目,保留最大连通区域
2021-07-01 10:45:46保留最大连通区域后,如何进行孔洞填充,孩子没学过多少matlab,简单解法就好 -
给一个二值图,求出最大连通区域(可用深度优先和广度优先算法)
2019-05-19 09:43:52(2)求最大连通区域的算法 (3)代码实现,以及DFS 和BFS (4) OpenCV中连通域的求解(C++ & Python) (1)二值图 二值图像,顾名思义就是图像的亮度值只有两个状态:黑(0)和白(255... -
【Python】找到最大连通区域,并画出bounding box
2019-07-17 21:59:17一、找出图片的最大连通区域 原始图像 mask = get_mask() # 进行图像的二值化处理 max_value = np.max(mask) #print(max_value) ret, ee = cv2.threshold(mask, 0.15*max_value, max_value, cv2.THRESH_BINARY... -
查找二值图像最大连通区域
2012-11-29 13:23:58查找二值图像最大连通区域,返回连通域的矩形框 -
基于C++和ITK获取2D或3D医学图像的最大连通区域(完整代码)
2020-08-11 16:55:30对于图像处理,如器官分割等,获取最大连通区域常常是后处理的最好一步,用于去除其他误分割的小区域。虽然最大连通区域的算法自己写起来也很快,但是,遵循不重复造轮子的代码风格,本文将记录ITK是如何获取最大... -
二维矩阵求最大连通区域面积(python)
2019-09-12 20:36:332020校招远景的编程题,二维01矩阵,横竖算相连,找最大的连通区域。 思路:用一个visited列表保存已经找过的点,对没找的点,如果是1,用递归方式按上下左右四个方向找可以连在一起的点,存入一个列表,不断比较这... -
matlab找到图像的最大连通区域
2017-02-22 23:26:07必须内部是填满的,封闭的一个区域。 方法一: im4=imfill(im3,'holes'); [L,num]=bwlabel(im4,4); x=zeros(1,num); for ii=1:num x(ii)=sum(sum(L==ii)); end [m,ind]=max(x); bw_img=(L==ind); ... -
Matlab得到二值图像中最大连通区域
2017-07-09 15:55:00有时候要将二值化图像中最大的连通域保存下来。以下函数提供了一种方法: %function [img]=maxLianTongYu(I):求图像中最大的连通域 %输入:I 输入图像 %输出:img 仅包括最大连通域的图像 function [img]=... -
【matlab】求图像的最大连通区域
2016-08-27 19:58:37img=imread('2.jpg'); figure(1) imshow(img); img=rgb2gray(img); img=im2bw(img); imLabel = bwlabel(img); %对各连通域进行标记 stats = regionprops(imLabel,'Area'); %求各连通域的大小 area = cat(1,stats -
使用OpenCV查找二值图中最大连通区域
2016-03-01 10:23:00使用OpenCV查找二值图中最大连通区域 标签:OpenCVfindCoutours 2014-10-19 22:312802人阅读评论(0)收藏举报 分类: 图像与OpenCV(15) 版权声明:本文为shaoxia... -
OpenCV计算连通区域数目与最大连通区域并标示出
2016-01-29 10:39:57//max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓 //如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种 ... -
基于opencv找到最大连通区域函数
2012-08-03 19:31:53基于opencv 的提取最大连通区域的函数 -
Matlab找最大连通区域
2016-03-02 09:42:45L = bwlabel(image_bw);%标记连通区域 stats = regionprops(L); Ar = cat(1, stats....%找到最大连通区域的标号 image_bw(find(L~=ind))=0;%将其他区域置为0 figure,imshow(image_bw);%显示最大联通区域 -
求二维数组中的最大连通子数组的和
2016-04-18 10:58:29求一个二维数组中最大连通子数组的和