OpenCV:如何设置像素的alpha透明度

时间:2013-04-24 15:40:23

标签: c++ opencv visualization

我想要通过将每个像素着色为红绿色或蓝色来分割图像。我已经计算了每个像素的置信度分数,并且想要调整像素的α透明度以反映置信度,即低置信度意味着几乎透明。有没有办法在OpenCV中执行此操作?如果没有,任何人都可以建议一个微创图书馆(C ++)?

我尝试使用Aurellius建议的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);

显示的图像全部为蓝色(无透明度),图像完全透明。

2 个答案:

答案 0 :(得分:5)

有很多方法可以实现这一目标。一种可能的方式是访问和修改每个单独的像素。假设image是一个四通道,8位cv::Mat

auto& pixel = image.at<cv::Vec4b>(i,j);
pixel[3] = confidence;

其中ij是图片中像素的索引。

还有其他方法可能更优雅,但它们将取决于您当前的代码。

<强>更新 您描述的行为是可以预期的。 Apparently cv::imshow()不支持透明度。这就解释了为什么您显示的图像都是蓝色的。

对于保存的图像,请务必记住图像的类型为CV_8UC4。这意味着每个通道元素都存储为uchar。分配值0.5将截断为零,因此保存完全透明的图像。

如果您的置信度是[0,1]范围内的浮点值,请将其缩放255以将其置于8位图像支持的范围内。因此,

v[3] = 0.5;

变为

v[3] = 0.5 * 255;

答案 1 :(得分:3)

我也有同样的问题,但是在绘制透明形状时通过混合图像来解决它。 我在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文档文章。希望这会有所帮助。