Aly*_*Aly 5 c++ opencv visualization
我有一个图像,我试图通过着色每个像素红色绿色或蓝色来分割.我已计算出每个像素的置信度分数,并希望调整像素的Alpha透明度以反映置信度,即低置信度意味着几乎透明.有没有办法在OpenCV中执行此操作?如果没有,任何人都可以建议微创图书馆(C++)?
我尝试使用MatAurellius建议的4通道8位,这里是代码:
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);
Run Code Online (Sandbox Code Playgroud)
显示的图像全部为蓝色(无透明度),图像完全透明.
有很多方法可以实现这一目标.一种可能的方式是访问和修改每个单独的像素.假设image是一个四通道,8位cv::Mat:
auto& pixel = image.at<cv::Vec4b>(i,j);
pixel[3] = confidence;
Run Code Online (Sandbox Code Playgroud)
其中i和j是图像中像素的索引.
还有其他方法可能更优雅,但它们将取决于您当前的代码.
更新:
您描述的行为是预期的.显然 cv::imshow()不支持透明度.这解释了为什么您显示的图像全部为蓝色.
至于保存的图像,重要的是要记住图像是类型的CV_8UC4.这意味着每个通道元素都存储为uchar.赋值0.5将截断为零,因此保存完全透明的图像.
如果置信度是范围内的浮点值,则将其[0,1]缩放255以将其置于8位图像支持的范围内.从而,
v[3] = 0.5;
Run Code Online (Sandbox Code Playgroud)
变
v[3] = 0.5 * 255;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15960 次 |
| 最近记录: |