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

Aly*_*Aly 5 c++ opencv visualization

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

我尝试使用MatAurellius建议的4通道8位,这里是代码:

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);
Run Code Online (Sandbox Code Playgroud)

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

Aur*_*ius 5

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

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

其中ij是图像中像素的索引.

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

更新: 您描述的行为是预期的.显然 cv::imshow()不支持透明度.这解释了为什么您显示的图像全部为蓝色.

至于保存的图像,重要的是要记住图像是类型的CV_8UC4.这意味着每个通道元素都存储为uchar.赋值0.5将截断为零,因此保存完全透明的图像.

如果置信度是范围内的浮点值,则将其[0,1]缩放255以将其置于8位图像支持的范围内.从而,

v[3] = 0.5;
Run Code Online (Sandbox Code Playgroud)

v[3] = 0.5 * 255;
Run Code Online (Sandbox Code Playgroud)