我想使用图像中的Contours创建单独的图像。
我已经看到了答案here和here,,但通过使用它们,背景变为黑色。
但我希望有一个透明的背景,因为我必须进一步处理那些黑色会造成问题的图像。
问题:如何为提取的图像获取透明背景。
目前我正在使用以下代码,虽然我可以创建一个单独的图像但黑色背景:
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;
}
答案 0 :(得分: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 =无透明)
背景字母
的结果