【问题标题】:OpenCV: how to set alpha transparency of a pixelOpenCV:如何设置像素的 alpha 透明度
【发布时间】:2013-04-18 06:13:19
【问题描述】:

我有一个图像,我试图通过将每个像素着色为红绿色或蓝色来进行分割。我计算了每个像素的置信度分数,并想调整像素的 alpha 透明度以反映置信度,即低置信度意味着几乎透明。有没有办法在 OpenCV 中做到这一点?如果没有,任何人都可以建议一个微创库(C++)吗?

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

显示的图像全是蓝色(不透明),并且图像完全透明。

【问题讨论】:

    标签: c++ opencv visualization


    【解决方案1】:

    有很多方法可以做到这一点。一种可能的方法是访问和修改每个单独的像素。假设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;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 2023-03-08
        相关资源
        最近更新 更多