使用图像中的轮廓创建单独的图像?
Posted
技术标签:
【中文标题】使用图像中的轮廓创建单独的图像?【英文标题】:Creating separate image using a Contour from an image? 【发布时间】:2014-03-10 13:26:16 【问题描述】:我想使用图像中的轮廓创建单独的图像。
我已经看到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;
【问题讨论】:
您的意思是将其保存为具有透明背景的 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
将包含 0
或 255
...不是吗?那怎么会是透明的呢?
@Harris:我已经更新了我正在使用的代码。我正在尝试使用您的方法,但我犯了一些错误。你能建议我,我应该在哪里更改我的代码?
在 8 位图像的情况下,您可以在 0 到 255 之间改变 alpha,其中 0 提供最大透明度,并且随着值增加到 255,图像将变得更加不透明。
@user2756695 查看更新的 alpha 图像希望你会更清楚。
我有一个疑问。实际上我想创建提取图像的直方图(带有透明 BG)。透明背景是因为 alpha 通道....但是该背景仍然有一些 RGB 值..对吗?....所以这些值将有助于基于色调的直方图?...或 alpha=0 的像素会被跳过吗?以上是关于使用图像中的轮廓创建单独的图像?的主要内容,如果未能解决你的问题,请参考以下文章