我想要通过将每个像素着色为红绿色或蓝色来分割图像。我已经计算了每个像素的置信度分数,并且想要调整像素的α透明度以反映置信度,即低置信度意味着几乎透明。有没有办法在OpenCV中执行此操作?如果没有,任何人都可以建议一个微创图书馆(C ++)?
我尝试使用Aurellius建议的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);
显示的图像全部为蓝色(无透明度),图像完全透明。
答案 0 :(得分:5)
有很多方法可以实现这一目标。一种可能的方式是访问和修改每个单独的像素。假设image
是一个四通道,8位cv::Mat
:
auto& pixel = image.at<cv::Vec4b>(i,j);
pixel[3] = confidence;
其中i
和j
是图片中像素的索引。
还有其他方法可能更优雅,但它们将取决于您当前的代码。
<强>更新强>
您描述的行为是可以预期的。 Apparently cv::imshow()
不支持透明度。这就解释了为什么您显示的图像都是蓝色的。
对于保存的图像,请务必记住图像的类型为CV_8UC4
。这意味着每个通道元素都存储为uchar
。分配值0.5
将截断为零,因此保存完全透明的图像。
如果您的置信度是[0,1]
范围内的浮点值,请将其缩放255以将其置于8位图像支持的范围内。因此,
v[3] = 0.5;
变为
v[3] = 0.5 * 255;
答案 1 :(得分: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.
为此,我建议您查看this文档文章。希望这会有所帮助。