使用图像中的轮廓创建单独的图像?

Posted

技术标签:

【中文标题】使用图像中的轮廓创建单独的图像?【英文标题】:Creating separate image using a Contour from an image? 【发布时间】:2014-03-10 13:26:16 【问题描述】:

我想使用图像中的轮廓创建单独的图像。

我已经看到herehere的答案了,但是使用它们后背景会变黑。

但我想要一个透明的背景,因为我必须进一步处理那些黑色会产生问题的图像。

问题:如何为提取的图像获得透明背景。

目前我正在使用以下代码,虽然我能够创建一个单独的图像但具有黑色背景:

Mat findRect::extractImage( int min_x, int min_y , int rows, int cols , Mat frame, vector<Point> ROI_Poly)

    Mat mask = Mat::zeros(frame.rows, frame.cols, CV_8UC1);

    // Fill polygon white
    fillConvexPoly(mask, &ROI_Poly[0], ROI_Poly.size(), 255, 8, 0);                 

    // Create new image for result storage
    Mat imageDest = cvCreateMat(frame.rows, frame.cols, CV_8UC3);

    // Cut out ROI and store it in imageDest
    frame.copyTo(imageDest, mask);  

    // Extracting the ROI only 
    roi = Rect (min_x, min_y, cols, rows);
    Mat detectedSquare;


    if( 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= frame.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= frame.rows )
        detectedSquare= imageDest(roi);

    //imshow("extracted image" , detectedSquare);
    return detectedSquare;

【问题讨论】:

您的意思是将其保存为具有透明背景的 png 文件? OpenCV 不知道透明的“颜色”,但您可以命名一个您解释为透明的颜色值和/或在进一步计算中使用遮罩。 【参考方案1】:

所以你已经有了轮廓和 3 通道源图像。

    现在只需通过绘制轮廓并反转它来创建单通道图像,这将代表您的 Alpha 通道。

    假设您已经将源图像复制到具有黑色背景的新 Mat 中,只需将此图像拆分为大小为 3 的 Mat 数组。

    现在您有了三个主通道 R、G、B 和 Alpha。

    现在只需将所有这些合并到一个新的 Mat 中。

完成! .

见下面的代码,这里我使用阈值创建了 alpha,而不是你必须使用轮廓图。

Mat src=imread("src.png",1);
Mat dst;
Mat tmp,alpha;

cvtColor(src,tmp,CV_BGR2GRAY);
threshold(tmp,alpha,10,255,THRESH_BINARY);

Mat rgb[3];
split(src,rgb);

Mat rgba[4]=rgb[0],rgb[1],rgb[2],alpha;
merge(rgba,4,dst);

BGR 来源

背景 Alpha(0 = 完全透明,255 = 不透明)

带有背景 alpha 的结果

【讨论】:

我对这个 Alpha 通道有点困惑。 Mat alpha 将包含 0255...不是吗?那怎么会是透明的呢? @Harris:我已经更新了我正在使用的代码。我正在尝试使用您的方法,但我犯了一些错误。你能建议我,我应该在哪里更改我的代码? 在 8 位图像的情况下,您可以在 0 到 255 之间改变 alpha,其中 0 提供最大透明度,并且随着值增加到 255,图像将变得更加不透明。 @user2756695 查看更新的 alpha 图像希望你会更清楚。 我有一个疑问。实际上我想创建提取图像的直方图(带有透明 BG)。透明背景是因为 alpha 通道....但是该背景仍然有一些 RGB 值..对吗?....所以这些值将有助于基于色调的直方图?...或 alpha=0 的像素会被跳过吗?

以上是关于使用图像中的轮廓创建单独的图像?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中的图像处理 —— 轮廓入门+轮廓特征

使用核心图形创建带有轮廓的图像

OpenCV图像的轮廓

opencv 5 图像轮廓与图像分割修复 2 使用多边形将轮廓包围

教你如何使用 OpenCV检测图像中的轮廓

教你如何使用 OpenCV检测图像中的轮廓