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

时间:2014-03-10 13:26:17

标签: opencv image-processing

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

我已经看到了答案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;
}

1 个答案:

答案 0 :(得分:1)

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

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

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

  3. 现在您有三个主要频道R,G,B和Alpha。

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

  5. 完成!

    见下面的代码,这里我使用阈值创建了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来源

    BGR source

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

    enter image description here

    背景字母

    的结果

    Result with background alpha