gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:46 27 4
gpt4 key购买 nike

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

我已经尝试按照 Aurellius 的建议使用 4 channel 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);

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

最佳答案

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

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

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

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

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

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

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

v[3] = 0.5;

成为

v[3] = 0.5 * 255;

关于c++ - OpenCV:如何设置像素的 alpha 透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16196312/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com