首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV:如何设置像素的alpha透明度

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

Stack Overflow用户
提问于 2013-04-24 23:40:23
回答 2查看 17.5K关注 0票数 6

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

我试过使用奥雷利乌斯建议的4通道8位Mat,代码如下:

代码语言:javascript
复制
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);

显示的图像完全是蓝色的(没有透明度),图像是完全透明的。

EN

回答 2

Stack Overflow用户

发布于 2013-04-24 23:56:32

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

代码语言:javascript
复制
auto& pixel = image.at<cv::Vec4b>(i,j);
pixel[3] = confidence;

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

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

更新:你描述的行为是意料之中的。Apparently cv::imshow()不支持透明度。这就解释了为什么您显示的图像都是蓝色的。

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

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

代码语言:javascript
复制
v[3] = 0.5;

变成了

代码语言:javascript
复制
v[3] = 0.5 * 255;
票数 5
EN

Stack Overflow用户

发布于 2013-04-26 18:52:28

我也遇到过同样的问题,但当我绘制透明形状并通过混合图像来解决它时。我在OpenCV的文档中找到了这个

代码语言:javascript
复制
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文档文章。希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16196312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档