使用 openCV/C++ 获得孤立形状的凸包

信息处理 图像处理 opencv C++
2022-02-23 07:47:03

我已经分割了 CT 图像,类似于以下图像:

在此处输入图像描述

我想得到一个包含所有白色区域的凸包。类似这个圆圈的东西,但更合适,当然不一定是圆圈。

在此处输入图像描述

我已经尝试过这个例子https://stackoverflow.com/questions/11813352/finding-the-convex-hull-of-an-object-in-opencv但我只有这个输出:

在此处输入图像描述

1个回答

尝试扩张,一种用于在图像中的较暗点上放大光点的技术。

首先扩大图像,使许多放大的白色斑点重叠并形成完整的连接轮廓,如下所示:

在此处输入图像描述

现在,当 OpenCV 从这个大图形中找到轮廓来制作凸包时,它会找到一个完整的圆而不是松散的单独斑点。

在此处输入图像描述

从这里,您可以找到最大的轮廓,即(外部)最大的浅紫色轮廓。

这是此代码(当前计算轮廓,但不是最大区域 - 这只是为了演示膨胀):

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
 Mat src; Mat src_gray;
 src = imread( "convex.jpg", 1 );
 //resize(src, src, Size(640,480), 0, 0, INTER_CUBIC);
 cvtColor( src, src_gray, CV_BGR2GRAY );

 namedWindow( "Source", CV_WINDOW_AUTOSIZE );



 //Dilate
 int erosion_size =10;
  Mat element = getStructuringElement(cv::MORPH_ELLIPSE,
        cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1),
        cv::Point(erosion_size, erosion_size) );

 dilate(src_gray,src_gray,element);

 imshow( "Source", src_gray );

 // Convex Hull implementation
 Mat src_copy = src_gray.clone();
 Mat threshold_output;
 vector<vector<Point> > contours;
 vector<Vec4i> hierarchy;

 // Find contours
 threshold( src_gray, threshold_output, 200, 255, THRESH_BINARY );
 findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

 // Find the convex hull object for each contour
 vector<vector<Point> >hull( contours.size() );
 for( int i = 0; i < contours.size(); i++ )
 {  convexHull( Mat(contours[i]), hull[i], false ); }

 // Draw contours + hull results
 RNG rng;
 Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
 for( int i = 0; i< contours.size(); i++ )
 {
  Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
  //drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
  drawContours( drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
 }

 // Show in a window
 namedWindow( "Hull demo", CV_WINDOW_AUTOSIZE );
 imshow( "Hull demo", drawing );

 waitKey(0);
 return(0);
}