精华内容
下载资源
问答
  • 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-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;
        }
    };
    
    展开全文
  • 二值化图像,求最大连通区域,然后分割最大连通区域,用vc++ opencv开发,内有测试图像
  • 有时候要将二值化图像中最大的连通域保存下来,下面函数提供了一种方法:函数%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); %获取最大连通域图像

    原图:

    a2b8b814eec4178a87e66b0e27885ae4.png

    运行:code

    img=maxLianTongYu(I);

    imshow(img);

    获得:blog

    0fa9a246c67881c40c2a79bd30ed73e4.png

    若是返回图像中连通域大小大于阈值的连通域,可用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医学图像的最大连通区域1、代码2、效果 1、代码 #include "itkConnectedComponentImageFilter.h" #include "itkImage.h" #include "itkImageFileReader.h" #include ...

    ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域

    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,简单解法就好
  • (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...
  • 查找二值图像最大连通区域,返回连通域的矩形框
  • 对于图像处理,如器官分割等,获取最大连通区域常常是后处理的最好一步,用于去除其他误分割的小区域。虽然最大连通区域的算法自己写起来也很快,但是,遵循不重复造轮子的代码风格,本文将记录ITK是如何获取最大...
  • 2020校招远景的编程题,二维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:37
    img=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查找二值图中最大连通区域 标签:OpenCVfindCoutours 2014-10-19 22:312802人阅读评论(0)收藏举报 分类: 图像与OpenCV(15) 版权声明:本文为shaoxia...
  • //max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓     //如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种   ...
  • 基于opencv 的提取最大连通区域的函数
  • Matlab找最大连通区域

    千次阅读 2016-03-02 09:42:45
    L = bwlabel(image_bw);%标记连通区域 stats = regionprops(L); Ar = cat(1, stats....%找到最大连通区域的标号 image_bw(find(L~=ind))=0;%将其他区域置为0 figure,imshow(image_bw);%显示最大联通区域
  • 求一个二维数组中最大连通子数组的和

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,140
精华内容 8,056
关键字:

最大连通区域

友情链接: jenfun.zip