3

我有一个源图像。我需要从中分割出一个特定的部分并将其保存为另一个图像。我有需要分割的部分的精巧轮廓,但是如何使用它从源图像中剪切部分?我已经附上了源图像和精明的边缘轮廓。请帮助我并建议我一个解决方案。

源图像

精明的边缘

EDIT-1:Alexander Kondratskiy,这就是您填写边界的意思吗?在此处输入图像描述

EDIT-2:根据Kannat,我已经做到了 带有轮廓的源图像

现在如何将轮廓外部和内部的区域分成两个单独的图像?

编辑3-我想到了“和”蒙版和轮廓线源图像。由于我使用的是C,所以我遇到了一些困难。这是我使用的代码,并且:-

            hsv_gray = cvCreateImage( cvSize(seg->width, seg->height), IPL_DEPTH_8U, 1 );                       
                    cvCvtColor( seg, hsv_gray, CV_BGR2GRAY );                       
                    hsv_mask=cvCloneImage(hsv_gray);
            IplImage* contourImg =cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );                      
            IplImage* newImg=cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
            cvAnd(contourImg, hsv_mask,newImg,NULL);

我总是收到大小或类型不匹配的错误。我调整了大小,但似乎无法调整类型,因为一个(hsv_mask)是 1 个通道,其他是 3 个通道。

@kanat-我也尝试了您的 boundingrect,但似乎无法以 C 格式正确输入。

4

2 回答 2

0

您可以填充由精明边缘检测器创建的边界,并将其用作原始图像上的 alpha 蒙版。

于 2015-11-20T06:40:48.067 回答
0

在第二张图像上使用cv::findContours以查找段的轮廓。然后用于cv::boundingRect查找此段的边界框。之后,您可以创建矩阵并将第二张图像中裁剪的边界框保存在其中(我认为它是二进制图像)。要裁剪需要的区域,请使用:

cv::getRectSubPix(your_image, BB_size, cv::Point(BB.x + BB.width/2, BB.y + BB.height/2), new_image). 然后你可以保存new_image使用cv::imwrite. 就是这样。

编辑:

如果您只找到一个轮廓,则使用它(否则您将遍历找到的轮廓的元素)。以下代码显示了步骤,但抱歉我现在无法测试:

std::vector<std::vector<cv::Point>> contours;
// cv::findContours(..., contours, ...);
cv::Rect BB = cv::boundingRect(cv::Mat(contours[0]));
cv::Mat new_image;
cv::getRectSubPix(your_image, BB.size(), cv::Point(BB.x + BB.width/2, 
BB.y + BB.height/2), new_image);
cv::imwrite("new_image_name.jpg", new_image);
于 2015-11-20T07:13:59.393 回答