我有一个图像,我试图通过将每个像素着色为红色、绿色或蓝色来进行分割。我已经计算了每个像素的置信度分数,并希望调整像素的alpha透明度以反映置信度,即低置信度意味着几乎是透明的。在OpenCV中有没有办法做到这一点?如果没有,有没有人能推荐一个微创库(C++)?
我试过使用奥雷利乌斯建议的4通道8位Mat,代码如下:
cv::Mat m = cv::Mat(20,20, CV_8UC4);
for(int i = 0; i < m.rows; i++){
for(int j = 0; j < m.cols; j++){
Vec4b& v = m.at<Vec4b>(i,j);
v[0] = 255;
v[1] = 0;
v[2] = 0;
v[3] = 0.5;
}
}
imwrite("alpha.png", m);
namedWindow("m");
imshow("m", m);
waitKey(0);显示的图像完全是蓝色的(没有透明度),图像是完全透明的。
发布于 2013-04-24 23:56:32
有很多方法可以做到这一点。一种可能的方法是访问和修改每个单独的像素。假设image是一个四通道8位cv::Mat
auto& pixel = image.at<cv::Vec4b>(i,j);
pixel[3] = confidence;其中i和j是图像中像素的索引。
还有其他可能更优雅的方法,但它们将取决于您当前的代码。
更新:你描述的行为是意料之中的。Apparently cv::imshow()不支持透明度。这就解释了为什么您显示的图像都是蓝色的。
对于保存的图像,重要的是要记住图像的类型是CV_8UC4。这意味着每个通道元素都存储为一个uchar。指定0.5值将截断为零,因此保存的图像是完全透明的。
如果置信度是[0,1]范围内的浮点值,则将其缩放255以将其置于8位图像支持的范围内。因此,
v[3] = 0.5;变成了
v[3] = 0.5 * 255;发布于 2013-04-26 18:52:28
我也遇到过同样的问题,但当我绘制透明形状并通过混合图像来解决它时。我在OpenCV的文档中找到了这个
if you want to paint semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main image.为此,我建议您看一看this文档文章。希望这能有所帮助。
https://stackoverflow.com/questions/16196312
复制相似问题