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

6
我有一张图片,我想通过给每个像素着色为红、绿或蓝来分割它。我已经为每个像素计算了置信度分数,并希望调整像素的alpha透明度以反映置信度,即低置信度意味着几乎透明。在OpenCV中有没有办法做到这一点?如果没有,有人能建议一个最小侵入式库(C++)吗?
我尝试使用了一个4通道8位的Mat,正如Aurellius所建议的那样,下面是代码:
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个回答

5

有许多方法可以完成这个任务。一种可能的方法是访问和修改每个单独的像素。假设image是一个四通道、8位cv::Mat

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

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

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

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

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

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

v[3] = 0.5;

变成

v[3] = 0.5 * 255;

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.

为了达到这个目的,我建议您查看这篇文档文章。希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接